diff --git a/.github/workflows/check-change-note.yml b/.github/workflows/check-change-note.yml index e951b17b89b..aa255d4cf5a 100644 --- a/.github/workflows/check-change-note.yml +++ b/.github/workflows/check-change-note.yml @@ -8,6 +8,7 @@ on: - "*/ql/src/**/*.qll" - "*/ql/lib/**/*.ql" - "*/ql/lib/**/*.qll" + - "*/ql/lib/**/*.yml" - "!**/experimental/**" - "!ql/**" - "!swift/**" diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml index 6bdee05d6a1..9805fb44f48 100644 --- a/.github/workflows/close-stale.yml +++ b/.github/workflows/close-stale.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale@v7 + - uses: actions/stale@v8 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'This issue is stale because it has been open 14 days with no activity. Comment or remove the `Stale` label in order to avoid having this issue closed in 7 days.' diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 6fdd497a802..da064fce148 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -48,6 +48,9 @@ jobs: run: | brew install gnu-tar echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH + - name: Install cargo-cross + if: runner.os == 'Linux' + run: cargo install cross --version 0.2.1 - uses: ./.github/actions/os-version id: os_version - name: Cache entire extractor @@ -78,8 +81,13 @@ jobs: - name: Run tests if: steps.cache-extractor.outputs.cache-hit != 'true' run: cd extractor && cargo test --verbose - - name: Release build - if: steps.cache-extractor.outputs.cache-hit != 'true' + # On linux, build the extractor via cross in a centos7 container. + # This ensures we don't depend on glibc > 2.17. + - name: Release build (linux) + if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os == 'Linux' + run: cd extractor && cross build --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'}} @@ -227,3 +235,54 @@ jobs: shell: bash run: | codeql database analyze --search-path "${{ runner.temp }}/ruby-bundle" --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls + + # This is a copy of the 'test' job that runs in a centos7 container. + # This tests that the extractor works correctly on systems with an old glibc. + test-centos7: + defaults: + run: + working-directory: ${{ github.workspace }} + strategy: + fail-fast: false + runs-on: ubuntu-latest + container: + image: centos:centos7 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + needs: [package] + steps: + - name: Install gh cli + run: | + yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo + # fetch-codeql requires unzip and jq + # jq is available in epel-release (https://docs.fedoraproject.org/en-US/epel/) + yum install -y gh unzip epel-release + yum install -y jq + - uses: actions/checkout@v3 + - name: Fetch CodeQL + uses: ./.github/actions/fetch-codeql + + # Due to a bug in Actions, we can't use runner.temp in the run blocks here. + # https://github.com/actions/runner/issues/2185 + + - name: Download Ruby bundle + uses: actions/download-artifact@v3 + with: + name: codeql-ruby-bundle + path: ${{ runner.temp }} + - name: Unzip Ruby bundle + shell: bash + run: unzip -q -d "$RUNNER_TEMP"/ruby-bundle "$RUNNER_TEMP"/codeql-ruby-bundle.zip + + - name: Run QL test + shell: bash + run: | + codeql test run --search-path "$RUNNER_TEMP"/ruby-bundle --additional-packs "$RUNNER_TEMP"/ruby-bundle ruby/ql/test/library-tests/ast/constants/ + - name: Create database + shell: bash + run: | + codeql database create --search-path "$RUNNER_TEMP"/ruby-bundle --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database + - name: Analyze database + shell: bash + run: | + codeql database analyze --search-path "$RUNNER_TEMP"/ruby-bundle --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 42a379734a1..cc4e0d9c1e2 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,46 @@ +## 0.6.0 + +### Breaking Changes + +* The `semmle.code.cpp.commons.Buffer` and `semmle.code.cpp.commons.NullTermination` libraries no longer expose `semmle.code.cpp.dataflow.DataFlow`. Please import `semmle.code.cpp.dataflow.DataFlow` directly. + +### Deprecated APIs + +* The `WriteConfig` taint tracking configuration has been deprecated. Please use `WriteFlow`. + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* A new C/C++ dataflow library (`semmle.code.cpp.dataflow.new.DataFlow`) has been added. + The new library behaves much more like the dataflow library of other CodeQL supported + languages by following use-use dataflow paths instead of def-use dataflow paths. + The new library also better supports dataflow through indirections, and new predicates + such as `Node::asIndirectExpr` have been added to facilitate working with indirections. + + The `semmle.code.cpp.ir.dataflow.DataFlow` library is now identical to the new + `semmle.code.cpp.dataflow.new.DataFlow` library. +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `hasGeneratedCopyConstructor` and `hasGeneratedCopyAssignmentOperator` predicates from the `Folder` class. +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getMustlockFunction`, `getTrylockFunction`, `getLockFunction`, and `getUnlockFunction` predicates from the `MutexType` class. +* Deleted the deprecated `getPosInBasicBlock` predicate from the `SubBasicBlock` class. +* Deleted the deprecated `getExpr` predicate from the `PointerDereferenceExpr` class. +* Deleted the deprecated `getUseInstruction` and `getDefinitionInstruction` predicates from the `Operand` class. +* Deleted the deprecated `isInParameter`, `isInParameterPointer`, and `isInQualifier` predicates from the `FunctionInput` class. +* Deleted the deprecated `isOutParameterPointer`, `isOutQualifier`, `isOutReturnValue`, and `isOutReturnPointer` predicate from the `FunctionOutput` class. +* Deleted the deprecated 3-argument `isGuardPhi` predicate from the `RangeSsaDefinition` class. + ## 0.5.4 No user-facing changes. diff --git a/cpp/ql/lib/change-notes/2023-02-10-buffer-and-nill-termination-dataflow.md b/cpp/ql/lib/change-notes/2023-02-10-buffer-and-nill-termination-dataflow.md deleted file mode 100644 index adc00f952f9..00000000000 --- a/cpp/ql/lib/change-notes/2023-02-10-buffer-and-nill-termination-dataflow.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: breaking ---- -* The `semmle.code.cpp.commons.Buffer` and `semmle.code.cpp.commons.NullTermination` libraries no longer expose `semmle.code.cpp.dataflow.DataFlow`. Please import `semmle.code.cpp.dataflow.DataFlow` directly. diff --git a/cpp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/cpp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/cpp/ql/lib/change-notes/2023-03-03-delete-deps.md b/cpp/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index 03efda07926..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `hasGeneratedCopyConstructor` and `hasGeneratedCopyAssignmentOperator` predicates from the `Folder` class. -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. -* Deleted the deprecated `getMustlockFunction`, `getTrylockFunction`, `getLockFunction`, and `getUnlockFunction` predicates from the `MutexType` class. -* Deleted the deprecated `getPosInBasicBlock` predicate from the `SubBasicBlock` class. -* Deleted the deprecated `getExpr` predicate from the `PointerDereferenceExpr` class. -* Deleted the deprecated `getUseInstruction` and `getDefinitionInstruction` predicates from the `Operand` class. -* Deleted the deprecated `isInParameter`, `isInParameterPointer`, and `isInQualifier` predicates from the `FunctionInput` class. -* Deleted the deprecated `isOutParameterPointer`, `isOutQualifier`, `isOutReturnValue`, and `isOutReturnPointer` predicate from the `FunctionOutput` class. -* Deleted the deprecated 3-argument `isGuardPhi` predicate from the `RangeSsaDefinition` class. diff --git a/cpp/ql/lib/change-notes/2023-03-08-deprecated-dataflow-configurations.md b/cpp/ql/lib/change-notes/2023-03-08-deprecated-dataflow-configurations.md deleted file mode 100644 index 124dc73213a..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-08-deprecated-dataflow-configurations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `WriteConfig` taint tracking configuration has been deprecated. Please use `WriteFlow`. diff --git a/cpp/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/cpp/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/cpp/ql/lib/change-notes/2023-03-16-use-use-flow.md b/cpp/ql/lib/change-notes/2023-03-16-use-use-flow.md deleted file mode 100644 index a643fd50b7d..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-16-use-use-flow.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -category: majorAnalysis ---- -* A new C/C++ dataflow library (`semmle.code.cpp.dataflow.new.DataFlow`) has been added. - The new library behaves much more like the dataflow library of other CodeQL supported - languages by following use-use dataflow paths instead of def-use dataflow paths. - The new library also better supports dataflow through indirections, and new predicates - such as `Node::asIndirectExpr` have been added to facilitate working with indirections. - - The `semmle.code.cpp.ir.dataflow.DataFlow` library is now identical to the new - `semmle.code.cpp.dataflow.new.DataFlow` library. diff --git a/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md b/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md index b4389ba5b59..a9d2a4d2c80 100644 --- a/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md +++ b/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md @@ -1,4 +1,4 @@ --- category: deprecated --- -* The `SslContextCallAbstractConfig`, `SslContextCallConfig`, `SslContextCallBannedProtocolConfig`, `SslContextCallTls12ProtocolConfig`, `SslContextCallTls13ProtocolConfig`, `SslContextCallTlsProtocolConfig`, `SslContextFlowsToSetOptionConfig`, `SslOptionConfig` dataflow configurations from `BoostorgAsio` have been deprecated. Please use `SslContextCallConfigSig`, `SslContextCallMake`, `SslContextCallFlow`, `SslContextCallBannedProtocolFlow`, `SslContextCallTls12ProtocolFlow`, `SslContextCallTls13ProtocolFlow`, `SslContextCallTlsProtocolFlow`, `SslContextFlowsToSetOptionFlow`. +* The `SslContextCallAbstractConfig`, `SslContextCallConfig`, `SslContextCallBannedProtocolConfig`, `SslContextCallTls12ProtocolConfig`, `SslContextCallTls13ProtocolConfig`, `SslContextCallTlsProtocolConfig`, `SslContextFlowsToSetOptionConfig`, `SslOptionConfig` dataflow configurations from `BoostorgAsio` have been deprecated. Please use `SslContextCallConfigSig`, `SslContextCallGlobal`, `SslContextCallFlow`, `SslContextCallBannedProtocolFlow`, `SslContextCallTls12ProtocolFlow`, `SslContextCallTls13ProtocolFlow`, `SslContextCallTlsProtocolFlow`, `SslContextFlowsToSetOptionFlow`. diff --git a/cpp/ql/lib/change-notes/2023-03-21-buffer-access.md b/cpp/ql/lib/change-notes/2023-03-21-buffer-access.md new file mode 100644 index 00000000000..7b2b6bad0dc --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-03-21-buffer-access.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `BufferAccess` library (`semmle.code.cpp.security.BufferAccess`) no longer matches buffer accesses inside unevaluated contexts (such as inside `sizeof` or `decltype` expressions). As a result, queries using this library may see fewer false positives. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/cpp/ql/lib/change-notes/released/0.6.0.md b/cpp/ql/lib/change-notes/released/0.6.0.md new file mode 100644 index 00000000000..2ae831d8f9a --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.6.0.md @@ -0,0 +1,42 @@ +## 0.6.0 + +### Breaking Changes + +* The `semmle.code.cpp.commons.Buffer` and `semmle.code.cpp.commons.NullTermination` libraries no longer expose `semmle.code.cpp.dataflow.DataFlow`. Please import `semmle.code.cpp.dataflow.DataFlow` directly. + +### Deprecated APIs + +* The `WriteConfig` taint tracking configuration has been deprecated. Please use `WriteFlow`. + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* A new C/C++ dataflow library (`semmle.code.cpp.dataflow.new.DataFlow`) has been added. + The new library behaves much more like the dataflow library of other CodeQL supported + languages by following use-use dataflow paths instead of def-use dataflow paths. + The new library also better supports dataflow through indirections, and new predicates + such as `Node::asIndirectExpr` have been added to facilitate working with indirections. + + The `semmle.code.cpp.ir.dataflow.DataFlow` library is now identical to the new + `semmle.code.cpp.dataflow.new.DataFlow` library. +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `hasGeneratedCopyConstructor` and `hasGeneratedCopyAssignmentOperator` predicates from the `Folder` class. +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getMustlockFunction`, `getTrylockFunction`, `getLockFunction`, and `getUnlockFunction` predicates from the `MutexType` class. +* Deleted the deprecated `getPosInBasicBlock` predicate from the `SubBasicBlock` class. +* Deleted the deprecated `getExpr` predicate from the `PointerDereferenceExpr` class. +* Deleted the deprecated `getUseInstruction` and `getDefinitionInstruction` predicates from the `Operand` class. +* Deleted the deprecated `isInParameter`, `isInParameterPointer`, and `isInQualifier` predicates from the `FunctionInput` class. +* Deleted the deprecated `isOutParameterPointer`, `isOutQualifier`, `isOutReturnValue`, and `isOutReturnPointer` predicate from the `FunctionOutput` class. +* Deleted the deprecated 3-argument `isGuardPhi` predicate from the `RangeSsaDefinition` class. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index cd3f72e2513..a3f820f884d 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.6.0 diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll index 416bf4b04f8..e733940bdc1 100644 --- a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll +++ b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll @@ -54,7 +54,7 @@ module PrivateCleartextWrite { predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } } - module WriteFlow = TaintTracking::Make; + module WriteFlow = TaintTracking::Global; class PrivateDataSource extends Source { PrivateDataSource() { this.getExpr() instanceof PrivateDataExpr } diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll index ce3f4ed90b4..b86db02702c 100644 --- a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll @@ -250,16 +250,26 @@ SemType getSemanticType(Specific::Type type) { Specific::unknownType(type) and result = TSemUnknownType() } +private class SemNumericOrBooleanType extends SemSizedType { + SemNumericOrBooleanType() { + this instanceof SemNumericType + or + this instanceof SemBooleanType + } +} + /** * Holds if the conversion from `fromType` to `toType` can never overflow or underflow. */ -predicate conversionCannotOverflow(SemNumericType fromType, SemNumericType toType) { +predicate conversionCannotOverflow(SemNumericOrBooleanType fromType, SemNumericOrBooleanType toType) { // Identity cast fromType = toType or // Treat any cast to an FP type as safe. It can lose precision, but not overflow. toType instanceof SemFloatingPointType and fromType = any(SemNumericType n) or + fromType instanceof SemBooleanType and toType instanceof SemIntegerType + or exists(SemIntegerType fromInteger, SemIntegerType toInteger, int fromSize, int toSize | fromInteger = fromType and toInteger = toType and diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 8e6602b6634..12ad778c119 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.5.5-dev +version: 0.6.1-dev 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 617362ab4f0..865d7b4d6ce 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); 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 c47b0308855..39dbf8dc075 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} 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 617362ab4f0..865d7b4d6ce 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 @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); 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 c47b0308855..39dbf8dc075 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 @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll index 2c288b6d3da..e21a83fcb54 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll @@ -103,7 +103,7 @@ private module DefaultTaintTrackingConfig implements DataFlow::ConfigSig { } } -private module DefaultTaintTrackingFlow = TaintTracking::Make; +private module DefaultTaintTrackingFlow = TaintTracking::Global; private module ToGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source = getNodeForSource(_) } @@ -121,13 +121,13 @@ private module ToGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { predicate isBarrierIn(DataFlow::Node node) { nodeIsBarrierIn(node) } } -private module ToGlobalVarTaintTrackingFlow = TaintTracking::Make; +private module ToGlobalVarTaintTrackingFlow = TaintTracking::Global; private module FromGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { // This set of sources should be reasonably small, which is good for // performance since the set of sinks is very large. - ToGlobalVarTaintTrackingFlow::hasFlowTo(source) + ToGlobalVarTaintTrackingFlow::flowTo(source) } predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) } @@ -145,7 +145,7 @@ private module FromGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { } private module FromGlobalVarTaintTrackingFlow = - TaintTracking::Make; + TaintTracking::Global; private predicate readsVariable(LoadInstruction load, Variable var) { load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var @@ -331,7 +331,7 @@ private import Cached cached predicate tainted(Expr source, Element tainted) { exists(DataFlow::Node sink | - DefaultTaintTrackingFlow::hasFlow(getNodeForSource(source), sink) and + DefaultTaintTrackingFlow::flow(getNodeForSource(source), sink) and tainted = adjustedSink(sink) ) } @@ -360,8 +360,8 @@ predicate taintedIncludingGlobalVars(Expr source, Element tainted, string global DataFlow::VariableNode variableNode, GlobalOrNamespaceVariable global, DataFlow::Node sink | global = variableNode.getVariable() and - ToGlobalVarTaintTrackingFlow::hasFlow(getNodeForSource(source), variableNode) and - FromGlobalVarTaintTrackingFlow::hasFlow(variableNode, sink) and + ToGlobalVarTaintTrackingFlow::flow(getNodeForSource(source), variableNode) and + FromGlobalVarTaintTrackingFlow::flow(variableNode, sink) and tainted = adjustedSink(sink) and global = globalVarFromId(globalVar) ) @@ -450,7 +450,7 @@ module TaintedWithPath { predicate isBarrierIn(DataFlow::Node node) { nodeIsBarrierIn(node) } } - private module AdjustedFlow = TaintTracking::Make; + private module AdjustedFlow = TaintTracking::Global; /* * A sink `Element` may map to multiple `DataFlowX::PathNode`s via (the @@ -472,7 +472,7 @@ module TaintedWithPath { // that makes it easiest to deal with the case where source = sink. TEndpointPathNode(Element e) { exists(DataFlow::Node sourceNode, DataFlow::Node sinkNode | - AdjustedFlow::hasFlow(sourceNode, sinkNode) + AdjustedFlow::flow(sourceNode, sinkNode) | sourceNode = getNodeForExpr(e) and exists(TaintTrackingConfiguration ttCfg | ttCfg.isSource(e)) @@ -634,7 +634,7 @@ module TaintedWithPath { exists(DataFlow::Node flowSource, DataFlow::Node flowSink | source = sourceNode.(InitialPathNode).inner() and flowSource = getNodeForExpr(source) and - AdjustedFlow::hasFlow(flowSource, flowSink) and + AdjustedFlow::flow(flowSource, flowSink) and tainted = adjustedSink(flowSink) and tainted = sinkNode.(FinalPathNode).inner() ) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} diff --git a/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll b/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll index faeb859506d..e52babcfe2e 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll @@ -14,6 +14,8 @@ int getPointedSize(Type t) { * BufferWrite differ. */ abstract class BufferAccess extends Expr { + BufferAccess() { not this.isUnevaluated() } + abstract string getName(); /** diff --git a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll index 6a0841e13e2..8668ecf078c 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll @@ -394,12 +394,12 @@ module BoostorgAsio { * Constructs a standard data flow computation for protocol values to the first argument * of a context constructor. */ - module SslContextCallMake { + module SslContextCallGlobal { private module C implements DataFlow::ConfigSig { import Config } - import DataFlow::Make + import DataFlow::Global } /** @@ -428,7 +428,7 @@ module BoostorgAsio { } } - module SslContextCallFlow = SslContextCallMake; + module SslContextCallFlow = SslContextCallGlobal; /** * A banned protocol value that flows to the first argument of a context constructor. @@ -458,7 +458,8 @@ module BoostorgAsio { } } - module SslContextCallBannedProtocolFlow = SslContextCallMake; + module SslContextCallBannedProtocolFlow = + SslContextCallGlobal; /** * A TLS 1.2 protocol value that flows to the first argument of a context constructor. @@ -488,7 +489,7 @@ module BoostorgAsio { } } - module SslContextCallTls12ProtocolFlow = SslContextCallMake; + module SslContextCallTls12ProtocolFlow = SslContextCallGlobal; /** * A TLS 1.3 protocol value that flows to the first argument of a context constructor. @@ -518,7 +519,7 @@ module BoostorgAsio { } } - module SslContextCallTls13ProtocolFlow = SslContextCallMake; + module SslContextCallTls13ProtocolFlow = SslContextCallGlobal; /** * A generic TLS protocol value that flows to the first argument of a context constructor. @@ -548,7 +549,7 @@ module BoostorgAsio { } } - module SslContextCallTlsProtocolFlow = SslContextCallMake; + module SslContextCallTlsProtocolFlow = SslContextCallGlobal; /** * A context constructor call that flows to a call to `SetOptions()`. @@ -596,7 +597,7 @@ module BoostorgAsio { } } - module SslContextFlowsToSetOptionFlow = DataFlow::Make; + module SslContextFlowsToSetOptionFlow = DataFlow::Global; /** * An option value that flows to the first parameter of a call to `SetOptions()`. @@ -640,5 +641,5 @@ module BoostorgAsio { } } - module SslOptionFlow = DataFlow::Make; + module SslOptionFlow = DataFlow::Global; } diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 2024538e99c..510cd92b275 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.5.5 + +### Deprecated Queries + +* The `NetworkToBufferSizeConfiguration` and `UntrustedDataToExternalApiConfig` dataflow configurations have been deprecated. Please use `NetworkToBufferSizeFlow` and `UntrustedDataToExternalApiFlow`. +* The `LeapYearCheckConfiguration`, `FiletimeYearArithmeticOperationCheckConfiguration`, and `PossibleYearArithmeticOperationCheckConfiguration` dataflow configurations have been deprecated. Please use `LeapYearCheckFlow`, `FiletimeYearArithmeticOperationCheckFlow` and `PossibleYearArithmeticOperationCheckFlow`. + ## 0.5.4 No user-facing changes. diff --git a/cpp/ql/src/Critical/OverflowDestination.ql b/cpp/ql/src/Critical/OverflowDestination.ql index 39ce527e08a..4cfaaf8981b 100644 --- a/cpp/ql/src/Critical/OverflowDestination.ql +++ b/cpp/ql/src/Critical/OverflowDestination.ql @@ -84,11 +84,11 @@ module OverflowDestinationConfig implements DataFlow::ConfigSig { } } -module OverflowDestination = TaintTracking::Make; +module OverflowDestination = TaintTracking::Global; from FunctionCall fc, OverflowDestination::PathNode source, OverflowDestination::PathNode sink where - OverflowDestination::hasFlowPath(source, sink) and + OverflowDestination::flowPath(source, sink) and sourceSized(fc, sink.getNode().asIndirectConvertedExpr()) select fc, source, sink, "To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size." diff --git a/cpp/ql/src/Critical/OverflowStatic.ql b/cpp/ql/src/Critical/OverflowStatic.ql index 962d2ee89b0..13a4fb6bcb7 100644 --- a/cpp/ql/src/Critical/OverflowStatic.ql +++ b/cpp/ql/src/Critical/OverflowStatic.ql @@ -22,7 +22,8 @@ import LoopBounds private predicate staticBufferBase(VariableAccess access, Variable v) { v.getType().(ArrayType).getBaseType() instanceof CharType and access = v.getAnAccess() and - not memberMayBeVarSize(_, v) + not memberMayBeVarSize(_, v) and + not access.isUnevaluated() } predicate staticBuffer(VariableAccess access, Variable v, int size) { diff --git a/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql b/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql index 03f622855ab..79a5d530c21 100644 --- a/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql +++ b/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql @@ -80,9 +80,9 @@ predicate introducesNewField(Class derived, Class base) { ) } -module CastToPointerArithFlow = DataFlow::MakeWithState; +module CastToPointerArithFlow = DataFlow::GlobalWithState; from CastToPointerArithFlow::PathNode source, CastToPointerArithFlow::PathNode sink -where CastToPointerArithFlow::hasFlowPath(source, sink) +where CastToPointerArithFlow::flowPath(source, sink) select sink, source, sink, "This pointer arithmetic may be done with the wrong type because of $@.", source, "this cast" diff --git a/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql b/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql index 2b2e9f6bf8b..65454332ab1 100644 --- a/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql +++ b/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql @@ -146,13 +146,13 @@ module NonConstFlowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { isBarrierNode(node) } } -module NonConstFlow = TaintTracking::Make; +module NonConstFlow = TaintTracking::Global; from FormattingFunctionCall call, Expr formatString where call.getArgument(call.getFormatParameterIndex()) = formatString and exists(DataFlow::Node sink | - NonConstFlow::hasFlowTo(sink) and + NonConstFlow::flowTo(sink) and isSinkImpl(sink, formatString) ) select formatString, diff --git a/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql b/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql index fe6581340de..71aa97c0ae5 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql @@ -16,7 +16,7 @@ import LeapYear from Expr source, Expr sink where - PossibleYearArithmeticOperationCheckFlow::hasFlow(DataFlow::exprNode(source), + PossibleYearArithmeticOperationCheckFlow::flow(DataFlow::exprNode(source), DataFlow::exprNode(sink)) select sink, "An arithmetic operation $@ that uses a constant value of 365 ends up modifying this date/time, without considering leap year scenarios.", diff --git a/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll b/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll index a838f4c6a0d..7a375e7b107 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll +++ b/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll @@ -231,7 +231,7 @@ private module LeapYearCheckConfig implements DataFlow::ConfigSig { } } -module LeapYearCheckFlow = DataFlow::Make; +module LeapYearCheckFlow = DataFlow::Global; /** * Data flow configuration for finding an operation with hardcoded 365 that will flow into @@ -284,7 +284,7 @@ private module FiletimeYearArithmeticOperationCheckConfig implements DataFlow::C } module FiletimeYearArithmeticOperationCheckFlow = - DataFlow::Make; + DataFlow::Global; /** * Taint configuration for finding an operation with hardcoded 365 that will flow into any known date/time field. @@ -372,4 +372,4 @@ private module PossibleYearArithmeticOperationCheckConfig implements DataFlow::C } module PossibleYearArithmeticOperationCheckFlow = - TaintTracking::Make; + TaintTracking::Global; diff --git a/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql b/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql index f85270d523e..03570b3611c 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql @@ -31,16 +31,14 @@ where // If there is a data flow from the variable that was modified to a function that seems to check for leap year exists(VariableAccess source, ChecksForLeapYearFunctionCall fc | source = var.getAnAccess() and - LeapYearCheckFlow::hasFlow(DataFlow::exprNode(source), - DataFlow::exprNode(fc.getAnArgument())) + LeapYearCheckFlow::flow(DataFlow::exprNode(source), DataFlow::exprNode(fc.getAnArgument())) ) or // If there is a data flow from the field that was modified to a function that seems to check for leap year exists(VariableAccess vacheck, YearFieldAccess yfacheck, ChecksForLeapYearFunctionCall fc | vacheck = var.getAnAccess() and yfacheck.getQualifier() = vacheck and - LeapYearCheckFlow::hasFlow(DataFlow::exprNode(yfacheck), - DataFlow::exprNode(fc.getAnArgument())) + LeapYearCheckFlow::flow(DataFlow::exprNode(yfacheck), DataFlow::exprNode(fc.getAnArgument())) ) or // If there is a successor or predecessor that sets the month = 1 diff --git a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql index c23eda355c4..38ecd4183ff 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql @@ -12,5 +12,5 @@ import cpp import NtohlArrayNoBound from DataFlow::Node source, DataFlow::Node sink -where NetworkToBufferSizeFlow::hasFlow(source, sink) +where NetworkToBufferSizeFlow::flow(source, sink) select sink, "Unchecked use of data from network function $@.", source, source.toString() diff --git a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll index e3b095d74dd..1bd90084c67 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll +++ b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll @@ -161,4 +161,4 @@ private module NetworkToBufferSizeConfig implements DataFlow::ConfigSig { } } -module NetworkToBufferSizeFlow = DataFlow::Make; +module NetworkToBufferSizeFlow = DataFlow::Global; diff --git a/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql b/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql index e7baf96615e..61989db1c6e 100644 --- a/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql +++ b/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql @@ -25,17 +25,17 @@ module ExistsAnyFlowConfig implements DataFlow::ConfigSig { } } -module ExistsAnyFlow = DataFlow::Make; +module ExistsAnyFlow = DataFlow::Global; bindingset[flag] predicate isOptionSet(ConstructorCall cc, int flag, FunctionCall fcSetOptions) { exists(VariableAccess contextSetOptions | - ExistsAnyFlow::hasFlow(DataFlow::exprNode(cc), DataFlow::exprNode(contextSetOptions)) and + ExistsAnyFlow::flow(DataFlow::exprNode(cc), DataFlow::exprNode(contextSetOptions)) and exists(BoostorgAsio::SslSetOptionsFunction f | f.getACallToThisFunction() = fcSetOptions | contextSetOptions = fcSetOptions.getQualifier() and forall(Expr optionArgument, Expr optionArgumentSource | optionArgument = fcSetOptions.getArgument(0) and - BoostorgAsio::SslOptionFlow::hasFlow(DataFlow::exprNode(optionArgumentSource), + BoostorgAsio::SslOptionFlow::flow(DataFlow::exprNode(optionArgumentSource), DataFlow::exprNode(optionArgument)) | optionArgument.getValue().toInt().bitShiftRight(16).bitAnd(flag) = flag @@ -49,7 +49,7 @@ predicate isOptionNotSet(ConstructorCall cc, int flag) { not isOptionSet(cc, fla from Expr protocolSource, Expr protocolSink, ConstructorCall cc, Expr e, string msg where - BoostorgAsio::SslContextCallTlsProtocolFlow::hasFlow(DataFlow::exprNode(protocolSource), + BoostorgAsio::SslContextCallTlsProtocolFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) and cc.getArgument(0) = protocolSink and ( diff --git a/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql b/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql index 140cf8e2ccf..4df70695179 100644 --- a/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql +++ b/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql @@ -14,12 +14,12 @@ import semmle.code.cpp.security.boostorg.asio.protocols from Expr protocolSource, Expr protocolSink, ConstructorCall cc where - BoostorgAsio::SslContextCallFlow::hasFlow(DataFlow::exprNode(protocolSource), + BoostorgAsio::SslContextCallFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) and - not BoostorgAsio::SslContextCallTlsProtocolFlow::hasFlow(DataFlow::exprNode(protocolSource), + not BoostorgAsio::SslContextCallTlsProtocolFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) and cc.getArgument(0) = protocolSink and - BoostorgAsio::SslContextCallBannedProtocolFlow::hasFlow(DataFlow::exprNode(protocolSource), + BoostorgAsio::SslContextCallBannedProtocolFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) select protocolSink, "Usage of $@ specifying a deprecated hardcoded protocol $@ in function $@.", cc, "boost::asio::ssl::context::context", protocolSource, protocolSource.toString(), diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll index 6d6f17daf0e..70247bdf4a4 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll @@ -10,10 +10,10 @@ import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::hasFlow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ - DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::hasFlow(result, this) } + DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } } /** DEPRECATED: Alias for UntrustedExternalApiDataNode */ diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll index d2ab4f0309f..2505f718bc6 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll @@ -73,4 +73,4 @@ private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } -module UntrustedDataToExternalApiFlow = TaintTracking::Make; +module UntrustedDataToExternalApiFlow = TaintTracking::Global; diff --git a/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql index d16ce6376dd..432f47f6735 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql @@ -16,7 +16,7 @@ import semmle.code.cpp.security.FlowSources import UntrustedDataToExternalApiFlow::PathGraph from UntrustedDataToExternalApiFlow::PathNode source, UntrustedDataToExternalApiFlow::PathNode sink -where UntrustedDataToExternalApiFlow::hasFlowPath(source, sink) +where UntrustedDataToExternalApiFlow::flowPath(source, sink) select sink, source, sink, "Call to " + sink.getNode().(ExternalApiDataNode).getExternalFunction().toString() + " with untrusted data from $@.", source, source.getNode().(RemoteFlowSource).getSourceType() diff --git a/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql index a00accd4d29..1cfd0a7132f 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql @@ -15,7 +15,7 @@ import ExternalAPIs import UntrustedDataToExternalApiFlow::PathGraph from UntrustedDataToExternalApiFlow::PathNode source, UntrustedDataToExternalApiFlow::PathNode sink -where UntrustedDataToExternalApiFlow::hasFlowPath(source, sink) +where UntrustedDataToExternalApiFlow::flowPath(source, sink) select sink, source, sink, "Call to " + sink.getNode().(ExternalApiDataNode).getExternalFunction().toString() + " with untrusted data from $@.", source, source.toString() diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll index 6d6f17daf0e..70247bdf4a4 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll @@ -10,10 +10,10 @@ import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::hasFlow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ - DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::hasFlow(result, this) } + DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } } /** DEPRECATED: Alias for UntrustedExternalApiDataNode */ diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll index 4dd077f24ce..93da5497a22 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll @@ -63,4 +63,4 @@ private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } -module UntrustedDataToExternalApiFlow = TaintTracking::Make; +module UntrustedDataToExternalApiFlow = TaintTracking::Global; diff --git a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql b/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql index 89d8f975680..4e626d0bc77 100644 --- a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql +++ b/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql @@ -90,7 +90,7 @@ module TaintedPathConfig implements DataFlow::ConfigSig { } } -module TaintedPath = TaintTracking::Make; +module TaintedPath = TaintTracking::Global; from FileFunction fileFunction, Expr taintedArg, FlowSource taintSource, @@ -98,7 +98,7 @@ from where taintedArg = sinkNode.getNode().asIndirectArgument() and fileFunction.outermostWrapperFunctionCall(taintedArg, callChain) and - TaintedPath::hasFlowPath(sourceNode, sinkNode) and + TaintedPath::flowPath(sourceNode, sinkNode) and taintSource = sourceNode.getNode() select taintedArg, sourceNode, sinkNode, "This argument to a file access function is derived from $@ and then passed to " + callChain + ".", diff --git a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql index c7e01e0b983..cc4b748e5dc 100644 --- a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql @@ -76,7 +76,7 @@ class ExecState extends TExecState { DataFlow::Node getOutgoingNode() { result = outgoing } /** Holds if this is a possible `ExecState` for `sink`. */ - predicate isFeasibleForSink(DataFlow::Node sink) { ExecState::hasFlow(outgoing, sink) } + predicate isFeasibleForSink(DataFlow::Node sink) { ExecState::flow(outgoing, sink) } string toString() { result = "ExecState" } } @@ -109,7 +109,7 @@ module ExecStateConfig implements DataFlow::ConfigSig { } } -module ExecState = TaintTracking::Make; +module ExecState = TaintTracking::Global; module ExecTaintConfig implements DataFlow::StateConfigSig { class FlowState = TState; @@ -141,13 +141,13 @@ module ExecTaintConfig implements DataFlow::StateConfigSig { } } -module ExecTaint = TaintTracking::MakeWithState; +module ExecTaint = TaintTracking::GlobalWithState; from ExecTaint::PathNode sourceNode, ExecTaint::PathNode sinkNode, string taintCause, string callChain, DataFlow::Node concatResult, Expr command where - ExecTaint::hasFlowPath(sourceNode, sinkNode) and + ExecTaint::flowPath(sourceNode, sinkNode) and taintCause = sourceNode.getNode().(FlowSource).getSourceType() and isSinkImpl(sinkNode.getNode(), command, callChain) and concatResult = sinkNode.getState().(ExecState).getOutgoingNode() diff --git a/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql b/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql index 598e242b0ef..107be7bddfd 100644 --- a/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql +++ b/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql @@ -114,13 +114,13 @@ module ImproperArrayIndexValidationConfig implements DataFlow::ConfigSig { } } -module ImproperArrayIndexValidation = TaintTracking::Make; +module ImproperArrayIndexValidation = TaintTracking::Global; from ImproperArrayIndexValidation::PathNode source, ImproperArrayIndexValidation::PathNode sink, string sourceType where - ImproperArrayIndexValidation::hasFlowPath(source, sink) and + ImproperArrayIndexValidation::flowPath(source, sink) and isFlowSource(source.getNode(), sourceType) select sink.getNode(), source, sink, "An array indexing expression depends on $@ that might be outside the bounds of the array.", diff --git a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql index a4d37eb4875..54c3b013471 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql @@ -122,7 +122,7 @@ module UncontrolledArithConfig implements DataFlow::ConfigSig { } } -module UncontrolledArith = TaintTracking::Make; +module UncontrolledArith = TaintTracking::Global; /** Gets the expression that corresponds to `node`, if any. */ Expr getExpr(DataFlow::Node node) { result = [node.asExpr(), node.asDefiningArgument()] } @@ -131,7 +131,7 @@ from UncontrolledArith::PathNode source, UncontrolledArith::PathNode sink, VariableAccess va, string effect where - UncontrolledArith::hasFlowPath(source, sink) and + UncontrolledArith::flowPath(source, sink) and sink.getNode().asExpr() = va and missingGuard(va, effect) select sink.getNode(), source, sink, diff --git a/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql b/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql index 4d242890528..740e4ad9e8e 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql @@ -95,14 +95,14 @@ module TaintedAllocationSizeConfig implements DataFlow::ConfigSig { } } -module TaintedAllocationSize = TaintTracking::Make; +module TaintedAllocationSize = TaintTracking::Global; from Expr alloc, TaintedAllocationSize::PathNode source, TaintedAllocationSize::PathNode sink, string taintCause where isFlowSource(source.getNode(), taintCause) and - TaintedAllocationSize::hasFlowPath(source, sink) and + TaintedAllocationSize::flowPath(source, sink) and allocSink(alloc, sink.getNode()) select alloc, source, sink, "This allocation size is derived from $@ and might overflow.", source.getNode(), "user input (" + taintCause + ")" diff --git a/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql b/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql index 34d211a53ae..5eab70c5cc9 100644 --- a/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql +++ b/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql @@ -33,14 +33,14 @@ module VerifyResultConfig implements DataFlow::ConfigSig { } } -module VerifyResult = DataFlow::Make; +module VerifyResult = DataFlow::Global; from DataFlow::Node source, DataFlow::Node sink1, DataFlow::Node sink2, GuardCondition guard, Expr c1, Expr c2, boolean testIsTrue where - VerifyResult::hasFlow(source, sink1) and - VerifyResult::hasFlow(source, sink2) and + VerifyResult::flow(source, sink1) and + VerifyResult::flow(source, sink2) and guard.comparesEq(sink1.asExpr(), c1, 0, false, testIsTrue) and // (value != c1) => testIsTrue guard.comparesEq(sink2.asExpr(), c2, 0, false, testIsTrue) and // (value != c2) => testIsTrue c1.getValue().toInt() = 0 and diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql index d7bb69582d7..f2754c5811f 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql @@ -49,7 +49,7 @@ module ToBufferConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { isSinkImpl(sink, _) } } -module ToBufferFlow = TaintTracking::Make; +module ToBufferFlow = TaintTracking::Global; predicate isSinkImpl(DataFlow::Node sink, SensitiveBufferWrite w) { w.getASource() = sink.asIndirectExpr() @@ -59,7 +59,7 @@ from SensitiveBufferWrite w, ToBufferFlow::PathNode sourceNode, ToBufferFlow::PathNode sinkNode, FlowSource source where - ToBufferFlow::hasFlowPath(sourceNode, sinkNode) and + ToBufferFlow::flowPath(sourceNode, sinkNode) and sourceNode.getNode() = source and isSinkImpl(sinkNode.getNode(), w) select w, sourceNode, sinkNode, diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql index 3c1a78b14c5..c04ceae7ada 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql @@ -33,7 +33,7 @@ module FromSensitiveConfig implements DataFlow::ConfigSig { } } -module FromSensitiveFlow = TaintTracking::Make; +module FromSensitiveFlow = TaintTracking::Global; predicate isSinkImpl(DataFlow::Node sink, FileWrite w, Expr dest) { exists(Expr e | @@ -81,7 +81,7 @@ from SensitiveExpr source, FromSensitiveFlow::PathNode sourceNode, FromSensitiveFlow::PathNode midNode, FileWrite w, Expr dest where - FromSensitiveFlow::hasFlowPath(sourceNode, midNode) and + FromSensitiveFlow::flowPath(sourceNode, midNode) and isSourceImpl(sourceNode.getNode(), source) and isSinkImpl(midNode.getNode(), w, dest) select w, sourceNode, midNode, diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql index a0fb6bd2dac..fa0d2ffd82a 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql @@ -250,13 +250,13 @@ module FromSensitiveConfig implements DataFlow::ConfigSig { } } -module FromSensitiveFlow = TaintTracking::Make; +module FromSensitiveFlow = TaintTracking::Global; /** * A taint flow configuration for flow from a sensitive expression to an encryption operation. */ module ToEncryptionConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { FromSensitiveFlow::hasFlow(source, _) } + predicate isSource(DataFlow::Node source) { FromSensitiveFlow::flow(source, _) } predicate isSink(DataFlow::Node sink) { isSinkEncrypt(sink, _) } @@ -271,7 +271,7 @@ module ToEncryptionConfig implements DataFlow::ConfigSig { } } -module ToEncryptionFlow = TaintTracking::Make; +module ToEncryptionFlow = TaintTracking::Global; /** * A taint flow configuration for flow from an encryption operation to a network operation. @@ -279,25 +279,25 @@ module ToEncryptionFlow = TaintTracking::Make; module FromEncryptionConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { isSinkEncrypt(source, _) } - predicate isSink(DataFlow::Node sink) { FromSensitiveFlow::hasFlowTo(sink) } + predicate isSink(DataFlow::Node sink) { FromSensitiveFlow::flowTo(sink) } predicate isBarrier(DataFlow::Node node) { node.asExpr().getUnspecifiedType() instanceof IntegralType } } -module FromEncryptionFlow = TaintTracking::Make; +module FromEncryptionFlow = TaintTracking::Global; from FromSensitiveFlow::PathNode source, FromSensitiveFlow::PathNode sink, NetworkSendRecv networkSendRecv, string msg where // flow from sensitive -> network data - FromSensitiveFlow::hasFlowPath(source, sink) and + FromSensitiveFlow::flowPath(source, sink) and isSinkSendRecv(sink.getNode(), networkSendRecv) and // no flow from sensitive -> evidence of encryption - not ToEncryptionFlow::hasFlow(source.getNode(), _) and - not FromEncryptionFlow::hasFlowTo(sink.getNode()) and + not ToEncryptionFlow::flow(source.getNode(), _) and + not FromEncryptionFlow::flowTo(sink.getNode()) and // construct result if networkSendRecv instanceof NetworkSend then diff --git a/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql b/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql index 797302be5a4..0c060befeff 100644 --- a/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql +++ b/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql @@ -125,13 +125,13 @@ module FromSensitiveConfig implements DataFlow::ConfigSig { } } -module FromSensitiveFlow = TaintTracking::Make; +module FromSensitiveFlow = TaintTracking::Global; from SensitiveExpr sensitive, FromSensitiveFlow::PathNode source, FromSensitiveFlow::PathNode sink, SqliteFunctionCall sqliteCall where - FromSensitiveFlow::hasFlowPath(source, sink) and + FromSensitiveFlow::flowPath(source, sink) and isSourceImpl(source.getNode(), sensitive) and isSinkImpl(sink.getNode(), sqliteCall, _) select sqliteCall, source, sink, diff --git a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql index ceddfbf9f40..423ed57dd98 100644 --- a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql +++ b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql @@ -89,10 +89,10 @@ module HttpStringToUrlOpenConfig implements DataFlow::ConfigSig { } } -module HttpStringToUrlOpen = TaintTracking::Make; +module HttpStringToUrlOpen = TaintTracking::Global; from HttpStringToUrlOpen::PathNode source, HttpStringToUrlOpen::PathNode sink, HttpStringLiteral str where - HttpStringToUrlOpen::hasFlowPath(source, sink) and + HttpStringToUrlOpen::flowPath(source, sink) and str = source.getNode().asIndirectExpr() select str, source, sink, "This URL may be constructed with the HTTP protocol." diff --git a/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql index f899889a59b..3cc10b7ad19 100644 --- a/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql +++ b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql @@ -46,13 +46,13 @@ module KeyStrengthFlowConfig implements DataFlow::ConfigSig { } } -module KeyStrengthFlow = DataFlow::Make; +module KeyStrengthFlow = DataFlow::Global; from KeyStrengthFlow::PathNode source, KeyStrengthFlow::PathNode sink, FunctionCall fc, int param, string name, int minimumBits, int bits where - KeyStrengthFlow::hasFlowPath(source, sink) and + KeyStrengthFlow::flowPath(source, sink) and sink.getNode().asExpr() = fc.getArgument(param) and fc.getTarget().hasGlobalName(name) and minimumBits = getMinimumKeyStrength(name, param) and diff --git a/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql b/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql index e6dd4e7046e..2703f819b54 100644 --- a/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql +++ b/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql @@ -64,7 +64,7 @@ module NullAppNameCreateProcessFunctionConfig implements DataFlow::ConfigSig { } } -module NullAppNameCreateProcessFunction = DataFlow::Make; +module NullAppNameCreateProcessFunction = DataFlow::Global; /** * Dataflow that detects a call to CreateProcess with an unquoted commandLine argument @@ -85,7 +85,7 @@ module QuotedCommandInCreateProcessFunctionConfig implements DataFlow::ConfigSig } module QuotedCommandInCreateProcessFunction = - DataFlow::Make; + DataFlow::Global; bindingset[s] predicate isQuotedOrNoSpaceApplicationNameOnCmd(string s) { @@ -98,12 +98,12 @@ from CreateProcessFunctionCall call, string msg1, string msg2 where exists(Expr appName | appName = call.getArgument(call.getApplicationNameArgumentId()) and - NullAppNameCreateProcessFunction::hasFlowToExpr(appName) and + NullAppNameCreateProcessFunction::flowToExpr(appName) and msg1 = call.toString() + " with lpApplicationName == NULL (" + appName + ")" ) and exists(Expr cmd | cmd = call.getArgument(call.getCommandLineArgumentId()) and - QuotedCommandInCreateProcessFunction::hasFlowToExpr(cmd) and + QuotedCommandInCreateProcessFunction::flowToExpr(cmd) and msg2 = " and with an unquoted lpCommandLine (" + cmd + ") introduces a security vulnerability if the path contains spaces." diff --git a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql index 7e76cf76c12..74a5e1ba4e0 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql +++ b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql @@ -30,15 +30,15 @@ module ExposedSystemDataConfig implements DataFlow::ConfigSig { } } -module ExposedSystemData = TaintTracking::Make; +module ExposedSystemData = TaintTracking::Global; from ExposedSystemData::PathNode source, ExposedSystemData::PathNode sink where - ExposedSystemData::hasFlowPath(source, sink) and + ExposedSystemData::flowPath(source, sink) and not exists( DataFlow::Node alt // remove duplicate results on conversions | - ExposedSystemData::hasFlow(source.getNode(), alt) and + ExposedSystemData::flow(source.getNode(), alt) and alt.asConvertedExpr() = sink.getNode().asIndirectExpr() and alt != sink.getNode() ) diff --git a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql index a06314e3c97..9fa4f538378 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql +++ b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql @@ -51,9 +51,9 @@ module PotentiallyExposedSystemDataConfig implements DataFlow::ConfigSig { } } -module PotentiallyExposedSystemData = TaintTracking::Make; +module PotentiallyExposedSystemData = TaintTracking::Global; from PotentiallyExposedSystemData::PathNode source, PotentiallyExposedSystemData::PathNode sink -where PotentiallyExposedSystemData::hasFlowPath(source, sink) +where PotentiallyExposedSystemData::flowPath(source, sink) select sink, source, sink, "This operation potentially exposes sensitive system data from $@.", source, source.getNode().toString() diff --git a/cpp/ql/src/Security/CWE/CWE-611/XXE.ql b/cpp/ql/src/Security/CWE/CWE-611/XXE.ql index 1b611a42b8d..6b73e50c963 100644 --- a/cpp/ql/src/Security/CWE/CWE-611/XXE.ql +++ b/cpp/ql/src/Security/CWE/CWE-611/XXE.ql @@ -45,9 +45,9 @@ module XxeConfig implements DataFlow::StateConfigSig { } } -module XxeFlow = DataFlow::MakeWithState; +module XxeFlow = DataFlow::GlobalWithState; from XxeFlow::PathNode source, XxeFlow::PathNode sink -where XxeFlow::hasFlowPath(source, sink) +where XxeFlow::flowPath(source, sink) select sink, source, sink, "This $@ is not configured to prevent an XML external entity (XXE) attack.", source, "XML parser" diff --git a/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql b/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql index 8f36ab50aa8..5ed30e19bb3 100644 --- a/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql +++ b/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql @@ -39,7 +39,7 @@ module NullDaclConfig implements DataFlow::ConfigSig { } } -module NullDaclFlow = DataFlow::Make; +module NullDaclFlow = DataFlow::Global; /** * Dataflow that detects a call to SetSecurityDescriptorDacl with a pDacl @@ -70,7 +70,7 @@ module NonNullDaclConfig implements DataFlow::ConfigSig { } } -module NonNullDaclFlow = DataFlow::Make; +module NonNullDaclFlow = DataFlow::Global; from SetSecurityDescriptorDaclFunctionCall call, string message where @@ -88,7 +88,7 @@ where " that is set to NULL will result in an unprotected object." | var = call.getArgument(2) and - NullDaclFlow::hasFlowToExpr(var) and - not NonNullDaclFlow::hasFlowToExpr(var) + NullDaclFlow::flowToExpr(var) and + not NonNullDaclFlow::flowToExpr(var) ) select call, message diff --git a/cpp/ql/src/change-notes/2023-03-08-deprecated-dataflow-configurations.md b/cpp/ql/src/change-notes/2023-03-08-deprecated-dataflow-configurations.md deleted file mode 100644 index 46952f5b1a3..00000000000 --- a/cpp/ql/src/change-notes/2023-03-08-deprecated-dataflow-configurations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `NetworkToBufferSizeConfiguration` and `UntrustedDataToExternalApiConfig` dataflow configurations have been deprecated. Please use `NetworkToBufferSizeFlow` and `UntrustedDataToExternalApiFlow`. diff --git a/cpp/ql/src/change-notes/2023-03-08-deprecated-leap-year-dataflow-configurations.md b/cpp/ql/src/change-notes/released/0.5.5.md similarity index 57% rename from cpp/ql/src/change-notes/2023-03-08-deprecated-leap-year-dataflow-configurations.md rename to cpp/ql/src/change-notes/released/0.5.5.md index 1ea59f77680..d8b6132e12b 100644 --- a/cpp/ql/src/change-notes/2023-03-08-deprecated-leap-year-dataflow-configurations.md +++ b/cpp/ql/src/change-notes/released/0.5.5.md @@ -1,4 +1,6 @@ ---- -category: deprecated ---- +## 0.5.5 + +### Deprecated Queries + +* The `NetworkToBufferSizeConfiguration` and `UntrustedDataToExternalApiConfig` dataflow configurations have been deprecated. Please use `NetworkToBufferSizeFlow` and `UntrustedDataToExternalApiFlow`. * The `LeapYearCheckConfiguration`, `FiletimeYearArithmeticOperationCheckConfiguration`, and `PossibleYearArithmeticOperationCheckConfiguration` dataflow configurations have been deprecated. Please use `LeapYearCheckFlow`, `FiletimeYearArithmeticOperationCheckFlow` and `PossibleYearArithmeticOperationCheckFlow`. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql b/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql index 7b72b2684e6..cf346cb812e 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql @@ -50,9 +50,9 @@ module WordexpTaintConfig implements DataFlow::ConfigSig { } } -module WordexpTaint = TaintTracking::Make; +module WordexpTaint = TaintTracking::Global; from WordexpTaint::PathNode sourceNode, WordexpTaint::PathNode sinkNode -where WordexpTaint::hasFlowPath(sourceNode, sinkNode) +where WordexpTaint::flowPath(sourceNode, sinkNode) select sinkNode.getNode(), sourceNode, sinkNode, "Using user-supplied data in a `wordexp` command, without disabling command substitution, can make code vulnerable to command injection." diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql b/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql index 71958eaad91..00cf017297f 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql @@ -32,10 +32,10 @@ module MultToAllocConfig implements DataFlow::ConfigSig { } } -module MultToAlloc = DataFlow::Make; +module MultToAlloc = DataFlow::Global; from MultToAlloc::PathNode source, MultToAlloc::PathNode sink -where MultToAlloc::hasFlowPath(source, sink) +where MultToAlloc::flowPath(source, sink) select sink, source, sink, "Potentially overflowing value from $@ is used in the size of this allocation.", source, "multiplication" diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql index bdf8d175a48..f90f0bdcab8 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql @@ -15,8 +15,7 @@ import experimental.semmle.code.cpp.semantic.SemanticBound import experimental.semmle.code.cpp.semantic.SemanticExprSpecific import semmle.code.cpp.ir.IR import semmle.code.cpp.ir.dataflow.DataFlow -import semmle.code.cpp.ir.dataflow.DataFlow2 -import DataFlow2::PathGraph +import PointerArithmeticToDerefFlow::PathGraph pragma[nomagic] Instruction getABoundIn(SemBound b, IRFunction func) { @@ -36,16 +35,17 @@ predicate bounded(Instruction i, Instruction b, int delta) { ) } -class FieldAddressToPointerArithmeticConf extends DataFlow::Configuration { - FieldAddressToPointerArithmeticConf() { this = "FieldAddressToPointerArithmeticConf" } +module FieldAddressToPointerArithmeticConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isFieldAddressSource(_, source) } - override predicate isSource(DataFlow::Node source) { isFieldAddressSource(_, source) } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(PointerAddInstruction pai | pai.getLeft() = sink.asInstruction()) } } +module FieldAddressToPointerArithmeticFlow = + DataFlow::Global; + predicate isFieldAddressSource(Field f, DataFlow::Node source) { source.asInstruction().(FieldAddressInstruction).getField() = f } @@ -70,11 +70,8 @@ predicate isInvalidPointerDerefSink(DataFlow::Node sink, Instruction i, string o } predicate isConstantSizeOverflowSource(Field f, PointerAddInstruction pai, int delta) { - exists( - int size, int bound, FieldAddressToPointerArithmeticConf conf, DataFlow::Node source, - DataFlow::InstructionNode sink - | - conf.hasFlow(source, sink) and + exists(int size, int bound, DataFlow::Node source, DataFlow::InstructionNode sink | + FieldAddressToPointerArithmeticFlow::flow(source, sink) and isFieldAddressSource(f, source) and pai.getLeft() = sink.asInstruction() and f.getUnspecifiedType().(ArrayType).getArraySize() = size and @@ -86,21 +83,21 @@ predicate isConstantSizeOverflowSource(Field f, PointerAddInstruction pai, int d ) } -class PointerArithmeticToDerefConf extends DataFlow2::Configuration { - PointerArithmeticToDerefConf() { this = "PointerArithmeticToDerefConf" } - - override predicate isSource(DataFlow::Node source) { +module PointerArithmeticToDerefConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isConstantSizeOverflowSource(_, source.asInstruction(), _) } - override predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } + predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } } +module PointerArithmeticToDerefFlow = DataFlow::Global; + from - Field f, DataFlow2::PathNode source, DataFlow2::PathNode sink, Instruction deref, - PointerArithmeticToDerefConf conf, string operation, int delta + Field f, PointerArithmeticToDerefFlow::PathNode source, + PointerArithmeticToDerefFlow::PathNode sink, Instruction deref, string operation, int delta where - conf.hasFlowPath(source, sink) and + PointerArithmeticToDerefFlow::flowPath(source, sink) and isInvalidPointerDerefSink(sink.getNode(), deref, operation) and isConstantSizeOverflowSource(f, source.getNode().asInstruction(), delta) select source, source, sink, diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql index a35ed79a440..cfd610767de 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql @@ -17,7 +17,6 @@ import cpp import experimental.semmle.code.cpp.dataflow.ProductFlow -import semmle.code.cpp.ir.dataflow.DataFlow3 import experimental.semmle.code.cpp.semantic.analysis.RangeAnalysis import experimental.semmle.code.cpp.semantic.SemanticBound import experimental.semmle.code.cpp.semantic.SemanticExprSpecific @@ -204,14 +203,14 @@ predicate isInvalidPointerDerefSink(DataFlow::Node sink, Instruction i, string o * A configuration to track flow from a pointer-arithmetic operation found * by `AllocToInvalidPointerConf` to a dereference of the pointer. */ -class InvalidPointerToDerefConf extends DataFlow3::Configuration { - InvalidPointerToDerefConf() { this = "InvalidPointerToDerefConf" } +module InvalidPointerToDerefConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { invalidPointerToDerefSource(_, source, _) } - override predicate isSource(DataFlow::Node source) { invalidPointerToDerefSource(_, source, _) } - - override predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } + predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } } +module InvalidPointerToDerefFlow = DataFlow::Global; + /** * Holds if `pai` is a pointer-arithmetic operation and `source` is a dataflow node with a * pointer-value that is non-strictly upper bounded by `pai + delta`. @@ -236,13 +235,13 @@ newtype TMergedPathNode = // The path nodes computed by the first projection of `AllocToInvalidPointerConf` TPathNode1(DataFlow::PathNode p) or // The path nodes computed by `InvalidPointerToDerefConf` - TPathNode3(DataFlow3::PathNode p) or + TPathNode3(InvalidPointerToDerefFlow::PathNode p) or // The read/write that uses the invalid pointer identified by `InvalidPointerToDerefConf`. // This one is needed because the sink identified by `InvalidPointerToDerefConf` is the // pointer, but we want to raise an alert at the dereference. TPathNodeSink(Instruction i) { exists(DataFlow::Node n | - any(InvalidPointerToDerefConf conf).hasFlow(_, n) and + InvalidPointerToDerefFlow::flow(_, n) and isInvalidPointerDerefSink(n, i, _) ) } @@ -252,7 +251,7 @@ class MergedPathNode extends TMergedPathNode { final DataFlow::PathNode asPathNode1() { this = TPathNode1(result) } - final DataFlow3::PathNode asPathNode3() { this = TPathNode3(result) } + final InvalidPointerToDerefFlow::PathNode asPathNode3() { this = TPathNode3(result) } final Instruction asSinkNode() { this = TPathNodeSink(result) } @@ -280,7 +279,7 @@ class PathNode1 extends MergedPathNode, TPathNode1 { class PathNode3 extends MergedPathNode, TPathNode3 { override string toString() { - exists(DataFlow3::PathNode p | + exists(InvalidPointerToDerefFlow::PathNode p | this = TPathNode3(p) and result = p.toString() ) @@ -324,7 +323,9 @@ query predicate edges(MergedPathNode node1, MergedPathNode node2) { * Holds if `p1` is a sink of `AllocToInvalidPointerConf` and `p2` is a source * of `InvalidPointerToDerefConf`, and they are connected through `pai`. */ -predicate joinOn1(PointerArithmeticInstruction pai, DataFlow::PathNode p1, DataFlow3::PathNode p2) { +predicate joinOn1( + PointerArithmeticInstruction pai, DataFlow::PathNode p1, InvalidPointerToDerefFlow::PathNode p2 +) { isSinkImpl(pai, p1.getNode(), _, _) and invalidPointerToDerefSource(pai, p2.getNode(), _) } @@ -334,28 +335,29 @@ predicate joinOn1(PointerArithmeticInstruction pai, DataFlow::PathNode p1, DataF * that dereferences `p1`. The string `operation` describes whether the `i` is * a `StoreInstruction` or `LoadInstruction`. */ -predicate joinOn2(DataFlow3::PathNode p1, Instruction i, string operation) { +predicate joinOn2(InvalidPointerToDerefFlow::PathNode p1, Instruction i, string operation) { isInvalidPointerDerefSink(p1.getNode(), i, operation) } predicate hasFlowPath( - MergedPathNode source1, MergedPathNode sink, DataFlow3::PathNode source3, + MergedPathNode source1, MergedPathNode sink, InvalidPointerToDerefFlow::PathNode source3, PointerArithmeticInstruction pai, string operation ) { exists( - AllocToInvalidPointerConf conf1, InvalidPointerToDerefConf conf2, DataFlow3::PathNode sink3, + AllocToInvalidPointerConf conf1, InvalidPointerToDerefFlow::PathNode sink3, DataFlow::PathNode sink1 | conf1.hasFlowPath(source1.asPathNode1(), _, sink1, _) and joinOn1(pai, sink1, source3) and - conf2.hasFlowPath(source3, sink3) and + InvalidPointerToDerefFlow::flowPath(source3, sink3) and joinOn2(sink3, sink.asSinkNode(), operation) ) } from - MergedPathNode source, MergedPathNode sink, int k, string kstr, DataFlow3::PathNode source3, - PointerArithmeticInstruction pai, string operation, Expr offset, DataFlow::Node n + MergedPathNode source, MergedPathNode sink, int k, string kstr, + InvalidPointerToDerefFlow::PathNode source3, PointerArithmeticInstruction pai, string operation, + Expr offset, DataFlow::Node n where hasFlowPath(source, sink, source3, pai, operation) and invalidPointerToDerefSource(pai, source3.getNode(), k) and diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql b/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql index c09277f38f2..2355c276b60 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql @@ -16,7 +16,7 @@ import experimental.semmle.code.cpp.security.PrivateCleartextWrite::PrivateClear import WriteFlow::PathGraph from WriteFlow::PathNode source, WriteFlow::PathNode sink -where WriteFlow::hasFlowPath(source, sink) +where WriteFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This write into the external location '" + sink.getNode() + "' may contain unencrypted data from $@.", source, "this source of private data." diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 9c312b5a568..eb82996adba 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.5.5-dev +version: 0.5.6-dev groups: - cpp - queries diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql index 10c0bcf5ee8..a27e6382916 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql @@ -1,14 +1,10 @@ import cpp import semmle.code.cpp.dataflow.new.DataFlow -class LiteralToGethostbynameConfiguration extends DataFlow::Configuration { - LiteralToGethostbynameConfiguration() { this = "LiteralToGethostbynameConfiguration" } +module LiteralToGethostbynameConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asIndirectExpr(1) instanceof StringLiteral } - override predicate isSource(DataFlow::Node source) { - source.asIndirectExpr(1) instanceof StringLiteral - } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(FunctionCall fc | sink.asIndirectExpr(1) = fc.getArgument(0) and fc.getTarget().hasName("gethostbyname") @@ -16,11 +12,11 @@ class LiteralToGethostbynameConfiguration extends DataFlow::Configuration { } } -from - StringLiteral sl, FunctionCall fc, LiteralToGethostbynameConfiguration cfg, DataFlow::Node source, - DataFlow::Node sink +module LiteralToGethostbynameFlow = DataFlow::Global; + +from StringLiteral sl, FunctionCall fc, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = sl and sink.asIndirectExpr(1) = fc.getArgument(0) and - cfg.hasFlow(source, sink) + LiteralToGethostbynameFlow::flow(source, sink) select sl, fc diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql index 09c01b953e3..09d580234fb 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql @@ -5,12 +5,10 @@ class GetenvSource extends DataFlow::Node { GetenvSource() { this.asIndirectExpr(1).(FunctionCall).getTarget().hasGlobalName("getenv") } } -class GetenvToGethostbynameConfiguration extends DataFlow::Configuration { - GetenvToGethostbynameConfiguration() { this = "GetenvToGethostbynameConfiguration" } +module GetenvToGethostbynameConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof GetenvSource } - override predicate isSource(DataFlow::Node source) { source instanceof GetenvSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(FunctionCall fc | sink.asIndirectExpr(1) = fc.getArgument(0) and fc.getTarget().hasName("gethostbyname") @@ -18,11 +16,11 @@ class GetenvToGethostbynameConfiguration extends DataFlow::Configuration { } } -from - Expr getenv, FunctionCall fc, GetenvToGethostbynameConfiguration cfg, DataFlow::Node source, - DataFlow::Node sink +module GetenvToGethostbynameFlow = DataFlow::Global; + +from Expr getenv, FunctionCall fc, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = getenv and sink.asIndirectExpr(1) = fc.getArgument(0) and - cfg.hasFlow(source, sink) + GetenvToGethostbynameFlow::flow(source, sink) select getenv, fc diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql index d21ae4ae52e..917193b2994 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql @@ -1,17 +1,15 @@ import cpp import semmle.code.cpp.dataflow.new.DataFlow -class EnvironmentToFileConfiguration extends DataFlow::Configuration { - EnvironmentToFileConfiguration() { this = "EnvironmentToFileConfiguration" } - - override predicate isSource(DataFlow::Node source) { +module EnvironmentToFileConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(Function getenv | source.asIndirectExpr(1).(FunctionCall).getTarget() = getenv and getenv.hasGlobalName("getenv") ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(FunctionCall fc | sink.asIndirectExpr(1) = fc.getArgument(0) and fc.getTarget().hasGlobalName("fopen") @@ -19,11 +17,11 @@ class EnvironmentToFileConfiguration extends DataFlow::Configuration { } } -from - Expr getenv, Expr fopen, EnvironmentToFileConfiguration config, DataFlow::Node source, - DataFlow::Node sink +module EnvironmentToFileFlow = DataFlow::Global; + +from Expr getenv, Expr fopen, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = getenv and sink.asIndirectExpr(1) = fopen and - config.hasFlow(source, sink) + EnvironmentToFileFlow::flow(source, sink) select fopen, "This 'fopen' uses data from $@.", getenv, "call to 'getenv'" diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql index e6452137053..15cc379131a 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql @@ -2,18 +2,16 @@ import cpp import semmle.code.cpp.controlflow.Guards import semmle.code.cpp.dataflow.new.TaintTracking -class NetworkToBufferSizeConfiguration extends TaintTracking::Configuration { - NetworkToBufferSizeConfiguration() { this = "NetworkToBufferSizeConfiguration" } - - override predicate isSource(DataFlow::Node node) { +module NetworkToBufferSizeConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node.asExpr().(FunctionCall).getTarget().hasGlobalName("ntohl") } - override predicate isSink(DataFlow::Node node) { + predicate isSink(DataFlow::Node node) { exists(ArrayExpr ae | node.asExpr() = ae.getArrayOffset()) } - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { exists(Loop loop, LoopCounter lc | loop = lc.getALoop() and loop.getControllingExpr().(RelationalOperation).getGreaterOperand() = pred.asExpr() @@ -22,7 +20,7 @@ class NetworkToBufferSizeConfiguration extends TaintTracking::Configuration { ) } - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { exists(GuardCondition gc, Variable v | gc.getAChild*() = v.getAnAccess() and node.asExpr() = v.getAnAccess() and @@ -32,7 +30,9 @@ class NetworkToBufferSizeConfiguration extends TaintTracking::Configuration { } } -from DataFlow::Node ntohl, DataFlow::Node offset, NetworkToBufferSizeConfiguration conf -where conf.hasFlow(ntohl, offset) +module NetworkToBufferSizeFlow = TaintTracking::Global; + +from DataFlow::Node ntohl, DataFlow::Node offset +where NetworkToBufferSizeFlow::flow(ntohl, offset) select offset, "This array offset may be influenced by $@.", ntohl, "converted data from the network" diff --git a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql index 1497702db76..d929b6557a4 100644 --- a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql +++ b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql @@ -14,8 +14,8 @@ module TestConfig implements DataFlow::ConfigSig { } } -module TestFlow = DataFlow::Make; +module TestFlow = DataFlow::Global; from DataFlow::Node sink, DataFlow::Node source -where TestFlow::hasFlow(source, sink) +where TestFlow::flow(source, sink) select sink, source diff --git a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql index c46d2cddf88..49e98db06ae 100644 --- a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql +++ b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql @@ -25,8 +25,8 @@ module TestConfig implements DataFlow::ConfigSig { } } -module TestFlow = DataFlow::Make; +module TestFlow = DataFlow::Global; from DataFlow::Node sink, DataFlow::Node source -where TestFlow::hasFlow(source, sink) +where TestFlow::flow(source, sink) select sink, source diff --git a/cpp/ql/test/library-tests/dataflow/crement/from0.ql b/cpp/ql/test/library-tests/dataflow/crement/from0.ql index 90bf8401fba..d395920c030 100644 --- a/cpp/ql/test/library-tests/dataflow/crement/from0.ql +++ b/cpp/ql/test/library-tests/dataflow/crement/from0.ql @@ -7,8 +7,8 @@ module Cfg implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof VariableAccess } } -module Flow = DataFlow::Make; +module Flow = DataFlow::Global; from Expr sink -where Flow::hasFlowToExpr(sink) +where Flow::flowToExpr(sink) select sink diff --git a/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp b/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp index 01a4a0adaef..deeb70ffd57 100644 --- a/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp +++ b/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp @@ -56,3 +56,8 @@ void f3() { } } } + +int unevaluated_test() { + char buffer[100]; + return sizeof(buffer) / sizeof(buffer[101]); // GOOD +} \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp index 6dbbcdd4b3e..90f942023c4 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp @@ -603,6 +603,11 @@ void test22(bool b, const char* source) { memcpy(dest, source, n); // GOOD } +int test23() { + char buffer[100]; + return sizeof(buffer) / sizeof(buffer[101]); // GOOD +} + int tests_main(int argc, char *argv[]) { long long arr17[19]; @@ -627,6 +632,7 @@ int tests_main(int argc, char *argv[]) test20(); test21(argc == 0); test22(argc == 0, argv[0]); + test23(); return 0; } diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 1f2dc408daf..892c022355a 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.5 + +No user-facing changes. + ## 1.4.4 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.4.5.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.4.5.md new file mode 100644 index 00000000000..930163bb5ae --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.4.5.md @@ -0,0 +1,3 @@ +## 1.4.5 + +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 1dfca6daa3b..a74b6b08d86 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.4.4 +lastReleaseVersion: 1.4.5 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 14647a2593b..2b2be57e934 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.4.5-dev +version: 1.4.6-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 1f2dc408daf..892c022355a 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.5 + +No user-facing changes. + ## 1.4.4 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.4.5.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.4.5.md new file mode 100644 index 00000000000..930163bb5ae --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.4.5.md @@ -0,0 +1,3 @@ +## 1.4.5 + +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 1dfca6daa3b..a74b6b08d86 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.4.4 +lastReleaseVersion: 1.4.5 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 48bb9aecd88..e588fb9218e 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.4.5-dev +version: 1.4.6-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 42eaea79fd6..bf400a54378 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,25 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. +* Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. +* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer-like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/csharp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/csharp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/csharp/ql/lib/change-notes/2023-03-02-unsafemembers.md b/csharp/ql/lib/change-notes/2023-03-02-unsafemembers.md deleted file mode 100644 index 7ff64ca1301..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-02-unsafemembers.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2023-03-03-delete-deps.md b/csharp/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index f5557fc5b77..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. -* Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. -* Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. diff --git a/csharp/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/csharp/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/csharp/ql/lib/change-notes/released/0.5.5.md b/csharp/ql/lib/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..873ac6839e3 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.5.5.md @@ -0,0 +1,21 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. +* Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. +* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer-like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 34880f509e8..9c1c247e967 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.5.5-dev +version: 0.5.6-dev 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 4067ba6e81c..2792c1d180c 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll @@ -160,7 +160,7 @@ predicate modelCoverage(string namespace, int namespaces, string kind, string pa /** Provides a query predicate to check the MaD models for validation errors. */ module ModelValidation { private string getInvalidModelInput() { - exists(string pred, AccessPath input, string part | + exists(string pred, AccessPath input, AccessPathToken part | sinkModel(_, _, _, _, _, _, input, _, _) and pred = "sink" or summaryModel(_, _, _, _, _, _, input, _, _, _) and pred = "summary" @@ -169,7 +169,8 @@ module ModelValidation { invalidSpecComponent(input, part) and not part = "" and not (part = "Argument" and pred = "sink") and - not parseArg(part, _) + not parseArg(part, _) and + not part.getName() = ["Field", "Property"] or part = input.getToken(_) and parseParam(part, _) @@ -181,7 +182,7 @@ module ModelValidation { } private string getInvalidModelOutput() { - exists(string pred, string output, string part | + exists(string pred, AccessPath output, AccessPathToken part | sourceModel(_, _, _, _, _, _, output, _, _) and pred = "source" or summaryModel(_, _, _, _, _, _, _, output, _, _) and pred = "summary" @@ -189,7 +190,8 @@ module ModelValidation { ( invalidSpecComponent(output, part) and not part = "" and - not (part = ["Argument", "Parameter"] and pred = "source") + not (part = ["Argument", "Parameter"] and pred = "source") and + not part.getName() = ["Field", "Property"] or invalidIndexComponent(output, part) ) and 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 617362ab4f0..865d7b4d6ce 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); 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 c47b0308855..39dbf8dc075 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll index e44cd40d872..6f0067517f9 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll @@ -45,10 +45,6 @@ private Sign certainExprSign(Expr e) { private predicate unknownSign(Expr e) { not exists(certainExprSign(e)) and ( - exists(IntegerLiteral lit | lit = e and not exists(lit.getValue().toInt())) - or - exists(LongLiteral lit | lit = e and not exists(lit.getValue().toFloat())) - or exists(CastingExpr cast, Type fromtyp | cast = e and fromtyp = cast.getSourceType() and diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index b75d77162f4..0abf2626a75 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.5 + +No user-facing changes. + ## 0.5.4 No user-facing changes. diff --git a/csharp/ql/src/change-notes/released/0.5.5.md b/csharp/ql/src/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..5f5ae32c059 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.5.5.md @@ -0,0 +1,3 @@ +## 0.5.5 + +No user-facing changes. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 3ed4e37fefc..36a7fe45eee 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.5.5-dev +version: 0.5.6-dev groups: - csharp - queries diff --git a/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql index 3a2a3454900..dd9648ce2d4 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql @@ -6,7 +6,7 @@ import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string flow where diff --git a/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql index 933df8c765a..e4424c54ad5 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql @@ -8,7 +8,7 @@ import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string noflow where diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql index bba5081c223..d00f49904a5 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateToSinkConfig() { any() } -} - from DataFlowTargetApi api, string sink where sink = captureSink(api) select sink order by sink diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql index f504a291d7e..a4dc734d178 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateFromSourceConfig() { any() } -} - from DataFlowTargetApi api, string source where source = captureSource(api) select source order by source diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql index 641c260adf8..920c5b57a74 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql @@ -8,7 +8,7 @@ import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string flow where flow = captureFlow(api) and not api.(FlowSummaryImpl::Public::SummarizedCallable).isManual() diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 893c62191b3..5ca3ffed782 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -5,14 +5,6 @@ private import CaptureModelsSpecific -class ActiveConfiguration extends Unit { - predicate activateThroughFlowConfig() { none() } - - predicate activateFromSourceConfig() { none() } - - predicate activateToSinkConfig() { none() } -} - class DataFlowTargetApi extends TargetApiSpecific { DataFlowTargetApi() { isRelevantForDataFlowModels(this) } } @@ -46,6 +38,20 @@ private predicate isRelevantContent(DataFlow::Content c) { DataFlowPrivate::containerContent(c) } +/** + * Gets the MaD string representation of the parameter node `p`. + */ +string parameterNodeAsInput(DataFlow::ParameterNode p) { + result = parameterAccess(p.asParameter()) + or + result = qualifierString() and p instanceof InstanceParameterNode +} + +/** + * Gets the MaD input string representation of `source`. + */ +string asInputArgument(DataFlow::Node source) { result = asInputArgumentSpecific(source) } + /** * Gets the summary model for `api` with `input`, `output` and `kind`. */ @@ -111,61 +117,70 @@ string captureQualifierFlow(TargetApiSpecific api) { private int accessPathLimit() { result = 2 } +private newtype TTaintState = + TTaintRead(int n) { n in [0 .. accessPathLimit()] } or + TTaintStore(int n) { n in [1 .. accessPathLimit()] } + +abstract private class TaintState extends TTaintState { + abstract string toString(); +} + /** * A FlowState representing a tainted read. */ -private class TaintRead extends DataFlow::FlowState { +private class TaintRead extends TaintState, TTaintRead { private int step; - TaintRead() { this = "TaintRead(" + step + ")" and step in [0 .. accessPathLimit()] } + TaintRead() { this = TTaintRead(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintRead(" + step + ")" } } /** * A FlowState representing a tainted write. */ -private class TaintStore extends DataFlow::FlowState { +private class TaintStore extends TaintState, TTaintStore { private int step; - TaintStore() { this = "TaintStore(" + step + ")" and step in [1 .. accessPathLimit()] } + TaintStore() { this = TTaintStore(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintStore(" + step + ")" } } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A data-flow configuration for tracking flow through APIs. * The sources are the parameters of an API and the sinks are the return values (excluding `this`) and parameters. * * This can be used to generate Flow summaries for APIs from parameter to return. */ -private class ThroughFlowConfig extends TaintTracking::Configuration { - ThroughFlowConfig() { - this = "ThroughFlowConfig" and any(ActiveConfiguration ac).activateThroughFlowConfig() - } +module ThroughFlowConfig implements DataFlow::StateConfigSig { + class FlowState = TaintState; - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + predicate isSource(DataFlow::Node source, FlowState state) { source instanceof DataFlow::ParameterNode and source.getEnclosingCallable() instanceof DataFlowTargetApi and state.(TaintRead).getStep() = 0 } - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { + predicate isSink(DataFlow::Node sink, FlowState state) { sink instanceof DataFlowImplCommon::ReturnNodeExt and not isOwnInstanceAccessNode(sink) and not exists(captureQualifierFlow(sink.asExpr().getEnclosingCallable())) and (state instanceof TaintRead or state instanceof TaintStore) } - override predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 + predicate isAdditionalFlowStep( + DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2 ) { exists(DataFlowImplCommon::TypedContent tc | DataFlowImplCommon::store(node1, tc, node2, _) and @@ -184,24 +199,28 @@ private class ThroughFlowConfig extends TaintTracking::Configuration { ) } - override predicate isSanitizer(DataFlow::Node n) { + predicate isBarrier(DataFlow::Node n) { exists(Type t | t = n.getType() and not isRelevantType(t)) } - override DataFlow::FlowFeature getAFeature() { + predicate isBarrier(DataFlow::Node node, FlowState state) { none() } + + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureEqualSourceSinkCallContext } } +private module ThroughFlow = TaintTracking::GlobalWithState; + /** * Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter. */ string captureThroughFlow(DataFlowTargetApi api) { exists( - ThroughFlowConfig config, DataFlow::ParameterNode p, - DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output + DataFlow::ParameterNode p, DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, + string output | - config.hasFlow(p, returnNodeExt) and + ThroughFlow::flow(p, returnNodeExt) and returnNodeExt.getEnclosingCallable() = api and input = parameterNodeAsInput(p) and output = returnNodeAsOutput(returnNodeExt) and @@ -211,41 +230,37 @@ string captureThroughFlow(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sources. * The sources are the already known existing sources and the sinks are the API return nodes. * * This can be used to generate Source summaries for an API, if the API expose an already known source * via its return (then the API itself becomes a source). */ -private class FromSourceConfiguration extends TaintTracking::Configuration { - FromSourceConfiguration() { - this = "FromSourceConfiguration" and any(ActiveConfiguration ac).activateFromSourceConfig() - } +module FromSourceConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - override predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(DataFlowTargetApi c | sink instanceof DataFlowImplCommon::ReturnNodeExt and sink.getEnclosingCallable() = c ) } - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSinkCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSinkCallContext } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { isRelevantTaintStep(node1, node2) } } +private module FromSource = TaintTracking::Global; + /** * Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`. */ string captureSource(DataFlowTargetApi api) { - exists(DataFlow::Node source, DataFlow::Node sink, FromSourceConfiguration config, string kind | - config.hasFlow(source, sink) and + exists(DataFlow::Node source, DataFlow::Node sink, string kind | + FromSource::flow(source, sink) and ExternalFlow::sourceNode(source, kind) and api = sink.getEnclosingCallable() and isRelevantSourceKind(kind) and @@ -254,35 +269,30 @@ string captureSource(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sinks. * The sources are the parameters of the API and the fields of the enclosing type. * * This can be used to generate Sink summaries for APIs, if the API propagates a parameter (or enclosing type field) * into an existing known sink (then the API itself becomes a sink). */ -private class PropagateToSinkConfiguration extends TaintTracking::Configuration { - PropagateToSinkConfiguration() { - this = "parameters or fields flowing into sinks" and - any(ActiveConfiguration ac).activateToSinkConfig() - } +module PropagateToSinkConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { apiSource(source) } - override predicate isSource(DataFlow::Node source) { apiSource(source) } + predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } - override predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } + predicate isBarrier(DataFlow::Node node) { sinkModelSanitizer(node) } - override predicate isSanitizer(DataFlow::Node node) { sinkModelSanitizer(node) } - - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSourceCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext } } +private module PropagateToSink = TaintTracking::Global; + /** * Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink. */ string captureSink(DataFlowTargetApi api) { - exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind | - config.hasFlow(src, sink) and + exists(DataFlow::Node src, DataFlow::Node sink, string kind | + PropagateToSink::flow(src, sink) and ExternalFlow::sinkNode(sink, kind) and api = src.getEnclosingCallable() and isRelevantSinkKind(kind) and diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll index 1fc7636ca65..0414de03016 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll @@ -7,7 +7,6 @@ private import dotnet private import semmle.code.csharp.commons.Util as Util private import semmle.code.csharp.commons.Collections as Collections private import semmle.code.csharp.dataflow.internal.DataFlowDispatch -private import semmle.code.csharp.frameworks.System as System private import semmle.code.csharp.frameworks.system.linq.Expressions import semmle.code.csharp.dataflow.ExternalFlow as ExternalFlow import semmle.code.csharp.dataflow.internal.DataFlowImplCommon as DataFlowImplCommon @@ -110,7 +109,7 @@ predicate isRelevantType(CS::Type t) { } /** - * Gets the CSV string representation of the qualifier. + * Gets the MaD string representation of the qualifier. */ string qualifierString() { result = "Argument[this]" } @@ -120,14 +119,7 @@ string parameterAccess(CS::Parameter p) { else result = "Argument[" + p.getPosition() + "]" } -/** - * Gets the CSV string representation of the parameter node `p`. - */ -string parameterNodeAsInput(DataFlow::ParameterNode p) { - result = parameterAccess(p.asParameter()) - or - result = qualifierString() and p instanceof DataFlowPrivate::InstanceParameterNode -} +class InstanceParameterNode = DataFlowPrivate::InstanceParameterNode; pragma[nomagic] private CS::Parameter getParameter(DataFlowImplCommon::ReturnNodeExt node, ParameterPosition pos) { @@ -135,7 +127,7 @@ private CS::Parameter getParameter(DataFlowImplCommon::ReturnNodeExt node, Param } /** - * Gets the CSV string representation of the the return node `node`. + * Gets the MaD string representation of the the return node `node`. */ string returnNodeAsOutput(DataFlowImplCommon::ReturnNodeExt node) { if node.getKind() instanceof DataFlowImplCommon::ValueReturnKind @@ -188,9 +180,9 @@ predicate apiSource(DataFlow::Node source) { } /** - * Gets the CSV input string representation of `source`. + * Gets the MaD input string representation of `source`. */ -string asInputArgument(DataFlow::Node source) { +string asInputArgumentSpecific(DataFlow::Node source) { exists(int pos | pos = source.(DataFlow::ParameterNode).getParameter().getPosition() and result = "Argument[" + pos + "]" diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll similarity index 95% rename from csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll rename to csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll index 1ed6b9a4850..2b3ce63249c 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll @@ -1,9 +1,5 @@ private import CaptureModels -private class Activate extends ActiveConfiguration { - override predicate activateThroughFlowConfig() { any() } -} - /** * Capture fluent APIs that return `this`. * Example of a fluent API: diff --git a/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.ql b/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.ql new file mode 100644 index 00000000000..d9e073ab78e --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.ql @@ -0,0 +1,15 @@ +import csharp +import semmle.code.csharp.dataflow.ExternalFlow +import semmle.code.csharp.dataflow.internal.AccessPathSyntax +import ModelValidation + +private predicate getRelevantAccessPath(string path) { + summaryModel(_, _, _, _, _, _, path, _, _, _) or + summaryModel(_, _, _, _, _, _, _, path, _, _) or + sinkModel(_, _, _, _, _, _, path, _, _) or + sourceModel(_, _, _, _, _, _, path, _, _) +} + +private class AccessPathsExternal extends AccessPath::Range { + AccessPathsExternal() { getRelevantAccessPath(this) } +} diff --git a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst index 5c3d81e3f42..911c930458e 100644 --- a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst +++ b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst @@ -2,9 +2,9 @@ .. pull-quote:: Note - The data flow library described here is available from CodeQL 2.12.5 onwards. See :ref:`here ` for the library available in earlier versions. + The data flow library described here is available from CodeQL 2.12.5 onwards. For information on the previous version of the library, see :ref:`Analyzing data flow in C and C++ `. -Analyzing data flow in C and C++ (New) +Analyzing data flow in C and C++ (new) ====================================== You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. diff --git a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst index 7cfe15cb64c..b70bfa7a3f8 100644 --- a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst +++ b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst @@ -2,7 +2,7 @@ .. pull-quote:: Note - The data flow library described here will be deprecated in the near future. For the replacement library, which is available from CodeQL 2.12.5 onwards, see :ref:`here `. + The data flow library used in this article has been replaced with an improved library which is available from CodeQL 2.12.5 onwards, see :ref:`Analyzing data flow in C and C++ (new) `. The old library will be deprecated in the near future and removed a year after deprecation. Analyzing data flow in C and C++ ================================ diff --git a/docs/codeql/codeql-language-guides/codeql-for-cpp.rst b/docs/codeql/codeql-language-guides/codeql-for-cpp.rst index ab1afbd325b..703c3e93e4f 100644 --- a/docs/codeql/codeql-language-guides/codeql-for-cpp.rst +++ b/docs/codeql/codeql-language-guides/codeql-for-cpp.rst @@ -32,7 +32,7 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat - :doc:`Conversions and classes in C and C++ `: You can use the standard CodeQL libraries for C and C++ to detect when the type of an expression is changed. -- :doc:`Analyzing data flow in C and C++ `: You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. +- :doc:`Analyzing data flow in C and C++ (new) `: You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. For information about data flow analysis in versions up to CodeQL 2.12.4, see :doc:`Analyzing data flow in C and C++ `. - :doc:`Refining a query to account for edge cases `: You can improve the results generated by a CodeQL query by adding conditions to remove false positive results caused by common edge cases. diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 3bab3bf2b6a..56c35b2f9fe 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,18 @@ +## 0.4.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + ## 0.4.4 No user-facing changes. diff --git a/go/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/go/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/go/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/java/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/go/ql/lib/change-notes/released/0.4.5.md similarity index 64% rename from java/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md rename to go/ql/lib/change-notes/released/0.4.5.md index 89190af399f..af3533b8018 100644 --- a/java/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ b/go/ql/lib/change-notes/released/0.4.5.md @@ -1,6 +1,11 @@ ---- -category: majorAnalysis ---- +## 0.4.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + * The main data flow and taint tracking APIs have been changed. The old APIs remain in place for now and translate to the new through a backwards-compatible wrapper. If multiple configurations are in scope diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index e9b57993a01..466cd01cf4e 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.4 +lastReleaseVersion: 0.4.5 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 378f7b0e5e4..a8601ec94b7 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 0.4.5-dev +version: 0.4.6-dev 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 617362ab4f0..865d7b4d6ce 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll index c47b0308855..39dbf8dc075 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll index e6bdc74cceb..8415c022111 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 89ee497c17f..e9d64e6c8e8 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.5 + +No user-facing changes. + ## 0.4.4 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/0.4.5.md b/go/ql/src/change-notes/released/0.4.5.md new file mode 100644 index 00000000000..7ba9b2e8ade --- /dev/null +++ b/go/ql/src/change-notes/released/0.4.5.md @@ -0,0 +1,3 @@ +## 0.4.5 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index e9b57993a01..466cd01cf4e 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.4 +lastReleaseVersion: 0.4.5 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 02c9d788969..86760bca0f9 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 0.4.5-dev +version: 0.4.6-dev groups: - go - queries diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index fa61d8d78ea..680b2440aab 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -1,7 +1,7 @@ package,sink,source,summary,sink:bean-validation,sink:create-file,sink:fragment-injection,sink:groovy,sink:header-splitting,sink:information-leak,sink:intent-start,sink:jdbc-url,sink:jexl,sink:jndi-injection,sink:ldap,sink:logging,sink:mvel,sink:ognl-injection,sink:open-url,sink:pending-intent-sent,sink:read-file,sink:regex-use,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:set-hostname-verifier,sink:sql,sink:ssti,sink:url-open-stream,sink:url-redirect,sink:write-file,sink:xpath,sink:xslt,sink:xss,source:android-external-storage-dir,source:android-widget,source:contentprovider,source:remote,summary:taint,summary:value android.app,35,,103,,,11,,,,7,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,18,85 android.content,24,31,154,,,,,,,16,,,,,,,,,,,,,,,,,,,8,,,,,,,,4,,27,,63,91 -android.database,59,,39,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,39, +android.database,59,,41,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,41, android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15 android.os,,2,122,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,41,81 android.support.v4.app,11,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -16,7 +16,7 @@ com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, com.fasterxml.jackson.databind,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, -com.google.common.base,4,,85,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,62,23 +com.google.common.base,4,,87,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,63,24 com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17 com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551 com.google.common.flogger,29,,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -33,8 +33,17 @@ freemarker.cache,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, freemarker.template,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,, groovy.lang,26,,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, groovy.util,5,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +hudson.model,4,,1,,2,,,,,,,,,,,,,1,,1,,,,,,,,,,,,,,,,,,,,,1, +hudson.os,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, hudson.remoting,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +hudson.util,4,,1,,3,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,1, +io.netty.bootstrap,3,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.channel,9,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.handler.codec.http,3,,1,,,,,,,,,,,,,,,2,,1,,,,,,,,,,,,,,,,,,,,,1, +io.netty.handler.ssl,2,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,, +io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,, io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +io.netty.util.internal,2,,2,,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,2, jakarta.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,, jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, @@ -43,19 +52,20 @@ jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,94,55 java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, java.io,42,,40,,17,,,,,,,,,,,,,,,3,,,,,,,,,,,,,22,,,,,,,,39,1 java.lang,16,,76,,,,,,,,,,,,8,,,,,3,,4,,,1,,,,,,,,,,,,,,,,53,23 -java.net,12,3,16,,,,,,,,,,,,,,,12,,,,,,,,,,,,,,,,,,,,,,3,16, -java.nio,20,,15,,15,,,,,,,,,,,,,,,3,,,,,,,,,,,,,2,,,,,,,,15, -java.sql,13,,2,,,,,,,,4,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,1,1 +java.net,12,3,17,,,,,,,,,,,,,,,12,,,,,,,,,,,,,,,,,,,,,,3,17, +java.nio,25,,29,,19,,,,,,,,,,,,,,,4,,,,,,,,,,,,,2,,,,,,,,29, +java.sql,13,,3,,,,,,,,4,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,2,1 java.util,44,,465,,,,,,,,,,,,34,,,,,,,,5,2,,1,2,,,,,,,,,,,,,,38,427 javafx.scene.web,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, javax.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,, +javax.imageio.stream,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57, javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 javax.management.remote,2,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -javax.naming,7,,,,,,,,,,,,6,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +javax.naming,7,,1,,,,,,,,,,6,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1, javax.net.ssl,2,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,, javax.script,1,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, -javax.servlet,4,21,2,,,,,3,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,2, +javax.servlet,5,21,2,,,,,3,1,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,21,2, javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, javax.ws.rs.client,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, @@ -99,6 +109,7 @@ org.apache.velocity.runtime,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,, org.codehaus.cargo.container.installer,3,,,,2,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, org.codehaus.groovy.control,1,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,, +org.geogebra.web.full.main,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,, org.hibernate,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,, org.jboss.logging,324,,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,,,,, org.jdbi.v3.core,6,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -114,7 +125,7 @@ org.springframework.boot.jdbc,1,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13 org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, org.springframework.data.repository,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -org.springframework.http,14,,70,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,,,,,,,,60,10 +org.springframework.http,14,,71,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,,,,,,,,61,10 org.springframework.jdbc.core,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,, org.springframework.jdbc.datasource,4,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,, @@ -128,7 +139,7 @@ org.springframework.web.client,13,3,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,3,, org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,, org.springframework.web.multipart,,12,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,13, org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.web.util,,,163,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,25 +org.springframework.web.util,,,165,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,140,25 org.thymeleaf,2,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,2, org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index b0b240d9acc..e2a186f1967 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -7,7 +7,7 @@ Java framework & library support :widths: auto Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE‑022` :sub:`Path injection`,`CWE‑036` :sub:`Path traversal`,`CWE‑079` :sub:`Cross-site scripting`,`CWE‑089` :sub:`SQL injection`,`CWE‑090` :sub:`LDAP injection`,`CWE‑094` :sub:`Code injection`,`CWE‑319` :sub:`Cleartext transmission` - Android,``android.*``,52,479,138,,,3,67,,, + Android,``android.*``,52,481,138,,,3,67,,, Android extensions,``androidx.*``,5,183,19,,,,,,, `Apache Commons Collections `_,"``org.apache.commons.collections``, ``org.apache.commons.collections4``",,1600,,,,,,,, `Apache Commons IO `_,``org.apache.commons.io``,,560,107,91,,,,,,15 @@ -15,13 +15,13 @@ Java framework & library support `Apache Commons Text `_,``org.apache.commons.text``,,272,,,,,,,, `Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,143,28,,,3,,,,25 `Apache Log4j 2 `_,``org.apache.logging.log4j``,,8,359,,,,,,, - `Google Guava `_,``com.google.common.*``,,728,39,,6,,,,, + `Google Guava `_,``com.google.common.*``,,730,39,,6,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,,, `JSON-java `_,``org.json``,,236,,,,,,,, - Java Standard Library,``java.*``,3,615,147,32,,,9,,,12 - Java extensions,"``javax.*``, ``jakarta.*``",63,609,33,1,,4,,1,1,2 + Java Standard Library,``java.*``,3,631,152,36,,,9,,,12 + Java extensions,"``javax.*``, ``jakarta.*``",63,611,34,1,,4,,1,1,2 Kotlin Standard Library,``kotlin*``,,1835,12,10,,,,,,2 - `Spring `_,``org.springframework.*``,29,477,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.remoting``, ``io.netty.resolver``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``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.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``",60,308,299,6,,,18,18,,12 - Totals,,217,8477,1612,140,6,10,113,33,1,97 + `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.model``, ``hudson.os``, ``hudson.remoting``, ``hudson.util``, ``io.netty.bootstrap``, ``io.netty.channel``, ``io.netty.handler.codec.http``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util.internal``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``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.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``",60,314,328,12,,,18,18,,28 + Totals,,217,8508,1647,150,6,10,113,33,1,113 diff --git a/java/kotlin-extractor/build.py b/java/kotlin-extractor/build.py index f31484bdec3..b52ff05b00e 100755 --- a/java/kotlin-extractor/build.py +++ b/java/kotlin-extractor/build.py @@ -11,8 +11,6 @@ import os import os.path import sys import shlex -import distutils -from distutils import dir_util def parse_args(): @@ -203,7 +201,7 @@ def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, version.replace('.', '_') if os.path.exists(d): # copy and overwrite files from the version folder to the include folder - distutils.dir_util.copy_tree(d, include_version_folder) + shutil.copytree(d, include_version_folder, dirs_exist_ok=True) # remove all version folders: for version in kotlin_plugin_versions.many_versions: diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 00000000000..bf82ff01c6c Binary files /dev/null and b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar differ diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..6686a643d7d --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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 +# +# https://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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.0/apache-maven-3.9.0-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index d7428d81c27..5ff003fb8cb 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,34 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* Removed low-confidence call edges to known neutral call targets from the call graph used in data flow analysis. This includes, for example, custom `List.contains` implementations when the best inferrable type at the call site is simply `List`. +* Added more sink and summary dataflow models for the following packages: + * `java.io` + * `java.lang` + * `java.sql` + * `javafx.scene.web` + * `org.apache.commons.compress.archivers.tar` + * `org.apache.http.client.utils` + * `org.codehaus.cargo.container.installer` +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getRepresentedString` predicate from the `StringLiteral` class. +* Deleted the deprecated `ServletWriterSource` class. +* Deleted the deprecated `getGroupID`, `getArtefactID`, and `artefactMatches` predicates from the `MavenRepoJar` class. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/java/ql/lib/change-notes/2023-02-15-add-top-jdk-models.md b/java/ql/lib/change-notes/2023-02-15-add-top-jdk-models.md new file mode 100644 index 00000000000..a74fb161e58 --- /dev/null +++ b/java/ql/lib/change-notes/2023-02-15-add-top-jdk-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added more dataflow models for frequently-used JDK APIs. diff --git a/java/ql/lib/change-notes/2023-03-03-delete-deps.md b/java/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index bdc84d43d26..00000000000 --- a/java/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. -* Deleted the deprecated `getRepresentedString` predicate from the `StringLiteral` class. -* Deleted the deprecated `ServletWriterSource` class. -* Deleted the deprecated `getGroupID`, `getArtefactID`, and `artefactMatches` predicates from the `MavenRepoJar` class. \ No newline at end of file diff --git a/java/ql/lib/change-notes/2023-03-09-more-models.md b/java/ql/lib/change-notes/2023-03-09-more-models.md deleted file mode 100644 index 2d763c0d22b..00000000000 --- a/java/ql/lib/change-notes/2023-03-09-more-models.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -category: majorAnalysis ---- -* Added more sink and summary dataflow models for the following packages: - * `java.io` - * `java.lang` - * `java.sql` - * `javafx.scene.web` - * `org.apache.commons.compress.archivers.tar` - * `org.apache.http.client.utils` - * `org.codehaus.cargo.container.installer` diff --git a/java/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/java/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/java/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/java/ql/lib/change-notes/2023-03-14-neutral-dispatch.md b/java/ql/lib/change-notes/2023-03-14-neutral-dispatch.md deleted file mode 100644 index f01e8700757..00000000000 --- a/java/ql/lib/change-notes/2023-03-14-neutral-dispatch.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: majorAnalysis ---- -* Removed low-confidence call edges to known neutral call targets from the call graph used in data flow analysis. This includes, for example, custom `List.contains` implementations when the best inferrable type at the call site is simply `List`. diff --git a/java/ql/lib/change-notes/2023-03-20-nativesql-summary.md b/java/ql/lib/change-notes/2023-03-20-nativesql-summary.md new file mode 100644 index 00000000000..8d350f77bd3 --- /dev/null +++ b/java/ql/lib/change-notes/2023-03-20-nativesql-summary.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a summary model for the `nativeSQL` method of the `java.sql.Connection` interface. diff --git a/java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md b/java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md new file mode 100644 index 00000000000..20738f07c05 --- /dev/null +++ b/java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added the extensible abstract class `JndiInjectionSanitizer`. Now this class can be extended to add more sanitizers to the `java/jndi-injection` query. diff --git a/java/ql/lib/change-notes/released/0.5.5.md b/java/ql/lib/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..60e487e4c0c --- /dev/null +++ b/java/ql/lib/change-notes/released/0.5.5.md @@ -0,0 +1,30 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* Removed low-confidence call edges to known neutral call targets from the call graph used in data flow analysis. This includes, for example, custom `List.contains` implementations when the best inferrable type at the call site is simply `List`. +* Added more sink and summary dataflow models for the following packages: + * `java.io` + * `java.lang` + * `java.sql` + * `javafx.scene.web` + * `org.apache.commons.compress.archivers.tar` + * `org.apache.http.client.utils` + * `org.codehaus.cargo.container.installer` +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getRepresentedString` predicate from the `StringLiteral` class. +* Deleted the deprecated `ServletWriterSource` class. +* Deleted the deprecated `getGroupID`, `getArtefactID`, and `artefactMatches` predicates from the `MavenRepoJar` class. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/java/ql/lib/ext/java.awt.model.yml b/java/ql/lib/ext/java.awt.model.yml new file mode 100644 index 00000000000..4bbbc3738cf --- /dev/null +++ b/java/ql/lib/ext/java.awt.model.yml @@ -0,0 +1,16 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] + - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "ReturnValue", "value", "manual"] + - ["java.awt", "Container", True, "add", "(Component,Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + # The below APIs have numeric flow and are currently being stored as neutral models. + # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.awt", "Insets", "Insets", "(int,int,int,int)", "manual"] # value-numeric diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index 4ba64033fa4..a14f4fe7782 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -69,6 +69,9 @@ extensions: - ["java.io", "File", True, "getCanonicalFile", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getCanonicalPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getName", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "getParentFile", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "getPath", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "listFiles", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toURI", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -88,9 +91,28 @@ extensions: - ["java.io", "OutputStream", True, "write", "(int)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "Reader", True, "read", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["java.io", "StringReader", False, "StringReader", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "UncheckedIOException", False, "UncheckedIOException", "(IOException)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.io", "Writer", True, "write", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - addsTo: pack: codeql/java-all extensible: neutralModel data: + - ["java.io", "Closeable", "close", "()", "manual"] + - ["java.io", "DataOutput", "writeBoolean", "(boolean)", "manual"] + - ["java.io", "File", "delete", "()", "manual"] - ["java.io", "File", "exists", "()", "manual"] + - ["java.io", "File", "isFile", "()", "manual"] + - ["java.io", "File", "length", "()", "manual"] + - ["java.io", "File", "isDirectory", "()", "manual"] + - ["java.io", "File", "mkdirs", "()", "manual"] + - ["java.io", "FileInputStream", "FileInputStream", "(File)", "manual"] + - ["java.io", "InputStream", "close", "()", "manual"] + - ["java.io", "OutputStream", "flush", "()", "manual"] + + # The below APIs have numeric flow and are currently being stored as neutral models. + # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.io", "DataInput", "readInt", "()", "manual"] # taint-numeric + - ["java.io", "DataInput", "readLong", "()", "manual"] # taint-numeric + - ["java.io", "DataOutput", "writeInt", "(int)", "manual"] # taint-numeric + - ["java.io", "DataOutput", "writeLong", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.lang.invoke.model.yml b/java/ql/lib/ext/java.lang.invoke.model.yml new file mode 100644 index 00000000000..16259190a02 --- /dev/null +++ b/java/ql/lib/ext/java.lang.invoke.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.lang.invoke", "MethodHandles", "lookup", "()", "manual"] diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 774cf751a13..f1b84ae70b6 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -37,6 +37,8 @@ extensions: - ["java.lang", "AbstractStringBuilder", True, "AbstractStringBuilder", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + # When `WithoutElement` is implemented for Java, `java.lang.AbstractStringBuilder#delete` might require a `taint` step of the form `Argument[this].WithoutElement -> Argument[this]` in addition to the below `value` step. + - ["java.lang", "AbstractStringBuilder", True, "delete", "(int,int)", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "getChars", "", "", "Argument[this]", "Argument[2]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "insert", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "insert", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] @@ -48,16 +50,21 @@ extensions: - ["java.lang", "AbstractStringBuilder", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "Appendable", True, "append", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "Appendable", True, "append", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.lang", "AssertionError", False, "AssertionError", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "CharSequence", True, "charAt", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "subSequence", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.lang", "Class", False, "cast", "(Object)", "", "Argument[0]", "ReturnValue", "value", "manual"] - ["java.lang", "Exception", False, "Exception", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[1]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.lang", "IllegalArgumentException", False, "IllegalArgumentException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "IllegalStateException", False, "IllegalStateException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "IndexOutOfBoundsException", False, "IndexOutOfBoundsException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Iterable", True, "forEach", "(Consumer)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.lang", "Iterable", True, "iterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.lang", "Iterable", True, "spliterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] + - ["java.lang", "NullPointerException", False, "NullPointerException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapKey", "ReturnValue.MapKey", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapValue", "ReturnValue.MapValue", "value", "manual"] @@ -107,50 +114,105 @@ extensions: - ["java.lang", "StringBuffer", True, "StringBuffer", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", True, "StringBuilder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "System", False, "arraycopy", "", "", "Argument[0]", "Argument[2]", "taint", "manual"] + - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.lang", "Thread", False, "Thread", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Thread.name]", "value", "manual"] + - ["java.lang", "Thread", True, "getName", "()", "", "Argument[this].SyntheticField[java.lang.Thread.name]", "ReturnValue", "value", "manual"] + - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[this].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] + - ["java.lang", "ThreadLocal", True, "set", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.ThreadLocal.value]", "value", "manual"] - ["java.lang", "Throwable", False, "Throwable", "(Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] + - ["java.lang", "Throwable", False, "Throwable", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Throwable", True, "getCause", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] + - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] + - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] + - addsTo: pack: codeql/java-all extensible: neutralModel data: - ["java.lang", "AbstractStringBuilder", "length", "()", "manual"] + - ["java.lang", "AbstractStringBuilder", "setCharAt", "(int,char)", "manual"] + - ["java.lang", "AbstractStringBuilder", "setLength", "(int)", "manual"] + - ["java.lang", "Boolean", "booleanValue", "()", "manual"] - ["java.lang", "Boolean", "equals", "(Object)", "manual"] + - ["java.lang", "Boolean", "parseBoolean", "(String)", "manual"] + - ["java.lang", "Boolean", "valueOf", "(boolean)", "manual"] + - ["java.lang", "CharSequence", "length", "()", "manual"] + - ["java.lang", "Class", "forName", "(String)", "manual"] + - ["java.lang", "Class", "getCanonicalName", "()", "manual"] - ["java.lang", "Class", "getClassLoader", "()", "manual"] + - ["java.lang", "Class", "getDeclaredConstructor", "(Class[])", "manual"] # This model may be changed to a taint step for an unsafe reflection query in the future. + - ["java.lang", "Class", "getDeclaredField", "(String)", "manual"] # This model may be changed to a taint step for an unsafe reflection query in the future. + - ["java.lang", "Class", "getMethod", "(String,Class[])", "manual"] # This model may be changed to a taint step for an unsafe reflection query in the future. - ["java.lang", "Class", "getName", "()", "manual"] + - ["java.lang", "Class", "getResource", "(String)", "manual"] + - ["java.lang", "Class", "getResourceAsStream", "(String)", "manual"] - ["java.lang", "Class", "getSimpleName", "()", "manual"] - ["java.lang", "Class", "isAssignableFrom", "(Class)", "manual"] + - ["java.lang", "Class", "isInstance", "(Object)", "manual"] + - ["java.lang", "Class", "toString", "()", "manual"] + - ["java.lang", "ClassLoader", "getResource", "(String)", "manual"] + - ["java.lang", "ClassLoader", "getResourceAsStream", "(String)", "manual"] - ["java.lang", "Enum", "Enum", "(String,int)", "manual"] - ["java.lang", "Enum", "equals", "(Object)", "manual"] + - ["java.lang", "Enum", "hashCode", "()", "manual"] - ["java.lang", "Enum", "name", "()", "manual"] + - ["java.lang", "Enum", "ordinal", "()", "manual"] - ["java.lang", "Enum", "toString", "()", "manual"] + - ["java.lang", "Integer", "equals", "(Object)", "manual"] - ["java.lang", "Long", "equals", "(Object)", "manual"] - ["java.lang", "Object", "equals", "(Object)", "manual"] - ["java.lang", "Object", "getClass", "()", "manual"] - ["java.lang", "Object", "hashCode", "()", "manual"] - ["java.lang", "Object", "toString", "()", "manual"] + - ["java.lang", "Runnable", "run", "()", "manual"] + - ["java.lang", "Runtime", "getRuntime", "()", "manual"] + - ["java.lang", "String", "compareTo", "(String)", "manual"] - ["java.lang", "String", "contains", "(CharSequence)", "manual"] - ["java.lang", "String", "endsWith", "(String)", "manual"] - ["java.lang", "String", "equals", "(Object)", "manual"] - ["java.lang", "String", "equalsIgnoreCase", "(String)", "manual"] - ["java.lang", "String", "hashCode", "()", "manual"] + - ["java.lang", "String", "indexOf", "(int)", "manual"] - ["java.lang", "String", "indexOf", "(String)", "manual"] - ["java.lang", "String", "isEmpty", "()", "manual"] + - ["java.lang", "String", "lastIndexOf", "(int)", "manual"] + - ["java.lang", "String", "lastIndexOf", "(String)", "manual"] - ["java.lang", "String", "length", "()", "manual"] - ["java.lang", "String", "startsWith", "(String)", "manual"] + - ["java.lang", "String", "valueOf", "(boolean)", "manual"] - ["java.lang", "System", "currentTimeMillis", "()", "manual"] + - ["java.lang", "System", "exit", "(int)", "manual"] + - ["java.lang", "System", "getenv", "(String)", "manual"] + - ["java.lang", "System", "identityHashCode", "(Object)", "manual"] + - ["java.lang", "System", "lineSeparator", "()", "manual"] - ["java.lang", "System", "nanoTime", "()", "manual"] - ["java.lang", "Thread", "currentThread", "()", "manual"] + - ["java.lang", "Thread", "getContextClassLoader", "()", "manual"] + - ["java.lang", "Thread", "interrupt", "()", "manual"] - ["java.lang", "Thread", "sleep", "(long)", "manual"] + - ["java.lang", "Thread", "start", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric - - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric - - ["java.lang", "Integer", "toString", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "valueOf", "(int)", "manual"] # taint-numeric - - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric - - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric - - ["java.lang", "Long", "toString", "()", "manual"] # taint-numeric - - ["java.lang", "Math", "min", "(int,int)", "manual"] # value-numeric - - ["java.lang", "String", "valueOf", "(int)", "manual"] # taint-numeric - - ["java.lang", "String", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.lang", "Double", "doubleToLongBits", "(double)", "manual"] # taint-numeric + - ["java.lang", "Double", "parseDouble", "(String)", "manual"] # taint-numeric + - ["java.lang", "Double", "valueOf", "(double)", "manual"] # taint-numeric + - ["java.lang", "Integer", "Integer", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric + - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric + - ["java.lang", "Integer", "toHexString", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "toString", "", "manual"] # taint-numeric + - ["java.lang", "Integer", "valueOf", "", "manual"] # taint-numeric + - ["java.lang", "Long", "Long", "(long)", "manual"] # taint-numeric + - ["java.lang", "Long", "intValue", "()", "manual"] # taint-numeric + - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric + - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric + - ["java.lang", "Long", "toString", "", "manual"] # taint-numeric + - ["java.lang", "Long", "valueOf", "", "manual"] # taint-numeric + - ["java.lang", "Math", "max", "", "manual"] # value-numeric + - ["java.lang", "Math", "min", "", "manual"] # value-numeric + - ["java.lang", "Number", "doubleValue", "()", "manual"] # taint-numeric + - ["java.lang", "Number", "intValue", "()", "manual"] # taint-numeric + - ["java.lang", "Number", "longValue", "()", "manual"] # taint-numeric + - ["java.lang", "String", "valueOf", "(int)", "manual"] # taint-numeric + - ["java.lang", "String", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.lang.reflect.model.yml b/java/ql/lib/ext/java.lang.reflect.model.yml new file mode 100644 index 00000000000..9430807d00b --- /dev/null +++ b/java/ql/lib/ext/java.lang.reflect.model.yml @@ -0,0 +1,10 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + # The below models may be changed to taint steps for an unsafe reflection query in the future. + - ["java.lang.reflect", "Constructor", "newInstance", "(Object[])", "manual"] + - ["java.lang.reflect", "Field", "get", "(Object)", "manual"] + - ["java.lang.reflect", "Method", "getName", "()", "manual"] + - ["java.lang.reflect", "Method", "invoke", "(Object,Object[])", "manual"] diff --git a/java/ql/lib/ext/java.math.model.yml b/java/ql/lib/ext/java.math.model.yml index 1d45a4076bf..b3ee529339f 100644 --- a/java/ql/lib/ext/java.math.model.yml +++ b/java/ql/lib/ext/java.math.model.yml @@ -7,6 +7,16 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.math", "BigDecimal", "BigDecimal", "(String)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "valueOf", "(double)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "BigDecimal", "", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "add", "(BigDecimal)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "doubleValue", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "intValue", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "multiply", "(BigDecimal)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "setScale", "(int,RoundingMode)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "subtract", "(BigDecimal)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "toBigInteger", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "toString", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "valueOf", "", "manual"] # taint-numeric + - ["java.math", "BigInteger", "BigInteger", "(String)", "manual"] # taint-numeric + - ["java.math", "BigInteger", "or", "(BigInteger)", "manual"] # taint-numeric + - ["java.math", "BigInteger", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.nio.charset.model.yml b/java/ql/lib/ext/java.nio.charset.model.yml new file mode 100644 index 00000000000..16e8943f99c --- /dev/null +++ b/java/ql/lib/ext/java.nio.charset.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.nio.charset", "Charset", "name", "()", "manual"] diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index cca00413c33..6c5c2d13f96 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -43,6 +43,7 @@ extensions: - ["java.nio.file", "FileSystem", True, "getPath", "(String,String[])", "", "Argument[1]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "FileSystem", True, "getPathMatcher", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "FileSystem", True, "getRootDirectories", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.nio.file", "Path", True, "getFileName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "getParent", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "normalize", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] @@ -61,3 +62,9 @@ extensions: # - ["java.nio.file", "Files", True, "walkFileTree", "(Path,FileVisitor)", "", "Argument[0]", "Argument[1].Method[preVisitDirectory(Path,BasicFileAttributes)].Parameter[0]", "taint", "ai-generated"] # - ["java.nio.file", "Files", True, "walkFileTree", "(Path,FileVisitor)", "", "Argument[0]" "Argument[1].Method[visitFile(Path,BasicFileAttributes)].Parameter[0]", "taint", "ai-generated"] # - ["java.nio.file", "Files", True, "walkFileTree", "(Path,FileVisitor)", "", "Argument[0]", "Argument[1].Method[visitFileFailed(Path,IOException)].Parameter[0]", "taint", "ai-generated"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.nio.file", "Files", "exists", "(Path,LinkOption[])", "manual"] diff --git a/java/ql/lib/ext/java.nio.model.yml b/java/ql/lib/ext/java.nio.model.yml index 675b85bf766..d64d4809c5c 100644 --- a/java/ql/lib/ext/java.nio.model.yml +++ b/java/ql/lib/ext/java.nio.model.yml @@ -6,3 +6,11 @@ extensions: - ["java.nio", "ByteBuffer", False, "array", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio", "ByteBuffer", False, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio", "ByteBuffer", False, "wrap", "(byte[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.nio", "Buffer", "position", "()", "manual"] + - ["java.nio", "Buffer", "remaining", "()", "manual"] + - ["java.nio", "ByteBuffer", "allocate", "(int)", "manual"] diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index e5516043989..7c8174fca43 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -20,14 +20,28 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["java.sql", "Connection", True, "nativeSQL", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.sql", "PreparedStatement", True, "setString", "(int,String)", "", "Argument[1]", "Argument[this]", "value", "manual"] - ["java.sql", "ResultSet", True, "getString", "(String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - addsTo: pack: codeql/java-all extensible: neutralModel data: + - ["java.sql", "Connection", "createStatement", "()", "manual"] + - ["java.sql", "PreparedStatement", "executeUpdate", "()", "manual"] + - ["java.sql", "PreparedStatement", "executeQuery", "()", "manual"] - ["java.sql", "ResultSet", "next", "()", "manual"] + - ["java.sql", "Statement", "close", "()", "manual"] + # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.sql", "PreparedStatement", "setInt", "(int,int)", "manual"] # value-numeric - - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric + - ["java.sql", "PreparedStatement", "setInt", "(int,int)", "manual"] # value-numeric + - ["java.sql", "PreparedStatement", "setLong", "(int,long)", "manual"] # value-numeric + - ["java.sql", "ResultSet", "getInt", "(int)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getLong", "(String)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric, potentially interesting for second order SQL injection + - ["java.sql", "ResultSet", "getTimestamp", "(String)", "manual"] # taint-numeric + - ["java.sql", "Timestamp", "Timestamp", "(long)", "manual"] # taint-numeric + - ["java.sql", "Timestamp", "getTime", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.text.model.yml b/java/ql/lib/ext/java.text.model.yml index bbb01596f17..86099195f46 100644 --- a/java/ql/lib/ext/java.text.model.yml +++ b/java/ql/lib/ext/java.text.model.yml @@ -6,4 +6,5 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.text", "DateFormat", "format", "(Date)", "manual"] # taint-numeric + - ["java.text", "DateFormat", "parse", "(String)", "manual"] # taint-numeric - ["java.text", "SimpleDateFormat", "SimpleDateFormat", "(String)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.time.chrono.model.yml b/java/ql/lib/ext/java.time.chrono.model.yml new file mode 100644 index 00000000000..b222058d932 --- /dev/null +++ b/java/ql/lib/ext/java.time.chrono.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.time.chrono", "ChronoZonedDateTime", "toInstant", "()", "manual"] diff --git a/java/ql/lib/ext/java.time.format.model.yml b/java/ql/lib/ext/java.time.format.model.yml new file mode 100644 index 00000000000..5cfb255733c --- /dev/null +++ b/java/ql/lib/ext/java.time.format.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.time.format", "DateTimeFormatter", "format", "(TemporalAccessor)", "manual"] + - ["java.time.format", "DateTimeFormatter", "ofPattern", "(String)", "manual"] diff --git a/java/ql/lib/ext/java.time.model.yml b/java/ql/lib/ext/java.time.model.yml index 002240c6488..7f12490964d 100644 --- a/java/ql/lib/ext/java.time.model.yml +++ b/java/ql/lib/ext/java.time.model.yml @@ -4,8 +4,22 @@ extensions: extensible: neutralModel data: - ["java.time", "Instant", "now", "()", "manual"] + - ["java.time", "LocalDate", "now", "()", "manual"] + - ["java.time", "LocalDateTime", "now", "()", "manual"] - ["java.time", "ZonedDateTime", "now", "()", "manual"] + - ["java.time", "ZoneId", "of", "(String)", "manual"] + - ["java.time", "ZoneId", "systemDefault", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.time", "LocalDate", "of", "(int,int,int)", "manual"] # taint-numeric + - ["java.time", "Duration", "ofMillis", "(long)", "manual"] # taint-numeric + - ["java.time", "Duration", "ofMinutes", "(long)", "manual"] # taint-numeric + - ["java.time", "Duration", "ofSeconds", "(long)", "manual"] # taint-numeric + - ["java.time", "Duration", "toMillis", "()", "manual"] # taint-numeric + - ["java.time", "Instant", "ofEpochMilli", "(long)", "manual"] # taint-numeric + - ["java.time", "Instant", "parse", "(CharSequence)", "manual"] # taint-numeric + - ["java.time", "Instant", "toEpochMilli", "()", "manual"] # taint-numeric + - ["java.time", "LocalDate", "plusDays", "(long)", "manual"] # taint-numeric + - ["java.time", "LocalDate", "of", "(int,int,int)", "manual"] # taint-numeric + - ["java.time", "LocalDate", "parse", "(CharSequence)", "manual"] # taint-numeric + - ["java.time", "LocalDateTime", "of", "(int,int,int,int,int,int)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml index b4b49273790..b92ed441ade 100644 --- a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml @@ -5,12 +5,23 @@ extensions: data: - ["java.util.concurrent.atomic", "AtomicReference", False, "AtomicReference", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "value", "manual"] - ["java.util.concurrent.atomic", "AtomicReference", False, "get", "()", "", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "ReturnValue", "value", "manual"] + - ["java.util.concurrent.atomic", "AtomicReference", False, "set", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "value", "manual"] - addsTo: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.concurrent.atomic", "AtomicBoolean", "AtomicBoolean", "(boolean)", "manual"] + - ["java.util.concurrent.atomic", "AtomicBoolean", "compareAndSet", "(boolean,boolean)", "manual"] + - ["java.util.concurrent.atomic", "AtomicBoolean", "get", "()", "manual"] + - ["java.util.concurrent.atomic", "AtomicBoolean", "set", "(boolean)", "manual"] + # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.util.concurrent.atomic", "AtomicInteger", "AtomicInteger", "(int)", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicInteger", "get", "()", "manual"] # value-numeric + - ["java.util.concurrent.atomic", "AtomicInteger", "incrementAndGet", "()", "manual"] # taint-numeric + - ["java.util.concurrent.atomic", "AtomicLong", "AtomicLong", "(long)", "manual"] # value-numeric + - ["java.util.concurrent.atomic", "AtomicLong", "addAndGet", "(long)", "manual"] # taint-numeric + - ["java.util.concurrent.atomic", "AtomicLong", "get", "()", "manual"] # value-numeric + - ["java.util.concurrent.atomic", "AtomicLong", "incrementAndGet", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.locks.model.yml b/java/ql/lib/ext/java.util.concurrent.locks.model.yml new file mode 100644 index 00000000000..54a86493fc1 --- /dev/null +++ b/java/ql/lib/ext/java.util.concurrent.locks.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.concurrent.locks", "Lock", "lock", "()", "manual"] + - ["java.util.concurrent.locks", "Lock", "unlock", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.concurrent.model.yml b/java/ql/lib/ext/java.util.concurrent.model.yml index dd0c6b75754..723035f408e 100644 --- a/java/ql/lib/ext/java.util.concurrent.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.model.yml @@ -17,7 +17,13 @@ extensions: - ["java.util.concurrent", "BlockingQueue", True, "poll", "(long,TimeUnit)", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "put", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "take", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "complete", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.util.concurrent.Future.value]", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "completedFuture", "(Object)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.concurrent.Future.value]", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[this].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] + - ["java.util.concurrent", "CompletionStage", False, "toCompletableFuture", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util.concurrent", "ConcurrentHashMap", True, "elements", "()", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] + - ["java.util.concurrent", "ExecutorService", True, "submit", "(Runnable)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.util.concurrent", "Future", True, "get", "()", "", "Argument[this].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "transfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object,long,TimeUnit)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] @@ -26,9 +32,15 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.concurrent", "CompletableFuture", "completeExceptionally", "(Throwable)", "manual"] + - ["java.util.concurrent", "CompletableFuture", "isDone", "()", "manual"] + - ["java.util.concurrent", "CountDownLatch", "await", "", "manual"] - ["java.util.concurrent", "CountDownLatch", "countDown", "()", "manual"] + - ["java.util.concurrent", "Executor", "execute", "(Runnable)", "manual"] + - ["java.util.concurrent", "ExecutorService", "shutdown", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.util.concurrent", "CountDownLatch", "CountDownLatch", "(int)", "manual"] # value-numeric - ["java.util.concurrent", "CountDownLatch", "getCount", "()", "manual"] # value-numeric + - ["java.util.concurrent", "TimeUnit", "toMillis", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.function.model.yml b/java/ql/lib/ext/java.util.function.model.yml index 90ed9c1b9ab..8cdab4149cd 100644 --- a/java/ql/lib/ext/java.util.function.model.yml +++ b/java/ql/lib/ext/java.util.function.model.yml @@ -4,3 +4,9 @@ extensions: extensible: sinkModel data: - ["java.util.function", "Predicate", False, "test", "(Object)", "", "Argument[this]", "regex-use[0]", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.function", "Function", "identity", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.logging.model.yml b/java/ql/lib/ext/java.util.logging.model.yml index 41a59ceee3a..b3f4188ed97 100644 --- a/java/ql/lib/ext/java.util.logging.model.yml +++ b/java/ql/lib/ext/java.util.logging.model.yml @@ -41,4 +41,12 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["java.util.logging", "Logger", False, "getLogger", "(String)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.logging.Logger.name]", "value", "manual"] + - ["java.util.logging", "Logger", False, "getName", "()", "", "Argument[this].SyntheticField[java.util.logging.Logger.name]", "ReturnValue", "value", "manual"] - ["java.util.logging", "LogRecord", False, "LogRecord", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.logging", "Logger", "isLoggable", "(Level)", "manual"] diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index 5f3dad67c37..5df5b1bf4bc 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -124,6 +124,8 @@ extensions: - ["java.util", "EnumMap", False, "EnumMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "Enumeration", True, "asIterator", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util", "Enumeration", True, "nextElement", "", "", "Argument[this].Element", "ReturnValue", "value", "manual"] + - ["java.util", "EventObject", False, "EventObject", "(Object)", "", "Argument[0]", "Argument[this].Field[java.util.EventObject.source]", "value", "manual"] + - ["java.util", "EventObject", True, "getSource", "()", "", "Argument[this].Field[java.util.EventObject.source]", "ReturnValue", "value", "manual"] - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapKey", "Argument[this].MapKey", "value", "manual"] - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "HashSet", False, "HashSet", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] @@ -290,6 +292,7 @@ extensions: - ["java.util", "Queue", True, "peek", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Queue", True, "poll", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Queue", True, "remove", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] + - ["java.util", "ResourceBundle", True, "getString", "(String)", "", "Argument[this].MapValue", "ReturnValue", "value", "manual"] - ["java.util", "Scanner", True, "Scanner", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.util", "Scanner", True, "findInLine", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util", "Scanner", True, "findWithinHorizon", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -363,36 +366,74 @@ extensions: extensible: neutralModel data: - ["java.util", "ArrayList", "ArrayList", "(int)", "manual"] + - ["java.util", "ArrayList", "isEmpty", "()", "manual"] - ["java.util", "ArrayList", "size", "()", "manual"] + - ["java.util", "Arrays", "toString", "(Object[])", "manual"] + - ["java.util", "Calendar", "getInstance", "()", "manual"] + - ["java.util", "Collection", "contains", "(Object)", "manual"] - ["java.util", "Collection", "isEmpty", "()", "manual"] - ["java.util", "Collection", "size", "()", "manual"] - ["java.util", "Collections", "emptyList", "()", "manual"] - ["java.util", "Collections", "emptyMap", "()", "manual"] - ["java.util", "Collections", "emptySet", "()", "manual"] + - ["java.util", "Collections", "sort", "", "manual"] + - ["java.util", "Enumeration", "hasMoreElements", "()", "manual"] + - ["java.util", "HashMap", "containsKey", "(Object)", "manual"] + - ["java.util", "HashMap", "HashMap", "(int)", "manual"] + - ["java.util", "HashMap", "size", "()", "manual"] + - ["java.util", "HashSet", "HashSet", "(int)", "manual"] - ["java.util", "Iterator", "hasNext", "()", "manual"] - ["java.util", "List", "contains", "(Object)", "manual"] + - ["java.util", "List", "equals", "(Object)", "manual"] + - ["java.util", "List", "hashCode", "()", "manual"] + - ["java.util", "List", "indexOf", "(Object)", "manual"] - ["java.util", "List", "isEmpty", "()", "manual"] + - ["java.util", "List", "of", "()", "manual"] + - ["java.util", "List", "sort", "(Comparator)", "manual"] - ["java.util", "List", "size", "()", "manual"] + - ["java.util", "Locale", "forLanguageTag", "(String)", "manual"] - ["java.util", "Map", "containsKey", "(Object)", "manual"] - ["java.util", "Map", "isEmpty", "()", "manual"] - ["java.util", "Map", "size", "()", "manual"] - ["java.util", "Objects", "equals", "(Object,Object)", "manual"] - ["java.util", "Objects", "hash", "(Object[])", "manual"] + - ["java.util", "Objects", "hashCode", "(Object)", "manual"] + - ["java.util", "Objects", "isNull", "(Object)", "manual"] - ["java.util", "Objects", "nonNull", "(Object)", "manual"] - ["java.util", "Optional", "empty", "()", "manual"] + - ["java.util", "Optional", "isEmpty", "()", "manual"] - ["java.util", "Optional", "isPresent", "()", "manual"] + - ["java.util", "Random", "nextInt", "(int)", "manual"] - ["java.util", "Set", "contains", "(Object)", "manual"] - ["java.util", "Set", "isEmpty", "()", "manual"] - ["java.util", "Set", "size", "()", "manual"] + - ["java.util", "UUID", "equals", "(Object)", "manual"] + - ["java.util", "UUID", "fromString", "(String)", "manual"] - ["java.util", "UUID", "randomUUID", "()", "manual"] - ["java.util", "UUID", "toString", "()", "manual"] + - ["java.util", "TimeZone", "getTimeZone", "(String)", "manual"] + - ["java.util", "Vector", "size", "()", "manual"] # The below APIs are currently being stored as neutral models since `WithoutElement` has not yet been implemented for Java. # When `WithoutElement` is implemented, these should be changed to summary models of the form `Argument[this].WithoutElement -> Argument[this]`. + - ["java.util", "Collection", "removeIf", "(Predicate)", "manual"] + - ["java.util", "Iterator", "remove", "()", "manual"] - ["java.util", "List", "clear", "()", "manual"] + - ["java.util", "List", "remove", "(Object)", "manual"] - ["java.util", "Map", "clear", "()", "manual"] + - ["java.util", "Set", "clear", "()", "manual"] + - ["java.util", "Set", "remove", "(Object)", "manual"] + - ["java.util", "Set", "removeAll", "(Collection)", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.util", "Date", "Date", "(long)", "manual"] # taint-numeric - - ["java.util", "Date", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "add", "(int,int)", "manual"] # taint-numeric + - ["java.util", "Calendar", "get", "(int)", "manual"] # value-numeric + - ["java.util", "Calendar", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "getTimeInMillis", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "set", "(int,int)", "manual"] # value-numeric + - ["java.util", "Calendar", "setTime", "(Date)", "manual"] # taint-numeric + - ["java.util", "Date", "Date", "(long)", "manual"] # taint-numeric + - ["java.util", "Date", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Date", "from", "(Instant)", "manual"] # taint-numeric + - ["java.util", "Date", "toInstant", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.regex.model.yml b/java/ql/lib/ext/java.util.regex.model.yml index d002fd93419..8be0c3105ae 100644 --- a/java/ql/lib/ext/java.util.regex.model.yml +++ b/java/ql/lib/ext/java.util.regex.model.yml @@ -21,6 +21,13 @@ extensions: - ["java.util.regex", "Matcher", False, "replaceAll", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Matcher", False, "replaceFirst", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Matcher", False, "replaceFirst", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.util.regex", "Pattern", False, "compile", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "matcher", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "quote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "split", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.regex", "Matcher", "find", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.stream.model.yml b/java/ql/lib/ext/java.util.stream.model.yml index 1fafd506185..7ef65fd8a83 100644 --- a/java/ql/lib/ext/java.util.stream.model.yml +++ b/java/ql/lib/ext/java.util.stream.model.yml @@ -94,3 +94,9 @@ extensions: data: - ["java.util.stream", "Collectors", "toList", "()", "manual"] - ["java.util.stream", "Collectors", "toSet", "()", "manual"] + - ["java.util.stream", "Stream", "count", "()", "manual"] + + # The below APIs have numeric flow and are currently being stored as neutral models. + # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.util.stream", "IntStream", "mapToObj", "(IntFunction)", "manual"] # taint-numeric + - ["java.util.stream", "IntStream", "range", "(int,int)", "manual"] # taint-numeric diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 90fcc57cebf..263e9321c54 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 0.5.5-dev +version: 0.5.6-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index 94464bd263f..f94658e1372 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -365,6 +365,7 @@ private module ControlFlowGraphImpl { /** * Gets a non-overridable method that always throws an exception or calls `exit`. */ + pragma[assume_small_delta] private Method nonReturningMethod() { result instanceof MethodExit or @@ -381,6 +382,7 @@ private module ControlFlowGraphImpl { /** * Gets a virtual method that always throws an exception or calls `exit`. */ + pragma[assume_small_delta] private EffectivelyNonVirtualMethod likelyNonReturningMethod() { result.getReturnType() instanceof VoidType and not exists(ReturnStmt ret | ret.getEnclosingCallable() = result) and diff --git a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll index a736928361c..39d5bd27311 100644 --- a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll @@ -220,7 +220,7 @@ predicate modelCoverage(string package, int pkgs, string kind, string part, int /** Provides a query predicate to check the MaD models for validation errors. */ module ModelValidation { private string getInvalidModelInput() { - exists(string pred, string input, string part | + exists(string pred, AccessPath input, AccessPathToken part | sinkModel(_, _, _, _, _, _, input, _, _) and pred = "sink" or summaryModel(_, _, _, _, _, _, input, _, _, _) and pred = "summary" @@ -229,9 +229,10 @@ module ModelValidation { invalidSpecComponent(input, part) and not part = "" and not (part = "Argument" and pred = "sink") and - not parseArg(part, _) + not parseArg(part, _) and + not part.getName() = "Field" or - part = input.(AccessPath).getToken(0) and + part = input.getToken(0) and parseParam(part, _) or invalidIndexComponent(input, part) @@ -241,7 +242,7 @@ module ModelValidation { } private string getInvalidModelOutput() { - exists(string pred, string output, string part | + exists(string pred, AccessPath output, AccessPathToken part | sourceModel(_, _, _, _, _, _, output, _, _) and pred = "source" or summaryModel(_, _, _, _, _, _, _, output, _, _) and pred = "summary" @@ -249,7 +250,8 @@ module ModelValidation { ( invalidSpecComponent(output, part) and not part = "" and - not (part = ["Argument", "Parameter"] and pred = "source") + not (part = ["Argument", "Parameter"] and pred = "source") and + not part.getName() = "Field" or invalidIndexComponent(output, part) ) and diff --git a/java/ql/lib/semmle/code/java/dataflow/SSA.qll b/java/ql/lib/semmle/code/java/dataflow/SSA.qll index 000d0275819..d4ff7ed0ac7 100644 --- a/java/ql/lib/semmle/code/java/dataflow/SSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/SSA.qll @@ -451,6 +451,7 @@ private module SsaImpl { * Holds if `f` is live in `b` at index `i`. The rank of `i` is `rankix` as * defined by `callDefUseRank`. */ + pragma[assume_small_delta] private predicate liveAtRank(TrackedField f, BasicBlock b, int rankix, int i) { callDefUseRank(f, b, rankix, i) and ( @@ -564,6 +565,7 @@ private module SsaImpl { } /** Holds if a phi node for `v` is needed at the beginning of basic block `b`. */ + pragma[assume_small_delta] cached predicate phiNode(TrackedVar v, BasicBlock b) { liveAtEntry(v, b) and diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll index f44ed438596..6f53dbd02c1 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll @@ -151,6 +151,7 @@ private module SsaImpl { } /** Holds if a phi node for `v` is needed at the beginning of basic block `b`. */ + pragma[assume_small_delta] cached predicate phiNode(BaseSsaSourceVariable v, BasicBlock b) { liveAtEntry(v, b) and 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 617362ab4f0..865d7b4d6ce 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); 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 c47b0308855..39dbf8dc075 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll index e44cd40d872..6f0067517f9 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll @@ -45,10 +45,6 @@ private Sign certainExprSign(Expr e) { private predicate unknownSign(Expr e) { not exists(certainExprSign(e)) and ( - exists(IntegerLiteral lit | lit = e and not exists(lit.getValue().toInt())) - or - exists(LongLiteral lit | lit = e and not exists(lit.getValue().toFloat())) - or exists(CastingExpr cast, Type fromtyp | cast = e and fromtyp = cast.getSourceType() and diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} diff --git a/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll b/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll index 54b41f28a08..5c20af2f457 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll @@ -53,6 +53,7 @@ private predicate hasPathAnnotation(Annotatable annotatable) { * A method which is annotated with one or more JaxRS resource type annotations e.g. `@GET`, `@POST` etc. */ class JaxRsResourceMethod extends Method { + pragma[assume_small_delta] JaxRsResourceMethod() { exists(AnnotationType a | a = this.getAnAnnotation().getType() and @@ -91,6 +92,7 @@ class JaxRsResourceMethod extends Method { * This class contains resource methods, which are executed in response to requests. */ class JaxRsResourceClass extends Class { + pragma[assume_small_delta] JaxRsResourceClass() { // A root resource class has a @Path annotation on the class. hasPathAnnotation(this) diff --git a/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll b/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll index 8512308f241..c487c6cecc2 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll @@ -28,7 +28,7 @@ class OnActivityResultIncomingIntent extends DataFlow::Node { */ predicate isRemoteSource() { exists(RefType startingType, Expr startActivityForResultArg | - ImplicitStartActivityForResult::hasFlowToExpr(startActivityForResultArg) and + ImplicitStartActivityForResult::flowToExpr(startActivityForResultArg) and // startingType is the class enclosing the method that calls `startActivityForResult`. startingType = startActivityForResultArg.getEnclosingCallable().getDeclaringType() | @@ -104,7 +104,7 @@ private module ImplicitStartActivityForResultConfig implements DataFlow::ConfigS } private module ImplicitStartActivityForResult = - DataFlow::Make; + DataFlow::Global; /** An Android Activity or Fragment. */ private class ActivityOrFragment extends Class { diff --git a/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll b/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll index 72516e5427e..2793f1980c5 100644 --- a/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll +++ b/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll @@ -21,10 +21,10 @@ private module TypeLiteralToParseAsFlowConfig implements DataFlow::ConfigSig { } } -private module TypeLiteralToParseAsFlow = DataFlow::Make; +private module TypeLiteralToParseAsFlow = DataFlow::Global; private TypeLiteral getSourceWithFlowToParseAs() { - TypeLiteralToParseAsFlow::hasFlow(DataFlow::exprNode(result), _) + TypeLiteralToParseAsFlow::flow(DataFlow::exprNode(result), _) } /** A field that is deserialized by `HttpResponse.parseAs`. */ diff --git a/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll index e26d2312f1b..79fd19f4ef2 100644 --- a/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll +++ b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll @@ -108,10 +108,10 @@ private module TypeLiteralToJacksonDatabindFlowConfig implements DataFlow::Confi } private module TypeLiteralToJacksonDatabindFlow = - DataFlow::Make; + DataFlow::Global; private TypeLiteral getSourceWithFlowToJacksonDatabind() { - TypeLiteralToJacksonDatabindFlow::hasFlow(DataFlow::exprNode(result), _) + TypeLiteralToJacksonDatabindFlow::flow(DataFlow::exprNode(result), _) } /** A type whose values are explicitly deserialized in a call to a Jackson method. */ diff --git a/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll index 2855f5989cf..e0c9fbff800 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll @@ -173,4 +173,4 @@ private module SensitiveCommunicationConfig implements DataFlow::ConfigSig { /** * Tracks taint flow from variables containing sensitive information to broadcast Intents. */ -module SensitiveCommunicationFlow = TaintTracking::Make; +module SensitiveCommunicationFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll b/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll index 68b16f7f902..d066f4974a1 100644 --- a/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll @@ -17,15 +17,15 @@ private module ApkInstallationConfig implements DataFlow::ConfigSig { ma.getMethod() instanceof SetDataMethod and ma.getArgument(0) = node.asExpr() and ( - PackageArchiveMimeTypeFlow::hasFlowToExpr(ma.getQualifier()) + PackageArchiveMimeTypeFlow::flowToExpr(ma.getQualifier()) or - InstallPackageActionFlow::hasFlowToExpr(ma.getQualifier()) + InstallPackageActionFlow::flowToExpr(ma.getQualifier()) ) ) } } -module ApkInstallationFlow = DataFlow::Make; +module ApkInstallationFlow = DataFlow::Global; private newtype ActionState = ActionUnset() or @@ -72,7 +72,8 @@ private module InstallPackageActionConfig implements DataFlow::StateConfigSig { predicate isBarrier(DataFlow::Node node, FlowState state) { none() } } -private module InstallPackageActionFlow = TaintTracking::MakeWithState; +private module InstallPackageActionFlow = + TaintTracking::GlobalWithState; private newtype MimeTypeState = MimeTypeUnset() or @@ -117,4 +118,4 @@ private module PackageArchiveMimeTypeConfig implements DataFlow::StateConfigSig } private module PackageArchiveMimeTypeFlow = - TaintTracking::MakeWithState; + TaintTracking::GlobalWithState; diff --git a/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll index 7564993c1ed..94b1877a4a3 100644 --- a/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll @@ -37,4 +37,4 @@ private module FragmentInjectionTaintConfig implements DataFlow::ConfigSig { * Taint-tracking flow for unsafe user input * that is used to create Android fragments dynamically. */ -module FragmentInjectionTaintFlow = TaintTracking::Make; +module FragmentInjectionTaintFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll b/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll index d23a0c8ae4b..970cb4867fd 100644 --- a/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll @@ -53,4 +53,4 @@ private module IntentUriPermissionManipulationConfig implements DataFlow::Config * Taint tracking flow for user-provided Intents being returned to third party apps. */ module IntentUriPermissionManipulationFlow = - TaintTracking::Make; + TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/JndiInjection.qll b/java/ql/lib/semmle/code/java/security/JndiInjection.qll index cacf725cc99..6a05bbfdc2c 100644 --- a/java/ql/lib/semmle/code/java/security/JndiInjection.qll +++ b/java/ql/lib/semmle/code/java/security/JndiInjection.qll @@ -9,6 +9,9 @@ private import semmle.code.java.frameworks.SpringLdap /** A data flow sink for unvalidated user input that is used in JNDI lookup. */ abstract class JndiInjectionSink extends DataFlow::Node { } +/** A sanitizer for JNDI injection vulnerabilities. */ +abstract class JndiInjectionSanitizer extends DataFlow::Node { } + /** * A unit class for adding additional taint steps. * diff --git a/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll index 9130bb6c7a2..970b8a65cef 100644 --- a/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll @@ -17,7 +17,9 @@ class JndiInjectionFlowConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { sink instanceof JndiInjectionSink } override predicate isSanitizer(DataFlow::Node node) { - node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType + node.getType() instanceof PrimitiveType or + node.getType() instanceof BoxedType or + node instanceof JndiInjectionSanitizer } override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { diff --git a/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll index a706da71e50..a26e08d3edc 100644 --- a/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll @@ -38,4 +38,4 @@ private module LogInjectionConfig implements DataFlow::ConfigSig { /** * Taint-tracking flow for tracking untrusted user input used in log entries. */ -module LogInjectionFlow = TaintTracking::Make; +module LogInjectionFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll b/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll index 1f19d9640e2..9d1f9b5081e 100644 --- a/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll +++ b/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll @@ -53,4 +53,4 @@ private module RequestForgeryConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { node instanceof RequestForgerySanitizer } } -module RequestForgeryFlow = TaintTracking::Make; +module RequestForgeryFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll b/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll index e7888afba5d..0d9df09bb74 100644 --- a/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll +++ b/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll @@ -42,4 +42,4 @@ private module RsaWithoutOaepConfig implements DataFlow::ConfigSig { } /** Flow for finding RSA ciphers initialized without using OAEP padding. */ -module RsaWithoutOaepFlow = DataFlow::Make; +module RsaWithoutOaepFlow = DataFlow::Global; diff --git a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll index 2ca0c4b69c0..ea687d32a0a 100644 --- a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll +++ b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll @@ -65,4 +65,4 @@ private module SensitiveLoggerConfig implements DataFlow::ConfigSig { predicate isBarrierIn(Node node) { isSource(node) } } -module SensitiveLoggerFlow = TaintTracking::Make; +module SensitiveLoggerFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll index f347f98c9c3..b59c4b79655 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll @@ -41,4 +41,4 @@ private module UnsafeContentResolutionConfig implements DataFlow::ConfigSig { } /** Taint-tracking flow to find paths from remote sources to content URI resolutions. */ -module UnsafeContentResolutionFlow = TaintTracking::Make; +module UnsafeContentResolutionFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/XSS.qll b/java/ql/lib/semmle/code/java/security/XSS.qll index a2efc852fd2..2680631318f 100644 --- a/java/ql/lib/semmle/code/java/security/XSS.qll +++ b/java/ql/lib/semmle/code/java/security/XSS.qll @@ -43,7 +43,7 @@ private class DefaultXssSink extends XssSink { or exists(MethodAccess ma | ma.getMethod() instanceof WritingMethod and - XssVulnerableWriterSourceToWritingMethodFlow::hasFlowToExpr(ma.getQualifier()) and + XssVulnerableWriterSourceToWritingMethodFlow::flowToExpr(ma.getQualifier()) and this.asExpr() = ma.getArgument(_) ) } @@ -71,7 +71,7 @@ private module XssVulnerableWriterSourceToWritingMethodFlowConfig implements Dat } private module XssVulnerableWriterSourceToWritingMethodFlow = - TaintTracking::Make; + TaintTracking::Global; /** A method that can be used to output data to an output stream or writer. */ private class WritingMethod extends Method { diff --git a/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll b/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll index 02d68fceb5c..d3ac09798a6 100644 --- a/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll +++ b/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll @@ -42,4 +42,4 @@ module XxeLocalConfig implements DataFlow::ConfigSig { /** * Detect taint flow of unvalidated local user input that is used in XML external entity expansion. */ -module XxeLocalFlow = TaintTracking::Make; +module XxeLocalFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll b/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll index 46108b7a680..06bccc993a4 100644 --- a/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll +++ b/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll @@ -42,4 +42,4 @@ module XxeConfig implements DataFlow::ConfigSig { /** * Detect taint flow of unvalidated remote user input that is used in XML external entity expansion. */ -module XxeFlow = TaintTracking::Make; +module XxeFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll b/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll index b852c8393fb..e85e130e381 100644 --- a/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll +++ b/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll @@ -81,4 +81,4 @@ private module PolynomialRedosConfig implements DataFlow::ConfigSig { } } -module PolynomialRedosFlow = TaintTracking::Make; +module PolynomialRedosFlow = TaintTracking::Global; diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index e2a9e8a56f0..0b18bced9b3 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.5.5 + +### New Queries + +* Added a new query, `java/android/arbitrary-apk-installation`, to detect installation of APKs from untrusted sources. + ## 0.5.4 No user-facing changes. diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql b/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql index c7c3ce0f835..4058978f29a 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql @@ -41,7 +41,7 @@ module TaintedPathConfig implements DataFlow::ConfigSig { } } -module TaintedPath = TaintTracking::Make; +module TaintedPath = TaintTracking::Global; import TaintedPath::PathGraph @@ -53,13 +53,13 @@ import TaintedPath::PathGraph * continue to report there; otherwise we report directly at `sink`. */ DataFlow::Node getReportingNode(DataFlow::Node sink) { - TaintedPath::hasFlowTo(sink) and + TaintedPath::flowTo(sink) and if exists(PathCreation pc | pc.getAnInput() = sink.asExpr()) then result.asExpr() = any(PathCreation pc | pc.getAnInput() = sink.asExpr()) else result = sink } from TaintedPath::PathNode source, TaintedPath::PathNode sink -where TaintedPath::hasFlowPath(source, sink) +where TaintedPath::flowPath(source, sink) select getReportingNode(sink.getNode()), source, sink, "This path depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql b/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql index fa62e4e6dfd..94c2b0e68a0 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql @@ -41,7 +41,7 @@ module TaintedPathLocalConfig implements DataFlow::ConfigSig { } } -module TaintedPathLocalFlow = TaintTracking::Make; +module TaintedPathLocalFlow = TaintTracking::Global; import TaintedPathLocalFlow::PathGraph @@ -53,13 +53,13 @@ import TaintedPathLocalFlow::PathGraph * continue to report there; otherwise we report directly at `sink`. */ DataFlow::Node getReportingNode(DataFlow::Node sink) { - TaintedPathLocalFlow::hasFlowTo(sink) and + TaintedPathLocalFlow::flowTo(sink) and if exists(PathCreation pc | pc.getAnInput() = sink.asExpr()) then result.asExpr() = any(PathCreation pc | pc.getAnInput() = sink.asExpr()) else result = sink } from TaintedPathLocalFlow::PathNode source, TaintedPathLocalFlow::PathNode sink -where TaintedPathLocalFlow::hasFlowPath(source, sink) +where TaintedPathLocalFlow::flowPath(source, sink) select getReportingNode(sink.getNode()), source, sink, "This path depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql b/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql index bae6311f362..b1afdfe65a4 100644 --- a/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql +++ b/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql @@ -44,7 +44,7 @@ module ZipSlipConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { node instanceof PathInjectionSanitizer } } -module ZipSlipFlow = TaintTracking::Make; +module ZipSlipFlow = TaintTracking::Global; import ZipSlipFlow::PathGraph @@ -56,7 +56,7 @@ private class FileCreationSink extends DataFlow::Node { } from ZipSlipFlow::PathNode source, ZipSlipFlow::PathNode sink -where ZipSlipFlow::hasFlowPath(source, sink) +where ZipSlipFlow::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/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql index e246d231da1..5289ac39a9b 100644 --- a/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql @@ -16,16 +16,13 @@ import semmle.code.java.Expr import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.ExternalProcess import semmle.code.java.security.CommandArguments -import DataFlow::PathGraph -class LocalUserInputToArgumentToExecFlowConfig extends TaintTracking::Configuration { - LocalUserInputToArgumentToExecFlowConfig() { this = "LocalUserInputToArgumentToExecFlowConfig" } +module LocalUserInputToArgumentToExecFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } - override predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } + predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof ArgumentToExec } - override predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof ArgumentToExec } - - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType @@ -34,9 +31,16 @@ class LocalUserInputToArgumentToExecFlowConfig extends TaintTracking::Configurat } } +module LocalUserInputToArgumentToExecFlow = + TaintTracking::Global; + +import LocalUserInputToArgumentToExecFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, ArgumentToExec execArg, - LocalUserInputToArgumentToExecFlowConfig conf -where conf.hasFlowPath(source, sink) and sink.getNode().asExpr() = execArg + LocalUserInputToArgumentToExecFlow::PathNode source, + LocalUserInputToArgumentToExecFlow::PathNode sink, ArgumentToExec execArg +where + LocalUserInputToArgumentToExecFlow::flowPath(source, sink) and + sink.getNode().asExpr() = execArg select execArg, source, sink, "This command line depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-079/XSS.ql b/java/ql/src/Security/CWE/CWE-079/XSS.ql index f2b0a65f9fe..dbec746eaf6 100644 --- a/java/ql/src/Security/CWE/CWE-079/XSS.ql +++ b/java/ql/src/Security/CWE/CWE-079/XSS.ql @@ -29,11 +29,11 @@ module XssConfig implements DataFlow::ConfigSig { } } -module XssFlow = TaintTracking::Make; +module XssFlow = TaintTracking::Global; import XssFlow::PathGraph from XssFlow::PathNode source, XssFlow::PathNode sink -where XssFlow::hasFlowPath(source, sink) +where XssFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql index da318a5b7cb..90bd2dccc44 100644 --- a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql +++ b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql @@ -14,17 +14,18 @@ import java import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.XSS -import DataFlow::PathGraph -class XssLocalConfig extends TaintTracking::Configuration { - XssLocalConfig() { this = "XSSLocalConfig" } +module XssLocalConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - override predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - - override predicate isSink(DataFlow::Node sink) { sink instanceof XssSink } + predicate isSink(DataFlow::Node sink) { sink instanceof XssSink } } -from DataFlow::PathNode source, DataFlow::PathNode sink, XssLocalConfig conf -where conf.hasFlowPath(source, sink) +module XssLocalFlow = TaintTracking::Global; + +import XssLocalFlow::PathGraph + +from XssLocalFlow::PathNode source, XssLocalFlow::PathNode sink +where XssLocalFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql index 13e0c7556f6..87f478de979 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql @@ -25,28 +25,27 @@ class UncontrolledStringBuilderSource extends DataFlow::ExprNode { } } -class UncontrolledStringBuilderSourceFlowConfig extends TaintTracking::Configuration { - UncontrolledStringBuilderSourceFlowConfig() { - this = "SqlConcatenated::UncontrolledStringBuilderSourceFlowConfig" - } +module UncontrolledStringBuilderSourceFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof UncontrolledStringBuilderSource } - override predicate isSource(DataFlow::Node src) { src instanceof UncontrolledStringBuilderSource } + predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType } } +module UncontrolledStringBuilderSourceFlow = + TaintTracking::Global; + from QueryInjectionSink query, Expr uncontrolled where ( builtFromUncontrolledConcat(query.asExpr(), uncontrolled) or - exists(StringBuilderVar sbv, UncontrolledStringBuilderSourceFlowConfig conf | + exists(StringBuilderVar sbv | uncontrolledStringBuilderQuery(sbv, uncontrolled) and - conf.hasFlow(DataFlow::exprNode(sbv.getToStringCall()), query) + UncontrolledStringBuilderSourceFlow::flow(DataFlow::exprNode(sbv.getToStringCall()), query) ) ) and not queryTaintedBy(query, _, _) diff --git a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql index d6c874e1fd8..34e322247c9 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql @@ -15,26 +15,29 @@ import semmle.code.java.Expr import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.SqlInjectionQuery -import DataFlow::PathGraph -class LocalUserInputToQueryInjectionFlowConfig extends TaintTracking::Configuration { - LocalUserInputToQueryInjectionFlowConfig() { this = "LocalUserInputToQueryInjectionFlowConfig" } +module LocalUserInputToQueryInjectionFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } - override predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } + predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { any(AdditionalQueryInjectionTaintStep s).step(node1, node2) } } +module LocalUserInputToQueryInjectionFlow = + TaintTracking::Global; + +import LocalUserInputToQueryInjectionFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, LocalUserInputToQueryInjectionFlowConfig conf -where conf.hasFlowPath(source, sink) + LocalUserInputToQueryInjectionFlow::PathNode source, + LocalUserInputToQueryInjectionFlow::PathNode sink +where LocalUserInputToQueryInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This query depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql b/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql index 66371f161ca..e879a33051d 100644 --- a/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql +++ b/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql @@ -17,6 +17,6 @@ import LdapInjectionLib import LdapInjectionFlow::PathGraph from LdapInjectionFlow::PathNode source, LdapInjectionFlow::PathNode sink -where LdapInjectionFlow::hasFlowPath(source, sink) +where LdapInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This LDAP query depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll b/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll index d682e4902d8..d6ca8b1169d 100644 --- a/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll +++ b/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll @@ -17,4 +17,4 @@ module LdapInjectionFlowConfig implements DataFlow::ConfigSig { } } -module LdapInjectionFlow = TaintTracking::Make; +module LdapInjectionFlow = TaintTracking::Global; diff --git a/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql b/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql index aab75a8d368..3255ac99bd6 100644 --- a/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql +++ b/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql @@ -15,5 +15,5 @@ import semmle.code.java.security.ArbitraryApkInstallationQuery import ApkInstallationFlow::PathGraph from ApkInstallationFlow::PathNode source, ApkInstallationFlow::PathNode sink -where ApkInstallationFlow::hasFlowPath(source, sink) +where ApkInstallationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Arbitrary Android APK installation." diff --git a/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql b/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql index c3a991ddcd5..5e957f23793 100644 --- a/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql +++ b/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql @@ -61,7 +61,7 @@ module BeanValidationConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof BeanValidationSink } } -module BeanValidationFlow = TaintTracking::Make; +module BeanValidationFlow = TaintTracking::Global; import BeanValidationFlow::PathGraph @@ -80,6 +80,6 @@ where or exists(SetMessageInterpolatorCall c | not c.isSafe()) ) and - BeanValidationFlow::hasFlowPath(source, sink) + BeanValidationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Custom constraint error message contains an unsanitized $@.", source, "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql index b1682dd5774..4fef0a620cd 100644 --- a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql +++ b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql @@ -42,12 +42,12 @@ module ResponseSplittingConfig implements DataFlow::ConfigSig { } } -module ResponseSplitting = TaintTracking::Make; +module ResponseSplitting = TaintTracking::Global; import ResponseSplitting::PathGraph from ResponseSplitting::PathNode source, ResponseSplitting::PathNode sink -where ResponseSplitting::hasFlowPath(source, sink) +where ResponseSplitting::flowPath(source, sink) select sink.getNode(), source, sink, "This header depends on a $@, which may cause a response-splitting vulnerability.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql b/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql index 321f5659e27..402ad1ba1bc 100644 --- a/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql +++ b/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql @@ -26,12 +26,12 @@ module ResponseSplittingLocalConfig implements DataFlow::ConfigSig { } } -module ResponseSplitting = TaintTracking::Make; +module ResponseSplitting = TaintTracking::Global; import ResponseSplitting::PathGraph from ResponseSplitting::PathNode source, ResponseSplitting::PathNode sink -where ResponseSplitting::hasFlowPath(source, sink) +where ResponseSplitting::flowPath(source, sink) select sink.getNode(), source, sink, "This header depends on a $@, which may cause a response-splitting vulnerability.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-117/LogInjection.ql b/java/ql/src/Security/CWE/CWE-117/LogInjection.ql index 61c1db901b0..dd4ffb6a10a 100644 --- a/java/ql/src/Security/CWE/CWE-117/LogInjection.ql +++ b/java/ql/src/Security/CWE/CWE-117/LogInjection.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.LogInjectionQuery import LogInjectionFlow::PathGraph from LogInjectionFlow::PathNode source, LogInjectionFlow::PathNode sink -where LogInjectionFlow::hasFlowPath(source, sink) +where LogInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This log entry depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql index 032f2f4ce3c..703bb23b6f5 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql @@ -13,25 +13,28 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "RemoteUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +private module ImproperValidationOfArrayConstructionConfig 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) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } } +module ImproperValidationOfArrayConstructionFlow = + TaintTracking::Global; + +import ImproperValidationOfArrayConstructionFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, Expr sizeExpr, + ImproperValidationOfArrayConstructionFlow::PathNode source, + ImproperValidationOfArrayConstructionFlow::PathNode sink, Expr sizeExpr, ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayConstructionFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using a $@ which may be zero.", arrayCreation, "array", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql index 3d07f044a7c..8541074c493 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql @@ -13,30 +13,33 @@ import java import ArraySizing -import DataFlow::PathGraph +import semmle.code.java.dataflow.TaintTracking -class BoundedFlowSourceConf extends DataFlow::Configuration { - BoundedFlowSourceConf() { this = "BoundedFlowSource" } - - override predicate isSource(DataFlow::Node source) { +module BoundedFlowSourceConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource and // There is not a fixed lower bound which is greater than zero. not source.(BoundedFlowSource).lowerBound() > 0 } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } } +module BoundedFlowSourceFlow = DataFlow::Global; + +import BoundedFlowSourceFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, BoundedFlowSource boundedsource, - Expr sizeExpr, ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess + BoundedFlowSourceFlow::PathNode source, BoundedFlowSourceFlow::PathNode sink, + BoundedFlowSource boundedsource, Expr sizeExpr, ArrayCreationExpr arrayCreation, + CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and boundedsource = source.getNode() and - any(BoundedFlowSourceConf conf).hasFlowPath(source, sink) + BoundedFlowSourceFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using $@ which may be zero.", arrayCreation, "array", boundedsource, boundedsource.getDescription().toLowerCase() diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql index ebb91acbc24..f5539e4d05b 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql @@ -14,25 +14,28 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "LocalUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +module ImproperValidationOfArrayConstructionLocalConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - override predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } } +module ImproperValidationOfArrayConstructionLocalFlow = + TaintTracking::Global; + +import ImproperValidationOfArrayConstructionLocalFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, Expr sizeExpr, + ImproperValidationOfArrayConstructionLocalFlow::PathNode source, + ImproperValidationOfArrayConstructionLocalFlow::PathNode sink, Expr sizeExpr, ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayConstructionLocalFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using a $@ which may be zero.", arrayCreation, "array", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql index d3a78f1ab96..6c6755dc484 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql @@ -13,24 +13,28 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "RemoteUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +module ImproperValidationOfArrayIndexConfig 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) { any(CheckableArrayAccess caa).canThrowOutOfBounds(sink.asExpr()) } - override predicate isSanitizer(DataFlow::Node node) { node.getType() instanceof BooleanType } + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof BooleanType } } -from DataFlow::PathNode source, DataFlow::PathNode sink, CheckableArrayAccess arrayAccess +module ImproperValidationOfArrayIndexFlow = + TaintTracking::Global; + +import ImproperValidationOfArrayIndexFlow::PathGraph + +from + ImproperValidationOfArrayIndexFlow::PathNode source, + ImproperValidationOfArrayIndexFlow::PathNode sink, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayIndexFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This index depends on a $@ which can cause an ArrayIndexOutOfBoundsException.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql index 79911f5422d..d2f8f6135a9 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql @@ -14,25 +14,27 @@ import java import ArraySizing import BoundingChecks -import DataFlow::PathGraph +import semmle.code.java.dataflow.TaintTracking -class BoundedFlowSourceConf extends DataFlow::Configuration { - BoundedFlowSourceConf() { this = "BoundedFlowSource" } +module BoundedFlowSourceConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(CheckableArrayAccess arrayAccess | arrayAccess.canThrowOutOfBounds(sink.asExpr())) } } +module BoundedFlowSourceFlow = DataFlow::Global; + +import BoundedFlowSourceFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, BoundedFlowSource boundedsource, - CheckableArrayAccess arrayAccess + BoundedFlowSourceFlow::PathNode source, BoundedFlowSourceFlow::PathNode sink, + BoundedFlowSource boundedsource, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and boundedsource = source.getNode() and - any(BoundedFlowSourceConf conf).hasFlowPath(source, sink) and + BoundedFlowSourceFlow::flowPath(source, sink) and boundedsource != sink.getNode() and not ( ( diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql index 1b5576f14e8..51f54eebd79 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql @@ -14,22 +14,26 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "LocalUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +module ImproperValidationOfArrayIndexLocalConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - override predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBounds(sink.asExpr()) } } -from DataFlow::PathNode source, DataFlow::PathNode sink, CheckableArrayAccess arrayAccess +module ImproperValidationOfArrayIndexLocalFlow = + TaintTracking::Global; + +import ImproperValidationOfArrayIndexLocalFlow::PathGraph + +from + ImproperValidationOfArrayIndexLocalFlow::PathNode source, + ImproperValidationOfArrayIndexLocalFlow::PathNode sink, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayIndexLocalFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This index depends on a $@ which can cause an ArrayIndexOutOfBoundsException.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql index da5bc5372a4..a2d2e9005ef 100644 --- a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql +++ b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql @@ -27,7 +27,7 @@ module ExternallyControlledFormatStringConfig implements DataFlow::ConfigSig { } module ExternallyControlledFormatStringFlow = - TaintTracking::Make; + TaintTracking::Global; import ExternallyControlledFormatStringFlow::PathGraph @@ -35,7 +35,7 @@ from ExternallyControlledFormatStringFlow::PathNode source, ExternallyControlledFormatStringFlow::PathNode sink, StringFormat formatCall where - ExternallyControlledFormatStringFlow::hasFlowPath(source, sink) and + ExternallyControlledFormatStringFlow::flowPath(source, sink) and sink.getNode().asExpr() = formatCall.getFormatArgument() select formatCall.getFormatArgument(), source, sink, "Format string depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql index 0300eaea806..56026c61cfa 100644 --- a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql +++ b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql @@ -23,7 +23,7 @@ module ExternallyControlledFormatStringLocalConfig implements DataFlow::ConfigSi } module ExternallyControlledFormatStringLocalFlow = - TaintTracking::Make; + TaintTracking::Global; import ExternallyControlledFormatStringLocalFlow::PathGraph @@ -31,7 +31,7 @@ from ExternallyControlledFormatStringLocalFlow::PathNode source, ExternallyControlledFormatStringLocalFlow::PathNode sink, StringFormat formatCall where - ExternallyControlledFormatStringLocalFlow::hasFlowPath(source, sink) and + ExternallyControlledFormatStringLocalFlow::flowPath(source, sink) and sink.getNode().asExpr() = formatCall.getFormatArgument() select formatCall.getFormatArgument(), source, sink, "Format string depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql index 99d9879d19e..81e572e4c4e 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql @@ -32,22 +32,23 @@ module RemoteUserInputUnderflowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) } } -module RemoteUserInputOverflow = TaintTracking::Make; +module RemoteUserInputOverflow = TaintTracking::Global; -module RemoteUserInputUnderflow = TaintTracking::Make; +module RemoteUserInputUnderflow = TaintTracking::Global; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph from Flow::PathNode source, Flow::PathNode sink, ArithExpr exp, string effect where - RemoteUserInputOverflow::hasFlowPath(source.asPathNode1(), sink.asPathNode1()) and + RemoteUserInputOverflow::flowPath(source.asPathNode1(), sink.asPathNode1()) and overflowSink(exp, sink.getNode().asExpr()) and effect = "overflow" or - RemoteUserInputUnderflow::hasFlowPath(source.asPathNode2(), sink.asPathNode2()) and + RemoteUserInputUnderflow::flowPath(source.asPathNode2(), sink.asPathNode2()) and underflowSink(exp, sink.getNode().asExpr()) and effect = "underflow" select exp, source, sink, diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql index 5fae695bf56..21564787f73 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql @@ -25,7 +25,7 @@ module ArithmeticTaintedLocalOverflowConfig implements DataFlow::ConfigSig { } module ArithmeticTaintedLocalOverflowFlow = - TaintTracking::Make; + TaintTracking::Global; module ArithmeticTaintedLocalUnderflowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } @@ -36,20 +36,22 @@ module ArithmeticTaintedLocalUnderflowConfig implements DataFlow::ConfigSig { } module ArithmeticTaintedLocalUnderflowFlow = - TaintTracking::Make; + TaintTracking::Global; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph from Flow::PathNode source, Flow::PathNode sink, ArithExpr exp, string effect where - ArithmeticTaintedLocalOverflowFlow::hasFlowPath(source.asPathNode1(), sink.asPathNode1()) and + ArithmeticTaintedLocalOverflowFlow::flowPath(source.asPathNode1(), sink.asPathNode1()) and overflowSink(exp, sink.getNode().asExpr()) and effect = "overflow" or - ArithmeticTaintedLocalUnderflowFlow::hasFlowPath(source.asPathNode2(), sink.asPathNode2()) and + ArithmeticTaintedLocalUnderflowFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) and underflowSink(exp, sink.getNode().asExpr()) and effect = "underflow" select exp, source, sink, diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql index 636480f7400..3ab8deec9b2 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql @@ -33,7 +33,7 @@ module ArithmeticUncontrolledOverflowConfig implements DataFlow::ConfigSig { } module ArithmeticUncontrolledOverflowFlow = - TaintTracking::Make; + TaintTracking::Global; module ArithmeticUncontrolledUnderflowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof TaintSource } @@ -44,20 +44,22 @@ module ArithmeticUncontrolledUnderflowConfig implements DataFlow::ConfigSig { } module ArithmeticUncontrolledUnderflowFlow = - TaintTracking::Make; + TaintTracking::Global; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph from Flow::PathNode source, Flow::PathNode sink, ArithExpr exp, string effect where - ArithmeticUncontrolledOverflowFlow::hasFlowPath(source.asPathNode1(), sink.asPathNode1()) and + ArithmeticUncontrolledOverflowFlow::flowPath(source.asPathNode1(), sink.asPathNode1()) and overflowSink(exp, sink.getNode().asExpr()) and effect = "overflow" or - ArithmeticUncontrolledUnderflowFlow::hasFlowPath(source.asPathNode2(), sink.asPathNode2()) and + ArithmeticUncontrolledUnderflowFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) and underflowSink(exp, sink.getNode().asExpr()) and effect = "underflow" select exp, source, sink, diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql index 72801f205aa..a054f435229 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql @@ -33,7 +33,7 @@ class ExtremeSource extends VarAccess { ExtremeSource() { this.getVariable() instanceof ExtremeValueField } } -private module MaxValueFlowConfig implements DataFlow::ConfigSig { +module MaxValueFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr().(ExtremeSource).getVariable() instanceof MaxValueField } @@ -45,9 +45,9 @@ private module MaxValueFlowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node n) { overflowBarrier(n) } } -module MaxValueFlow = DataFlow::Make; +module MaxValueFlow = DataFlow::Global; -private module MinValueFlowConfig implements DataFlow::ConfigSig { +module MinValueFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr().(ExtremeSource).getVariable() instanceof MinValueField } @@ -59,10 +59,11 @@ private module MinValueFlowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) } } -module MinValueFlow = DataFlow::Make; +module MinValueFlow = DataFlow::Global; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph @@ -70,11 +71,11 @@ predicate query( Flow::PathNode source, Flow::PathNode sink, ArithExpr exp, string effect, Type srctyp ) { ( - MaxValueFlow::hasFlowPath(source.asPathNode1(), sink.asPathNode1()) and + MaxValueFlow::flowPath(source.asPathNode1(), sink.asPathNode1()) and overflowSink(exp, sink.getNode().asExpr()) and effect = "overflow" or - MinValueFlow::hasFlowPath(source.asPathNode2(), sink.asPathNode2()) and + MinValueFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) and underflowSink(exp, sink.getNode().asExpr()) and effect = "underflow" ) and diff --git a/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql b/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql index 1b1ca51e7cd..c16b8577d73 100644 --- a/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql +++ b/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql @@ -102,7 +102,7 @@ module WebViewDisallowContentAccessConfig implements DataFlow::StateConfigSig { } module WebViewDisallowContentAccessFlow = - TaintTracking::MakeWithState; + TaintTracking::GlobalWithState; from Expr e where @@ -116,7 +116,7 @@ where // implicit: no setAllowContentAccess(false) exists(WebViewSource source | source.asExpr() = e and - not WebViewDisallowContentAccessFlow::hasFlow(source, _) + not WebViewDisallowContentAccessFlow::flow(source, _) ) select e, "Sensitive information may be exposed via a malicious link due to access to content:// links being allowed in this WebView." diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql index 76998b40b50..400d7159b9a 100644 --- a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql +++ b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql @@ -133,7 +133,7 @@ module TempDirSystemGetPropertyToCreateConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof FileCreationSink and - not TempDirSystemGetPropertyDirectlyToMkdir::hasFlowTo(sink) + not TempDirSystemGetPropertyDirectlyToMkdir::flowTo(sink) } predicate isBarrier(DataFlow::Node sanitizer) { @@ -146,7 +146,7 @@ module TempDirSystemGetPropertyToCreateConfig implements DataFlow::ConfigSig { } module TempDirSystemGetPropertyToCreate = - TaintTracking::Make; + TaintTracking::Global; /** * Configuration that tracks calls to to `mkdir` or `mkdirs` that are are directly on the temp directory system property. @@ -179,7 +179,7 @@ module TempDirSystemGetPropertyDirectlyToMkdirConfig implements DataFlow::Config } module TempDirSystemGetPropertyDirectlyToMkdir = - TaintTracking::Make; + TaintTracking::Global; // // Begin configuration for tracking single-method calls that are vulnerable. @@ -261,14 +261,16 @@ module InsecureMethodPathGraph implements DataFlow::PathGraphSig; + DataFlow::MergePathGraph; import Flow::PathGraph from Flow::PathNode source, Flow::PathNode sink, string message where ( - TempDirSystemGetPropertyToCreate::hasFlowPath(source.asPathNode1(), sink.asPathNode1()) and + TempDirSystemGetPropertyToCreate::flowPath(source.asPathNode1(), sink.asPathNode1()) and message = "Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users." or diff --git a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql index 02934e98840..98a342bcb27 100644 --- a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql +++ b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql @@ -42,7 +42,7 @@ module ServletWriterSourceToPrintStackTraceMethodFlowConfig implements DataFlow: } module ServletWriterSourceToPrintStackTraceMethodFlow = - TaintTracking::Make; + TaintTracking::Global; /** * A call that uses `Throwable.printStackTrace()` on a stream that is connected @@ -51,7 +51,7 @@ module ServletWriterSourceToPrintStackTraceMethodFlow = predicate printsStackToWriter(MethodAccess call) { exists(PrintStackTraceMethod printStackTrace | call.getMethod() = printStackTrace and - ServletWriterSourceToPrintStackTraceMethodFlow::hasFlowToExpr(call.getAnArgument()) + ServletWriterSourceToPrintStackTraceMethodFlow::flowToExpr(call.getAnArgument()) ) } @@ -87,7 +87,7 @@ module StackTraceStringToHttpResponseSinkFlowConfig implements DataFlow::ConfigS } module StackTraceStringToHttpResponseSinkFlow = - TaintTracking::Make; + TaintTracking::Global; /** * A write of stack trace data to an external stream. @@ -104,8 +104,7 @@ predicate printsStackExternally(MethodAccess call, Expr stackTrace) { predicate stringifiedStackFlowsExternally(DataFlow::Node externalExpr, Expr stackTrace) { exists(MethodAccess stackTraceString | stackTraceExpr(stackTrace, stackTraceString) and - StackTraceStringToHttpResponseSinkFlow::hasFlow(DataFlow::exprNode(stackTraceString), - externalExpr) + StackTraceStringToHttpResponseSinkFlow::flow(DataFlow::exprNode(stackTraceString), externalExpr) ) } @@ -120,22 +119,20 @@ class GetMessageFlowSource extends MethodAccess { } } -class GetMessageFlowSourceToHttpResponseSinkFlowConfig extends TaintTracking::Configuration { - GetMessageFlowSourceToHttpResponseSinkFlowConfig() { - this = "StackTraceExposure::GetMessageFlowSourceToHttpResponseSinkFlowConfig" - } +module GetMessageFlowSourceToHttpResponseSinkFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof GetMessageFlowSource } - override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof GetMessageFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink } + predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink } } +module GetMessageFlowSourceToHttpResponseSinkFlow = + TaintTracking::Global; + /** * A call to `getMessage()` that then flows to a servlet response. */ predicate getMessageFlowsExternally(DataFlow::Node externalExpr, GetMessageFlowSource getMessage) { - any(GetMessageFlowSourceToHttpResponseSinkFlowConfig conf) - .hasFlow(DataFlow::exprNode(getMessage), externalExpr) + GetMessageFlowSourceToHttpResponseSinkFlow::flow(DataFlow::exprNode(getMessage), externalExpr) } from Expr externalExpr, Expr errorInformation diff --git a/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql b/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql index 281415a0d91..d79abd6e417 100644 --- a/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql +++ b/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql @@ -20,7 +20,7 @@ import IntentUriPermissionManipulationFlow::PathGraph from IntentUriPermissionManipulationFlow::PathNode source, IntentUriPermissionManipulationFlow::PathNode sink -where IntentUriPermissionManipulationFlow::hasFlowPath(source, sink) +where IntentUriPermissionManipulationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This Intent can be set with arbitrary flags from a $@, " + "and used to give access to internal content providers.", source.getNode(), diff --git a/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql b/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql index f6663b8e87d..4bea66796b8 100644 --- a/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql +++ b/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql @@ -77,7 +77,7 @@ module TrustAllHostnameVerifierConfig implements DataFlow::ConfigSig { } } -module TrustAllHostnameVerifierFlow = DataFlow::Make; +module TrustAllHostnameVerifierFlow = DataFlow::Global; import TrustAllHostnameVerifierFlow::PathGraph @@ -118,7 +118,7 @@ from TrustAllHostnameVerifierFlow::PathNode source, TrustAllHostnameVerifierFlow::PathNode sink, RefType verifier where - TrustAllHostnameVerifierFlow::hasFlowPath(source, sink) and + TrustAllHostnameVerifierFlow::flowPath(source, sink) and not isNodeGuardedByFlag(sink.getNode()) and verifier = source.getNode().asExpr().(ClassInstanceExpr).getConstructedType() select sink, source, sink, diff --git a/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql b/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql index ec7ffcbccc1..a423eed3d22 100644 --- a/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql +++ b/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql @@ -38,7 +38,7 @@ module InsecureCryptoConfig implements ConfigSig { } } -module InsecureCryptoFlow = TaintTracking::Make; +module InsecureCryptoFlow = TaintTracking::Global; import InsecureCryptoFlow::PathGraph @@ -48,6 +48,6 @@ from where sink.getNode().asExpr() = c.getAlgoSpec() and source.getNode().asExpr() = s and - InsecureCryptoFlow::hasFlowPath(source, sink) + InsecureCryptoFlow::flowPath(source, sink) select c, source, sink, "Cryptographic algorithm $@ is weak and should not be used.", s, s.getValue() diff --git a/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql b/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql index 47446211438..b5f14421894 100644 --- a/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql +++ b/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql @@ -61,7 +61,7 @@ module InsecureCryptoConfig implements ConfigSig { } } -module InsecureCryptoFlow = TaintTracking::Make; +module InsecureCryptoFlow = TaintTracking::Global; import InsecureCryptoFlow::PathGraph @@ -71,7 +71,7 @@ from where sink.getNode().asExpr() = c.getAlgoSpec() and source.getNode().asExpr() = s and - InsecureCryptoFlow::hasFlowPath(source, sink) + InsecureCryptoFlow::flowPath(source, sink) select c, source, sink, "Cryptographic algorithm $@ may not be secure, consider using a different algorithm.", s, s.getValue() diff --git a/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql b/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql index ce90cc5e00f..4a8c9bc3ad1 100644 --- a/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql +++ b/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql @@ -17,7 +17,7 @@ import semmle.code.java.security.UnsafeContentUriResolutionQuery import UnsafeContentResolutionFlow::PathGraph from UnsafeContentResolutionFlow::PathNode src, UnsafeContentResolutionFlow::PathNode sink -where UnsafeContentResolutionFlow::hasFlowPath(src, sink) +where UnsafeContentResolutionFlow::flowPath(src, sink) select sink.getNode(), src, sink, "This ContentResolver method that resolves a URI depends on a $@.", src.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql b/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql index 5ffa7068980..6ff9a15eca4 100644 --- a/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql +++ b/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql @@ -16,7 +16,7 @@ import semmle.code.java.security.FragmentInjectionQuery import FragmentInjectionTaintFlow::PathGraph from FragmentInjectionTaintFlow::PathNode source, FragmentInjectionTaintFlow::PathNode sink -where FragmentInjectionTaintFlow::hasFlowPath(source, sink) +where FragmentInjectionTaintFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Fragment depends on a $@, which may allow a malicious application to bypass access controls.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql b/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql index a884ba6c242..9b306bc1bd1 100644 --- a/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql +++ b/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.SensitiveLoggingQuery import SensitiveLoggerFlow::PathGraph from SensitiveLoggerFlow::PathNode source, SensitiveLoggerFlow::PathNode sink -where SensitiveLoggerFlow::hasFlowPath(source, sink) +where SensitiveLoggerFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This $@ is written to a log file.", source.getNode(), "potentially sensitive information" diff --git a/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql b/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql index cf9393830b0..78c9c86c762 100644 --- a/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql +++ b/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql @@ -21,11 +21,11 @@ module UrlRedirectConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink } } -module UrlRedirectFlow = TaintTracking::Make; +module UrlRedirectFlow = TaintTracking::Global; import UrlRedirectFlow::PathGraph from UrlRedirectFlow::PathNode source, UrlRedirectFlow::PathNode sink -where UrlRedirectFlow::hasFlowPath(source, sink) +where UrlRedirectFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Untrusted URL redirection depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql b/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql index de44173ec57..d8a28f52abb 100644 --- a/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql +++ b/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql @@ -21,11 +21,11 @@ module UrlRedirectLocalConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink } } -module UrlRedirectLocalFlow = TaintTracking::Make; +module UrlRedirectLocalFlow = TaintTracking::Global; import UrlRedirectLocalFlow::PathGraph from UrlRedirectLocalFlow::PathNode source, UrlRedirectLocalFlow::PathNode sink -where UrlRedirectLocalFlow::hasFlowPath(source, sink) +where UrlRedirectLocalFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Untrusted URL redirection depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-611/XXE.ql b/java/ql/src/Security/CWE/CWE-611/XXE.ql index 708d4f08ee7..5520d332ed6 100644 --- a/java/ql/src/Security/CWE/CWE-611/XXE.ql +++ b/java/ql/src/Security/CWE/CWE-611/XXE.ql @@ -19,7 +19,7 @@ import semmle.code.java.security.XxeRemoteQuery import XxeFlow::PathGraph from XxeFlow::PathNode source, XxeFlow::PathNode sink -where XxeFlow::hasFlowPath(source, sink) +where XxeFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XML parsing depends on a $@ without guarding against external entity expansion.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-611/XXELocal.ql b/java/ql/src/Security/CWE/CWE-611/XXELocal.ql index 0ab4ddcc106..5e306a65349 100644 --- a/java/ql/src/Security/CWE/CWE-611/XXELocal.ql +++ b/java/ql/src/Security/CWE/CWE-611/XXELocal.ql @@ -19,7 +19,7 @@ import semmle.code.java.security.XxeLocalQuery import XxeLocalFlow::PathGraph from XxeLocalFlow::PathNode source, XxeLocalFlow::PathNode sink -where XxeLocalFlow::hasFlowPath(source, sink) +where XxeLocalFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XML parsing depends on a $@ without guarding against external entity expansion.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql index 0766ee07134..0d24e9315c1 100644 --- a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql +++ b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql @@ -26,10 +26,8 @@ predicate isSafeSecureCookieSetting(Expr e) { ) } -class SecureCookieConfiguration extends DataFlow::Configuration { - SecureCookieConfiguration() { this = "SecureCookieConfiguration" } - - override predicate isSource(DataFlow::Node source) { +module SecureCookieConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(MethodAccess ma, Method m | ma.getMethod() = m | m.getDeclaringType() instanceof TypeCookie and m.getName() = "setSecure" and @@ -43,14 +41,16 @@ class SecureCookieConfiguration extends DataFlow::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(MethodAccess add | add.getMethod() instanceof ResponseAddCookieMethod).getArgument(0) } } +module SecureCookieFlow = DataFlow::Global; + from MethodAccess add where add.getMethod() instanceof ResponseAddCookieMethod and - not any(SecureCookieConfiguration df).hasFlowToExpr(add.getArgument(0)) + not SecureCookieFlow::flowToExpr(add.getArgument(0)) select add, "Cookie is added to response without the 'secure' flag being set." diff --git a/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql b/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql index eacebd3f098..18a4d76873b 100644 --- a/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql +++ b/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql @@ -22,11 +22,11 @@ module XPathInjectionConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof XPathInjectionSink } } -module XPathInjectionFlow = TaintTracking::Make; +module XPathInjectionFlow = TaintTracking::Global; import XPathInjectionFlow::PathGraph from XPathInjectionFlow::PathNode source, XPathInjectionFlow::PathNode sink -where XPathInjectionFlow::hasFlowPath(source, sink) +where XPathInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XPath expression depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql b/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql index 3caefe3fd09..3194e0f8e7b 100644 --- a/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql +++ b/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql @@ -34,14 +34,14 @@ module NumericCastFlowConfig implements DataFlow::ConfigSig { } } -module NumericCastFlow = TaintTracking::Make; +module NumericCastFlow = TaintTracking::Global; import NumericCastFlow::PathGraph from NumericCastFlow::PathNode source, NumericCastFlow::PathNode sink, NumericNarrowingCastExpr exp where sink.getNode().asExpr() = exp.getExpr() and - NumericCastFlow::hasFlowPath(source, sink) + NumericCastFlow::flowPath(source, sink) select exp, source, sink, "This cast to a narrower type depends on a $@, potentially causing truncation.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql index 41757ab419a..b9224769562 100644 --- a/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql @@ -32,7 +32,7 @@ module NumericCastFlowConfig implements DataFlow::ConfigSig { } } -module NumericCastFlow = TaintTracking::Make; +module NumericCastFlow = TaintTracking::Global; import NumericCastFlow::PathGraph @@ -42,7 +42,7 @@ from where exp.getExpr() = tainted and sink.getNode().asExpr() = tainted and - NumericCastFlow::hasFlowPath(source, sink) and + NumericCastFlow::flowPath(source, sink) and not exists(RightShiftOp e | e.getShiftedVariable() = tainted.getVariable()) select exp, source, sink, "This cast to a narrower type depends on a $@, potentially causing truncation.", source.getNode(), diff --git a/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql b/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql index 8a1244b93d1..2ba45ca083c 100644 --- a/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql +++ b/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql @@ -21,7 +21,7 @@ from PolynomialRedosFlow::PathNode source, PolynomialRedosFlow::PathNode sink, SuperlinearBackTracking::PolynomialBackTrackingTerm regexp where - PolynomialRedosFlow::hasFlowPath(source, sink) and + PolynomialRedosFlow::flowPath(source, sink) and regexp.getRootTerm() = sink.getNode().(PolynomialRedosSink).getRegExp() select sink, source, sink, "This $@ that depends on a $@ may run slow on strings " + regexp.getPrefixMessage() + diff --git a/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql b/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql index a2475202dd8..2191a4a7401 100644 --- a/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql +++ b/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql @@ -15,6 +15,6 @@ import semmle.code.java.security.RsaWithoutOaepQuery import RsaWithoutOaepFlow::PathGraph from RsaWithoutOaepFlow::PathNode source, RsaWithoutOaepFlow::PathNode sink -where RsaWithoutOaepFlow::hasFlowPath(source, sink) +where RsaWithoutOaepFlow::flowPath(source, sink) select source, source, sink, "This specification is used to $@ without OAEP padding.", sink, "initialize an RSA cipher" diff --git a/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql b/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql index bb48958443f..87266e0df47 100644 --- a/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql +++ b/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql @@ -60,14 +60,13 @@ module TaintedPermissionsCheckFlowConfig implements DataFlow::ConfigSig { } } -module TaintedPermissionsCheckFlow = TaintTracking::Make; +module TaintedPermissionsCheckFlow = TaintTracking::Global; import TaintedPermissionsCheckFlow::PathGraph from TaintedPermissionsCheckFlow::PathNode source, TaintedPermissionsCheckFlow::PathNode sink, PermissionsConstruction p -where - sink.getNode().asExpr() = p.getInput() and TaintedPermissionsCheckFlow::hasFlowPath(source, sink) +where sink.getNode().asExpr() = p.getInput() and TaintedPermissionsCheckFlow::flowPath(source, sink) select p, source, sink, "Permissions check depends on a $@.", source.getNode(), "user-controlled value" diff --git a/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql b/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql index c3455dc4beb..570a7af54cc 100644 --- a/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql +++ b/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.RequestForgeryConfig import RequestForgeryFlow::PathGraph from RequestForgeryFlow::PathNode source, RequestForgeryFlow::PathNode sink -where RequestForgeryFlow::hasFlowPath(source, sink) +where RequestForgeryFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Potential server-side request forgery due to a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql b/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql index 59a7d827cf6..576927b1d72 100644 --- a/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql +++ b/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.AndroidSensitiveCommunicationQuery import SensitiveCommunicationFlow::PathGraph from SensitiveCommunicationFlow::PathNode source, SensitiveCommunicationFlow::PathNode sink -where SensitiveCommunicationFlow::hasFlowPath(source, sink) +where SensitiveCommunicationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This call may leak $@.", source.getNode(), "sensitive information" diff --git a/java/ql/src/change-notes/2023-01-19-arbitrary-apk-installation.md b/java/ql/src/change-notes/released/0.5.5.md similarity index 81% rename from java/ql/src/change-notes/2023-01-19-arbitrary-apk-installation.md rename to java/ql/src/change-notes/released/0.5.5.md index 93eb13f87d5..197c7ae1b69 100644 --- a/java/ql/src/change-notes/2023-01-19-arbitrary-apk-installation.md +++ b/java/ql/src/change-notes/released/0.5.5.md @@ -1,5 +1,5 @@ ---- -category: newQuery ---- -* Added a new query, `java/android/arbitrary-apk-installation`, to detect installation of APKs from untrusted sources. +## 0.5.5 +### New Queries + +* Added a new query, `java/android/arbitrary-apk-installation`, to detect installation of APKs from untrusted sources. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 6c1783ce1cb..6295db39e31 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 0.5.5-dev +version: 0.5.6-dev groups: - java - queries diff --git a/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql b/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql index 1f0c9fa5427..06fc24a054c 100644 --- a/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql @@ -7,7 +7,7 @@ */ import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string noflow where noflow = captureNoFlow(api) diff --git a/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql b/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql index 8d273ba77f8..4bc621ad6bb 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateToSinkConfig() { any() } -} - from DataFlowTargetApi api, string sink where sink = captureSink(api) select sink order by sink diff --git a/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql b/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql index f4fc9982797..51e6f68e62c 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateFromSourceConfig() { any() } -} - from DataFlowTargetApi api, string source where source = captureSource(api) select source order by source diff --git a/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql b/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql index 33d07d5f2c1..607ddbe4fb6 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql @@ -7,7 +7,7 @@ */ import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string flow where flow = captureFlow(api) diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 893c62191b3..5ca3ffed782 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -5,14 +5,6 @@ private import CaptureModelsSpecific -class ActiveConfiguration extends Unit { - predicate activateThroughFlowConfig() { none() } - - predicate activateFromSourceConfig() { none() } - - predicate activateToSinkConfig() { none() } -} - class DataFlowTargetApi extends TargetApiSpecific { DataFlowTargetApi() { isRelevantForDataFlowModels(this) } } @@ -46,6 +38,20 @@ private predicate isRelevantContent(DataFlow::Content c) { DataFlowPrivate::containerContent(c) } +/** + * Gets the MaD string representation of the parameter node `p`. + */ +string parameterNodeAsInput(DataFlow::ParameterNode p) { + result = parameterAccess(p.asParameter()) + or + result = qualifierString() and p instanceof InstanceParameterNode +} + +/** + * Gets the MaD input string representation of `source`. + */ +string asInputArgument(DataFlow::Node source) { result = asInputArgumentSpecific(source) } + /** * Gets the summary model for `api` with `input`, `output` and `kind`. */ @@ -111,61 +117,70 @@ string captureQualifierFlow(TargetApiSpecific api) { private int accessPathLimit() { result = 2 } +private newtype TTaintState = + TTaintRead(int n) { n in [0 .. accessPathLimit()] } or + TTaintStore(int n) { n in [1 .. accessPathLimit()] } + +abstract private class TaintState extends TTaintState { + abstract string toString(); +} + /** * A FlowState representing a tainted read. */ -private class TaintRead extends DataFlow::FlowState { +private class TaintRead extends TaintState, TTaintRead { private int step; - TaintRead() { this = "TaintRead(" + step + ")" and step in [0 .. accessPathLimit()] } + TaintRead() { this = TTaintRead(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintRead(" + step + ")" } } /** * A FlowState representing a tainted write. */ -private class TaintStore extends DataFlow::FlowState { +private class TaintStore extends TaintState, TTaintStore { private int step; - TaintStore() { this = "TaintStore(" + step + ")" and step in [1 .. accessPathLimit()] } + TaintStore() { this = TTaintStore(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintStore(" + step + ")" } } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A data-flow configuration for tracking flow through APIs. * The sources are the parameters of an API and the sinks are the return values (excluding `this`) and parameters. * * This can be used to generate Flow summaries for APIs from parameter to return. */ -private class ThroughFlowConfig extends TaintTracking::Configuration { - ThroughFlowConfig() { - this = "ThroughFlowConfig" and any(ActiveConfiguration ac).activateThroughFlowConfig() - } +module ThroughFlowConfig implements DataFlow::StateConfigSig { + class FlowState = TaintState; - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + predicate isSource(DataFlow::Node source, FlowState state) { source instanceof DataFlow::ParameterNode and source.getEnclosingCallable() instanceof DataFlowTargetApi and state.(TaintRead).getStep() = 0 } - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { + predicate isSink(DataFlow::Node sink, FlowState state) { sink instanceof DataFlowImplCommon::ReturnNodeExt and not isOwnInstanceAccessNode(sink) and not exists(captureQualifierFlow(sink.asExpr().getEnclosingCallable())) and (state instanceof TaintRead or state instanceof TaintStore) } - override predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 + predicate isAdditionalFlowStep( + DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2 ) { exists(DataFlowImplCommon::TypedContent tc | DataFlowImplCommon::store(node1, tc, node2, _) and @@ -184,24 +199,28 @@ private class ThroughFlowConfig extends TaintTracking::Configuration { ) } - override predicate isSanitizer(DataFlow::Node n) { + predicate isBarrier(DataFlow::Node n) { exists(Type t | t = n.getType() and not isRelevantType(t)) } - override DataFlow::FlowFeature getAFeature() { + predicate isBarrier(DataFlow::Node node, FlowState state) { none() } + + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureEqualSourceSinkCallContext } } +private module ThroughFlow = TaintTracking::GlobalWithState; + /** * Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter. */ string captureThroughFlow(DataFlowTargetApi api) { exists( - ThroughFlowConfig config, DataFlow::ParameterNode p, - DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output + DataFlow::ParameterNode p, DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, + string output | - config.hasFlow(p, returnNodeExt) and + ThroughFlow::flow(p, returnNodeExt) and returnNodeExt.getEnclosingCallable() = api and input = parameterNodeAsInput(p) and output = returnNodeAsOutput(returnNodeExt) and @@ -211,41 +230,37 @@ string captureThroughFlow(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sources. * The sources are the already known existing sources and the sinks are the API return nodes. * * This can be used to generate Source summaries for an API, if the API expose an already known source * via its return (then the API itself becomes a source). */ -private class FromSourceConfiguration extends TaintTracking::Configuration { - FromSourceConfiguration() { - this = "FromSourceConfiguration" and any(ActiveConfiguration ac).activateFromSourceConfig() - } +module FromSourceConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - override predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(DataFlowTargetApi c | sink instanceof DataFlowImplCommon::ReturnNodeExt and sink.getEnclosingCallable() = c ) } - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSinkCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSinkCallContext } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { isRelevantTaintStep(node1, node2) } } +private module FromSource = TaintTracking::Global; + /** * Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`. */ string captureSource(DataFlowTargetApi api) { - exists(DataFlow::Node source, DataFlow::Node sink, FromSourceConfiguration config, string kind | - config.hasFlow(source, sink) and + exists(DataFlow::Node source, DataFlow::Node sink, string kind | + FromSource::flow(source, sink) and ExternalFlow::sourceNode(source, kind) and api = sink.getEnclosingCallable() and isRelevantSourceKind(kind) and @@ -254,35 +269,30 @@ string captureSource(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sinks. * The sources are the parameters of the API and the fields of the enclosing type. * * This can be used to generate Sink summaries for APIs, if the API propagates a parameter (or enclosing type field) * into an existing known sink (then the API itself becomes a sink). */ -private class PropagateToSinkConfiguration extends TaintTracking::Configuration { - PropagateToSinkConfiguration() { - this = "parameters or fields flowing into sinks" and - any(ActiveConfiguration ac).activateToSinkConfig() - } +module PropagateToSinkConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { apiSource(source) } - override predicate isSource(DataFlow::Node source) { apiSource(source) } + predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } - override predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } + predicate isBarrier(DataFlow::Node node) { sinkModelSanitizer(node) } - override predicate isSanitizer(DataFlow::Node node) { sinkModelSanitizer(node) } - - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSourceCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext } } +private module PropagateToSink = TaintTracking::Global; + /** * Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink. */ string captureSink(DataFlowTargetApi api) { - exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind | - config.hasFlow(src, sink) and + exists(DataFlow::Node src, DataFlow::Node sink, string kind | + PropagateToSink::flow(src, sink) and ExternalFlow::sinkNode(sink, kind) and api = src.getEnclosingCallable() and isRelevantSinkKind(kind) and diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll index bce229d10a6..8823a8977d5 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll @@ -3,7 +3,6 @@ */ private import java as J -private import semmle.code.java.dataflow.internal.DataFlowNodes private import semmle.code.java.dataflow.internal.DataFlowPrivate private import semmle.code.java.dataflow.internal.ContainerFlow as ContainerFlow private import semmle.code.java.dataflow.DataFlow as Df @@ -130,7 +129,7 @@ private predicate partialModel(TargetApiSpecific api, string type, string name, } /** - * Computes the first 6 columns for CSV rows. + * Computes the first 6 columns for MaD rows. */ string asPartialModel(TargetApiSpecific api) { exists(string type, string name, string parameters | @@ -145,7 +144,7 @@ string asPartialModel(TargetApiSpecific api) { } /** - * Computes the first 4 columns for neutral CSV rows. + * Computes the first 4 columns for neutral MaD rows. */ string asPartialNeutralModel(TargetApiSpecific api) { exists(string type, string name, string parameters | @@ -187,11 +186,14 @@ predicate isRelevantType(J::Type t) { } /** - * Gets the CSV string representation of the qualifier. + * Gets the MaD string representation of the qualifier. */ string qualifierString() { result = "Argument[this]" } -private string parameterAccess(J::Parameter p) { +/** + * Gets the MaD string representation of the parameter `p`. + */ +string parameterAccess(J::Parameter p) { if p.getType() instanceof J::Array and not isPrimitiveTypeUsedForBulkData(p.getType().(J::Array).getElementType()) @@ -202,17 +204,10 @@ private string parameterAccess(J::Parameter p) { else result = "Argument[" + p.getPosition() + "]" } -/** - * Gets the CSV string representation of the parameter node `p`. - */ -string parameterNodeAsInput(DataFlow::ParameterNode p) { - result = parameterAccess(p.asParameter()) - or - result = qualifierString() and p instanceof DataFlow::InstanceParameterNode -} +class InstanceParameterNode = DataFlow::InstanceParameterNode; /** - * Gets the CSV string represention of the the return node `node`. + * Gets the MaD string represention of the the return node `node`. */ string returnNodeAsOutput(DataFlowImplCommon::ReturnNodeExt node) { if node.getKind() instanceof DataFlowImplCommon::ValueReturnKind @@ -268,9 +263,9 @@ predicate apiSource(DataFlow::Node source) { } /** - * Gets the CSV input string representation of `source`. + * Gets the MaD input string representation of `source`. */ -string asInputArgument(DataFlow::Node source) { +string asInputArgumentSpecific(DataFlow::Node source) { exists(int pos | source.(DataFlow::ParameterNode).isParameterOf(_, pos) and result = "Argument[" + pos + "]" diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll b/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll similarity index 94% rename from java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll rename to java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll index b859fef0ebb..65a892262f5 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll @@ -1,9 +1,5 @@ private import CaptureModels -private class Activate extends ActiveConfiguration { - override predicate activateThroughFlowConfig() { any() } -} - /** * Capture fluent APIs that return `this`. * Example of a fluent API: diff --git a/java/ql/test/TestUtilities/InlineFlowTest.qll b/java/ql/test/TestUtilities/InlineFlowTest.qll index bd4ef924da2..efc5a6fab2b 100644 --- a/java/ql/test/TestUtilities/InlineFlowTest.qll +++ b/java/ql/test/TestUtilities/InlineFlowTest.qll @@ -57,9 +57,9 @@ module DefaultFlowConfig implements DataFlow::ConfigSig { int fieldFlowBranchLimit() { result = 1000 } } -private module DefaultValueFlow = DataFlow::Make; +private module DefaultValueFlow = DataFlow::Global; -private module DefaultTaintFlow = TaintTracking::Make; +private module DefaultTaintFlow = TaintTracking::Global; class DefaultValueFlowConf extends DataFlow::Configuration { DefaultValueFlowConf() { this = "qltest:defaultValueFlowConf" } @@ -118,13 +118,13 @@ class InlineFlowTest extends InlineExpectationsTest { predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { if exists(EnableLegacyConfiguration e) then getValueFlowConfig().hasFlow(src, sink) - else DefaultValueFlow::hasFlow(src, sink) + else DefaultValueFlow::flow(src, sink) } predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { if exists(EnableLegacyConfiguration e) then getTaintFlowConfig().hasFlow(src, sink) - else DefaultTaintFlow::hasFlow(src, sink) + else DefaultTaintFlow::flow(src, sink) } DataFlow::Configuration getValueFlowConfig() { result = any(DefaultValueFlowConf config) } diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index a64f4ec71c0..0f52da636e6 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -1,14 +1,23 @@ -import java.io.IOException; -import java.io.File; +package generatedtest; // for java.util.ResourceBundle.getString test + +import java.awt.*; +import java.io.*; import java.math.BigDecimal; +import java.net.URL; +import java.nio.file.Path; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.util.EventObject; +import java.util.ResourceBundle; import java.util.StringJoiner; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.function.Supplier; +import java.util.logging.Logger; +import java.util.regex.Pattern; import java.util.stream.Collectors; public class Test { @@ -17,6 +26,8 @@ public class Test { Object source() { return null; } + Object newWithMapValueDefault(Object element) { return null; } // for java.util.ResourceBundle.getString test + public void test() throws Exception { // top 100 JDK APIs tests @@ -81,5 +92,107 @@ public class Test { StringJoiner sj2 = (StringJoiner)source(); sink(sj2.add("test")); // $hasTaintFlow } + + // top 300-500 JDK APIs tests + { + + // java.awt + Container container = new Container(); + sink(container.add((Component)source())); // $hasValueFlow + + // java.io + File f1 = (File)source(); + sink(f1.getParentFile()); // $hasTaintFlow + + File f2 = (File)source(); + sink(f2.getPath()); // $hasTaintFlow + + File f3 = (File)source(); + sink(f3.listFiles()); // $hasTaintFlow + + StringWriter sw = (StringWriter)source(); + sink(sw.toString()); // $hasTaintFlow + + Exception e = new UncheckedIOException((IOException)source()); + sink((Throwable)e.getCause()); // $hasValueFlow + + // java.net + URL url = (URL)source(); + sink(url.toURI()); // $hasTaintFlow + + // java.nio.file + Path p = (Path)source(); + sink(p.getFileName()); // $hasTaintFlow + + // java.util.concurrent.atomic + AtomicReference ar = new AtomicReference(); + ar.set(source()); + sink(ar.get()); // $hasValueFlow + + // java.util.concurrent + // `ThreadPoolExecutor` implements the `java.util.concurrent.ExecutorService` interface + ThreadPoolExecutor tpe = new ThreadPoolExecutor(0, 0, 0, null, null); + sink(tpe.submit((Runnable)source())); // $hasTaintFlow + + CompletionStage cs = (CompletionStage)source(); + sink(cs.toCompletableFuture()); // $hasTaintFlow + + CompletableFuture cf1 = new CompletableFuture(); + cf1.complete(source()); + sink(cf1.get()); // $hasValueFlow + sink(cf1.join()); // $hasValueFlow + + CompletableFuture cf2 = CompletableFuture.completedFuture(source()); + sink(cf2.get()); // $hasValueFlow + sink(cf2.join()); // $hasValueFlow + + // java.util.logging + Logger logger = Logger.getLogger((String)source()); + sink(logger.getName()); // $hasValueFlow + + // java.util.regex + Pattern pattern = Pattern.compile((String)source()); + sink(pattern); // $hasTaintFlow + + // java.util + EventObject eventObj = new EventObject(source()); + sink(eventObj.getSource()); // $hasValueFlow + + // "java.util;ResourceBundle;true;getString;(String);;Argument[-1].MapValue;ReturnValue;value;manual" + String out = null; + ResourceBundle in = (ResourceBundle)newWithMapValueDefault(source()); + out = in.getString(null); + sink(out); // $ hasValueFlow + + // java.lang + AssertionError assertErr = new AssertionError(source()); + sink((String)assertErr.getMessage()); // $hasValueFlow + + sink(Test.class.cast(source())); // $hasValueFlow + + Exception excep1 = new Exception((String)source(), (Throwable)source()); + sink((String)excep1.getMessage()); // $hasValueFlow + sink((Throwable)excep1.getCause()); // $hasValueFlow + + Exception excep2 = new NullPointerException((String)source()); + sink((String)excep2.getMessage()); // $hasValueFlow + + StringBuilder sb = (StringBuilder)source(); + sink(sb.delete(0, 1)); // $hasValueFlow + + Thread thread1 = new Thread((Runnable)source()); + sink(thread1); // $hasTaintFlow + + Thread thread2 = new Thread((String)source()); + sink(thread2.getName()); // $hasValueFlow + + ThreadLocal threadloc = new ThreadLocal(); + threadloc.set(source()); + sink(threadloc.get()); // $hasValueFlow + + Throwable th = new Throwable((String)source()); + sink((String)th.getLocalizedMessage()); // $hasValueFlow + sink(th.toString()); // $hasTaintFlow + } } } diff --git a/java/ql/test/ext/TestModels/test.ext.yml b/java/ql/test/ext/TestModels/test.ext.yml new file mode 100644 index 00000000000..4fff7d575a3 --- /dev/null +++ b/java/ql/test/ext/TestModels/test.ext.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-tests + extensible: summaryModel + data: + - ["generatedtest", "Test", False, "newWithMapValueDefault", "(Object)", "", "Argument[0]", "ReturnValue.MapValue", "value", "manual"] diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index 9bd5e1f9623..b0a8902b12b 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -111,7 +111,170 @@ predicate topJdkApiName(string apiName) { "java.util.Collection#iterator()", "java.util.Map#computeIfAbsent(Object,Function)", "java.text.SimpleDateFormat#SimpleDateFormat(String)", "java.util.StringJoiner#add(CharSequence)", "java.lang.Long#longValue()", - "java.util.stream.Collectors#joining(CharSequence)" + "java.util.stream.Collectors#joining(CharSequence)", + // top 300 JDK APIs + "java.lang.Math#max(int,int)", "java.util.Map#of(Object,Object)", + "java.lang.Long#valueOf(long)", "java.util.Random#nextInt(int)", + "java.lang.Long#valueOf(String)", "java.util.concurrent.CountDownLatch#await(long,TimeUnit)", + "java.util.Properties#getProperty(String)", "java.util.Optional#isEmpty()", + "java.util.concurrent.CompletableFuture#get()", "java.util.Objects#isNull(Object)", + "java.lang.StringBuilder#append(long)", "java.awt.Container#add(Component,Object)", + "java.math.BigDecimal#add(BigDecimal)", "java.sql.PreparedStatement#executeQuery()", + "java.lang.StringBuilder#StringBuilder(int)", "java.util.Map#forEach(BiConsumer)", + "java.math.BigDecimal#BigDecimal(int)", "java.util.Collections#unmodifiableList(List)", + "java.util.Properties#put(Object,Object)", "java.sql.Timestamp#Timestamp(long)", + "java.util.List#equals(Object)", "java.lang.String#indexOf(int)", + "java.lang.Long#toString(long)", "java.lang.Integer#Integer(int)", + "java.util.concurrent.atomic.AtomicBoolean#get()", + "java.lang.System#setProperty(String,String)", "java.util.concurrent.Future#get()", + "java.lang.Thread#start()", "java.util.Set#of(Object)", "java.util.Calendar#set(int,int)", + "java.time.Duration#ofSeconds(long)", "java.lang.System#arraycopy(Object,int,Object,int,int)", + "java.net.URI#toString()", "java.util.concurrent.atomic.AtomicInteger#incrementAndGet()", + "java.util.Set#remove(Object)", "java.lang.Boolean#parseBoolean(String)", + "java.util.Calendar#getTime()", "java.nio.charset.Charset#name()", + "java.lang.ThreadLocal#get()", "java.lang.Class#getCanonicalName()", + "java.util.List#remove(Object)", "java.lang.Throwable#toString()", + "java.util.stream.Stream#toList()", "java.io.ByteArrayOutputStream#toByteArray()", + "java.util.concurrent.atomic.AtomicLong#get()", + "java.lang.NullPointerException#NullPointerException(String)", "java.util.List#of()", + "java.util.Calendar#getInstance()", "java.util.Calendar#get(int)", + "java.util.Optional#orElseThrow()", "java.lang.System#lineSeparator()", + "java.lang.Boolean#booleanValue()", "java.util.logging.Logger#isLoggable(Level)", + "java.lang.Enum#hashCode()", "java.util.List#hashCode()", + "java.lang.reflect.Method#invoke(Object,Object[])", "java.lang.String#String(byte[],Charset)", + "java.util.Comparator#comparing(Function)", "java.util.Arrays#toString(Object[])", + "java.time.LocalDate#now()", "java.util.function.Function#identity()", + "java.io.OutputStream#write(byte[])", "java.lang.Integer#equals(Object)", + "java.io.BufferedReader#BufferedReader(Reader)", "java.io.DataInput#readInt()", + "java.io.BufferedReader#readLine()", "java.util.Map#entry(Object,Object)", + "java.lang.Runnable#run()", "java.util.ResourceBundle#getString(String)", + "java.util.Iterator#remove()", "java.lang.String#join(CharSequence,Iterable)", + "java.util.concurrent.atomic.AtomicBoolean#set(boolean)", "java.time.LocalDateTime#now()", + "java.sql.ResultSet#getLong(String)", "java.text.DateFormat#parse(String)", + "java.lang.String#toString()", "java.lang.Integer#valueOf(String)", + "java.util.regex.Matcher#find()", "java.io.DataOutput#writeInt(int)", + "java.util.HashMap#HashMap(int)", "java.util.stream.Stream#sorted(Comparator)", + "java.lang.String#toCharArray()", + "java.util.concurrent.atomic.AtomicInteger#AtomicInteger(int)", + "java.lang.String#String(byte[])", "java.lang.reflect.Method#getName()", + "java.sql.ResultSet#getString(int)", "java.net.URI#create(String)", + "java.lang.Enum#ordinal()", "java.util.concurrent.atomic.AtomicReference#set(Object)", + "java.util.concurrent.CompletableFuture#join()", + "java.io.FileInputStream#FileInputStream(File)", "java.io.File#delete()", + "java.util.concurrent.TimeUnit#toMillis(long)", "java.util.List#of(Object,Object,Object)", + "java.lang.String#compareTo(String)", "java.util.stream.IntStream#range(int,int)", + "java.math.BigInteger#valueOf(long)", "java.util.List#remove(int)", + "java.util.HashMap#HashMap(Map)", "java.util.function.BiConsumer#accept(Object,Object)", + // top 400 JDK APIs + "java.util.HashMap#containsKey(Object)", "java.util.Collection#contains(Object)", + "java.lang.Double#parseDouble(String)", "java.lang.Thread#interrupt()", + "java.awt.Container#add(Component)", "java.time.chrono.ChronoZonedDateTime#toInstant()", + "java.util.List#subList(int,int)", "java.util.concurrent.ConcurrentHashMap#get(Object)", + "java.lang.System#getenv(String)", "java.time.Duration#ofMillis(long)", + "java.lang.Integer#toString()", "java.lang.reflect.Constructor#newInstance(Object[])", + "java.util.Hashtable#get(Object)", "java.lang.Class#toString()", + "java.util.Vector#add(Object)", "java.io.StringReader#StringReader(String)", + "java.io.File#getPath()", "java.lang.System#identityHashCode(Object)", + "java.util.stream.Stream#count()", "java.util.concurrent.CompletableFuture#complete(Object)", + "java.nio.file.Files#exists(Path,LinkOption[])", "java.util.List#set(int,Object)", + "java.util.concurrent.atomic.AtomicLong#AtomicLong(long)", + "java.util.Optional#orElseGet(Supplier)", "java.lang.Class#forName(String)", + "java.lang.String#replace(char,char)", "java.util.Enumeration#nextElement()", + "java.lang.Class#getMethod(String,Class[])", "java.nio.file.Path#toAbsolutePath()", + "java.util.Enumeration#hasMoreElements()", "java.lang.Class#cast(Object)", + "java.util.concurrent.atomic.AtomicBoolean#AtomicBoolean(boolean)", + "java.math.BigDecimal#doubleValue()", "java.util.UUID#fromString(String)", + "java.lang.System#exit(int)", "java.util.List#add(int,Object)", + "java.lang.Boolean#valueOf(boolean)", "java.sql.Timestamp#getTime()", + "java.nio.Buffer#remaining()", "java.net.URL#URL(String)", "java.net.URI#URI(String)", + "java.util.Objects#hashCode(Object)", "java.util.Set#clear()", "java.io.File#isDirectory()", + "java.time.Duration#toMillis()", "java.nio.ByteBuffer#allocate(int)", + "java.math.BigDecimal#toString()", "java.lang.Class#getResourceAsStream(String)", + "java.util.logging.Logger#getLogger(String)", "java.lang.String#toLowerCase(Locale)", + "java.util.concurrent.CompletableFuture#completeExceptionally(Throwable)", + "java.util.stream.Stream#findAny()", + "java.util.concurrent.CompletableFuture#completedFuture(Object)", + "java.util.stream.Stream#of(Object)", "java.util.Map#of(Object,Object,Object,Object)", + "java.util.Collections#sort(List,Comparator)", "java.lang.Thread#Thread(Runnable)", + "java.lang.String#lastIndexOf(int)", + "java.io.UncheckedIOException#UncheckedIOException(IOException)", + "java.util.LinkedHashSet#LinkedHashSet(Collection)", + "java.sql.PreparedStatement#executeUpdate()", "java.time.ZoneId#of(String)", + "java.util.concurrent.atomic.AtomicLong#addAndGet(long)", "java.nio.ByteBuffer#wrap(byte[])", + "java.util.List#indexOf(Object)", "java.util.Collections#unmodifiableMap(Map)", + "java.lang.Long#Long(long)", "java.util.StringTokenizer#nextToken()", + "java.lang.String#join(CharSequence,CharSequence[])", "java.io.StringWriter#toString()", + "java.lang.Integer#toHexString(int)", "java.lang.Long#intValue()", + "java.text.MessageFormat#format(String,Object[])", + "java.lang.Exception#Exception(String,Throwable)", + "java.util.stream.Stream#toArray(IntFunction)", "java.util.List#sort(Comparator)", + "java.util.LinkedHashMap#get(Object)", "java.sql.PreparedStatement#setLong(int,long)", + "java.lang.Iterable#iterator()", "java.math.BigInteger#or(BigInteger)", + "java.time.LocalDateTime#of(int,int,int,int,int,int)", "java.time.Instant#toEpochMilli()", + "java.math.BigDecimal#setScale(int,RoundingMode)", "java.lang.Class#isInstance(Object)", + "java.util.regex.Pattern#compile(String)", "java.util.Calendar#getTimeInMillis()", + "java.lang.Class#getResource(String)", "java.util.concurrent.Executor#execute(Runnable)", + "java.util.concurrent.locks.Lock#unlock()", "java.lang.AssertionError#AssertionError(Object)", + "java.util.ArrayList#addAll(Collection)", "java.io.File#mkdirs()", + "java.time.Duration#ofMinutes(long)", "java.time.format.DateTimeFormatter#ofPattern(String)", + "java.lang.Throwable#getLocalizedMessage()", "java.lang.StringBuilder#delete(int,int)", + "java.util.Vector#size()", "java.lang.String#String(String)", "java.util.ArrayList#isEmpty()", + "java.util.Collection#removeIf(Predicate)", + // top 500 JDK APIs + "java.util.HashSet#HashSet(int)", "java.util.Set#of(Object,Object)", + "java.util.Collections#unmodifiableSet(Set)", "java.sql.Connection#createStatement()", + "java.math.BigDecimal#subtract(BigDecimal)", "java.util.Date#from(Instant)", + "java.lang.StringBuffer#append(char)", "java.util.Locale#forLanguageTag(String)", + "java.io.DataInput#readLong()", "java.util.Collections#sort(List)", + "java.io.DataOutput#writeLong(long)", "java.util.function.BiFunction#apply(Object,Object)", + "java.lang.String#lastIndexOf(String)", "java.util.Optional#filter(Predicate)", + "java.lang.StringBuffer#append(Object)", "java.io.File#getParentFile()", + "java.util.stream.Stream#allMatch(Predicate)", "java.sql.ResultSet#getTimestamp(String)", + "java.util.Calendar#setTime(Date)", + "java.util.concurrent.CompletionStage#toCompletableFuture()", + "java.util.concurrent.locks.Lock#lock()", "java.lang.reflect.Field#get(Object)", + "java.io.InputStream#close()", "java.math.BigInteger#BigInteger(String)", + "java.lang.Class#getDeclaredField(String)", + "java.io.InputStreamReader#InputStreamReader(InputStream)", "java.lang.Runtime#getRuntime()", + "java.lang.Class#getDeclaredConstructor(Class[])", + "java.lang.AbstractStringBuilder#setLength(int)", "java.nio.Buffer#position()", + "java.nio.file.Path#getFileName()", "java.util.List#toArray()", + "java.lang.CharSequence#length()", "java.util.stream.Stream#distinct()", + "java.net.URL#toURI()", "java.util.Queue#poll()", "java.lang.Thread#getContextClassLoader()", + "java.lang.String#valueOf(boolean)", "java.util.Calendar#add(int,int)", + "java.util.HashMap#entrySet()", "java.util.stream.IntStream#mapToObj(IntFunction)", + "java.util.concurrent.atomic.AtomicLong#incrementAndGet()", + "java.util.concurrent.ExecutorService#shutdown()", + "java.util.concurrent.ExecutorService#submit(Runnable)", "java.math.BigDecimal#intValue()", + "java.math.BigDecimal#toBigInteger()", "java.util.LinkedList#add(Object)", + "java.lang.AbstractStringBuilder#charAt(int)", "java.lang.Thread#getName()", + "java.lang.Math#max(long,long)", "java.util.HashMap#size()", + "java.time.LocalDate#plusDays(long)", "java.nio.ByteBuffer#array()", + "java.lang.StringBuilder#append(CharSequence)", "java.util.Vector#addElement(Object)", + "java.lang.ClassLoader#getResource(String)", "java.awt.Insets#Insets(int,int,int,int)", + "java.util.TimeZone#getTimeZone(String)", "java.time.ZoneId#systemDefault()", + "java.lang.Number#doubleValue()", "java.util.stream.Stream#reduce(Object,BinaryOperator)", + "java.lang.CharSequence#toString()", "java.time.Instant#parse(CharSequence)", + "java.text.Format#format(Object)", "java.io.File#toURI()", "java.sql.ResultSet#getInt(int)", + "java.lang.Number#longValue()", "java.lang.Double#doubleToLongBits(double)", + "java.lang.Math#min(long,long)", "java.lang.Double#valueOf(double)", + "java.lang.invoke.MethodHandles#lookup()", "java.util.concurrent.CompletableFuture#isDone()", + "java.time.LocalDate#parse(CharSequence)", "java.lang.StringBuilder#append(boolean)", + "java.util.concurrent.CountDownLatch#await()", + "java.util.concurrent.ConcurrentHashMap#put(Object,Object)", + "java.util.stream.Stream#mapToInt(ToIntFunction)", + "java.math.BigDecimal#multiply(BigDecimal)", "java.util.stream.Stream#concat(Stream,Stream)", + "java.time.Instant#ofEpochMilli(long)", "java.nio.file.Path#getParent()", + "java.util.stream.Stream#sorted()", + "java.util.concurrent.atomic.AtomicBoolean#compareAndSet(boolean,boolean)", + "java.util.UUID#equals(Object)", "java.io.OutputStream#flush()", + "java.time.format.DateTimeFormatter#format(TemporalAccessor)", "java.io.Closeable#close()", + "java.util.EventObject#getSource()", "java.io.File#File(String,String)", + "java.lang.Number#intValue()", "java.io.File#length()", + "java.lang.AbstractStringBuilder#setCharAt(int,char)", "java.util.Set#removeAll(Collection)", + "java.io.File#listFiles()", "java.lang.ClassLoader#getResourceAsStream(String)", + "java.util.Date#toInstant()", "java.util.Queue#add(Object)", "java.io.File#isFile()", + "java.sql.Statement#close()", "java.io.DataOutput#writeBoolean(boolean)" ] } @@ -145,7 +308,13 @@ class TopJdkApi extends SummarizedCallableBase { * Note: the following top JDK APIs are not modeled with MaD: * `java.lang.String#valueOf(Object)`: a complex case; an alias for `Object.toString`, except the dispatch is hidden * `java.lang.System#getProperty(String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs + * `java.lang.System#setProperty(String,String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs * `java.lang.Throwable#printStackTrace()`: should probably not be a general step, but there might be specialised queries that care + * `java.text.Format#format(Object)`: similar issue as `Object.toString`; depends on the object being passed as the argument + * `java.text.MessageFormat#format(String,Object[])`: similar issue as `Object.toString`; depends on the object being passed as the argument + * `java.util.Comparator#comparing(Function)`: lambda flow + * `java.util.function.BiConsumer#accept(Object,Object)`: specialized lambda flow + * `java.util.function.BiFunction#apply(Object,Object)`: specialized lambda flow * `java.util.function.Consumer#accept(Object)`: specialized lambda flow * `java.util.function.Function#apply(Object)`: specialized lambda flow * `java.util.function.Supplier#get()`: lambda flow diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected index 3ef93396b3b..2e0ace91209 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected @@ -1,6 +1,12 @@ | java.lang.String#valueOf(Object) | no manual model | | java.lang.System#getProperty(String) | no manual model | +| java.lang.System#setProperty(String,String) | no manual model | | java.lang.Throwable#printStackTrace() | no manual model | +| java.text.Format#format(Object) | no manual model | +| java.text.MessageFormat#format(String,Object[]) | no manual model | +| java.util.Comparator#comparing(Function) | no manual model | +| java.util.function.BiConsumer#accept(Object,Object) | no manual model | +| java.util.function.BiFunction#apply(Object,Object) | no manual model | | java.util.function.Consumer#accept(Object) | no manual model | | java.util.function.Function#apply(Object) | no manual model | | java.util.function.Supplier#get() | no manual model | diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java index 49a7396ad64..90797502198 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java @@ -1,25 +1,43 @@ +import java.awt.Container; +import java.io.BufferedReader; import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.UncheckedIOException; +import java.lang.AssertionError; import java.lang.IllegalStateException; import java.lang.IndexOutOfBoundsException; +import java.lang.NullPointerException; import java.lang.Math; +import java.lang.Runtime; import java.lang.System; import java.math.BigDecimal; +import java.nio.file.Files; import java.nio.file.Paths; import java.sql.ResultSet; import java.text.DateFormat; +import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.Map; import java.util.Objects; import java.util.StringJoiner; +import java.util.StringTokenizer; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; diff --git a/java/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/java/ql/test/library-tests/dataflow/external-models/validatemodels.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test/library-tests/dataflow/external-models/validatemodels.ql b/java/ql/test/library-tests/dataflow/external-models/validatemodels.ql new file mode 100644 index 00000000000..84312d3d4e4 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/external-models/validatemodels.ql @@ -0,0 +1,15 @@ +import java +import semmle.code.java.dataflow.ExternalFlow +import semmle.code.java.dataflow.internal.AccessPathSyntax +import ModelValidation + +private predicate getRelevantAccessPath(string path) { + summaryModel(_, _, _, _, _, _, path, _, _, _) or + summaryModel(_, _, _, _, _, _, _, path, _, _) or + sinkModel(_, _, _, _, _, _, path, _, _) or + sourceModel(_, _, _, _, _, _, path, _, _) +} + +private class AccessPathsExternal extends AccessPath::Range { + AccessPathsExternal() { getRelevantAccessPath(this) } +} diff --git a/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql b/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql index a582f5b2456..7635dae3820 100644 --- a/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql +++ b/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql @@ -47,13 +47,13 @@ module Conf4 implements ConfigSig { } predicate flow(Node src, Node sink, string s) { - Make::hasFlow(src, sink) and s = "nobarrier" + Global::flow(src, sink) and s = "nobarrier" or - Make::hasFlow(src, sink) and s = "srcbarrier" + Global::flow(src, sink) and s = "srcbarrier" or - Make::hasFlow(src, sink) and s = "sinkbarrier" + Global::flow(src, sink) and s = "sinkbarrier" or - Make::hasFlow(src, sink) and s = "both" + Global::flow(src, sink) and s = "both" } from Node src, Node sink, string s diff --git a/java/ql/test/library-tests/dataflow/partial/test.ql b/java/ql/test/library-tests/dataflow/partial/test.ql index 399a876e9a9..4b2e5e71ff4 100644 --- a/java/ql/test/library-tests/dataflow/partial/test.ql +++ b/java/ql/test/library-tests/dataflow/partial/test.ql @@ -10,10 +10,10 @@ module Config implements ConfigSig { int explorationLimit() { result = 10 } -module PartialFlow = Make::FlowExploration; +module PartialFlow = Global::FlowExploration; import PartialFlow::PartialPathGraph from PartialFlow::PartialPathNode n, int dist -where PartialFlow::hasPartialFlow(_, n, dist) +where PartialFlow::partialFlow(_, n, dist) select dist, n diff --git a/java/ql/test/library-tests/dataflow/partial/testRev.ql b/java/ql/test/library-tests/dataflow/partial/testRev.ql index c869cb4f915..f3f71d69e3b 100644 --- a/java/ql/test/library-tests/dataflow/partial/testRev.ql +++ b/java/ql/test/library-tests/dataflow/partial/testRev.ql @@ -10,10 +10,10 @@ module Config implements ConfigSig { int explorationLimit() { result = 10 } -module PartialFlow = Make::FlowExploration; +module PartialFlow = Global::FlowExploration; import PartialFlow::PartialPathGraph from PartialFlow::PartialPathNode n, int dist -where PartialFlow::hasPartialFlowRev(n, _, dist) +where PartialFlow::partialFlowRev(n, _, dist) select dist, n diff --git a/java/ql/test/library-tests/dataflow/state/test.ql b/java/ql/test/library-tests/dataflow/state/test.ql index afd7ed9a97e..b82dd95c0b1 100644 --- a/java/ql/test/library-tests/dataflow/state/test.ql +++ b/java/ql/test/library-tests/dataflow/state/test.ql @@ -55,7 +55,7 @@ module Config implements DataFlow::StateConfigSig { int explorationLimit() { result = 0 } -module Flow = TaintTracking::MakeWithState; +module Flow = TaintTracking::GlobalWithState; module PartialFlow = Flow::FlowExploration; @@ -67,7 +67,7 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "flow" and exists(Flow::PathNode src, Flow::PathNode sink | - Flow::hasFlowPath(src, sink) and + Flow::flowPath(src, sink) and sink.getNode().getLocation() = location and element = sink.toString() and value = src.getState() @@ -75,7 +75,7 @@ class HasFlowTest extends InlineExpectationsTest { or tag = "pFwd" and exists(PartialFlow::PartialPathNode src, PartialFlow::PartialPathNode node | - PartialFlow::hasPartialFlow(src, node, _) and + PartialFlow::partialFlow(src, node, _) and checkNode(node.getNode()) and node.getNode().getLocation() = location and element = node.toString() and @@ -84,7 +84,7 @@ class HasFlowTest extends InlineExpectationsTest { or tag = "pRev" and exists(PartialFlow::PartialPathNode node, PartialFlow::PartialPathNode sink | - PartialFlow::hasPartialFlowRev(node, sink, _) and + PartialFlow::partialFlowRev(node, sink, _) and checkNode(node.getNode()) and node.getNode().getLocation() = location and element = node.toString() and diff --git a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected index 8a20a6c6c7b..3f5b3663281 100644 --- a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected +++ b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected @@ -6,5 +6,6 @@ | java.net.URL#openConnection() | 1 | | java.net.URL#openStream() | 1 | | java.net.URLConnection#getInputStream() | 1 | +| java.time.Duration#ofMillis(long) | 1 | | java.util.Map#put(Object,Object) | 1 | | org.apache.commons.io.FileUtils#deleteDirectory(File) | 1 | diff --git a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java index 7dd289acbaa..6445e97b473 100644 --- a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java +++ b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java @@ -16,7 +16,7 @@ class SupportedExternalApis { Map map = new HashMap<>(); // uninteresting (parameterless constructor) map.put("foo", new Object()); // supported summary - Duration d = java.time.Duration.ofMillis(1000); // not supported + Duration d = java.time.Duration.ofMillis(1000); // supported neutral URL github = new URL("https://www.github.com/"); // supported summary InputStream stream = github.openConnection().getInputStream(); // supported source (getInputStream), supported sink (openConnection) @@ -24,6 +24,6 @@ class SupportedExternalApis { new FileWriter(new File("foo")); // supported sink (FileWriter), supported summary (File) new URL("http://foo").openStream(); // supported sink (openStream), supported summary (URL) - FileUtils.deleteDirectory(new File("foo")); // supported negative summary (deleteDirectory), supported summary (File) + FileUtils.deleteDirectory(new File("foo")); // supported neutral (deleteDirectory), supported summary (File) } } diff --git a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java index f0e3926c7e9..b398a791836 100644 --- a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java +++ b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java @@ -11,12 +11,13 @@ class ExternalApiUsage { Map map = new HashMap<>(); map.put("foo", new Object()); - Duration d = java.time.Duration.ofMillis(1000); // not supported + Duration d = java.time.Duration.ofMillis(1000); // supported as a neutral model long l = "foo".length(); // supported as a neutral model - AtomicReference ref = new AtomicReference<>(); // not supported - ref.set("foo"); + AtomicReference ref = new AtomicReference<>(); // uninteresting (parameterless constructor) + ref.set("foo"); // supported as a summary model + ref.toString(); // not supported String.class.isAssignableFrom(Object.class); // parameter with generic type, supported as a neutral model diff --git a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected index 7bab3b2d75a..6419b137690 100644 --- a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected +++ b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected @@ -1,2 +1 @@ -| java.time.Duration#ofMillis(long) | 1 | -| java.util.concurrent.atomic.AtomicReference#set(Object) | 1 | +| java.util.concurrent.atomic.AtomicReference#toString() | 1 | diff --git a/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql b/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql index 1e40c0a5d25..dd6aec2ebe3 100644 --- a/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql +++ b/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql @@ -10,7 +10,7 @@ class HasApkInstallationTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasApkInstallation" and - exists(DataFlow::Node sink | ApkInstallationFlow::hasFlowTo(sink) | + exists(DataFlow::Node sink | ApkInstallationFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql b/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql index ba753b0d930..73a41b1bd8e 100644 --- a/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql +++ b/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql @@ -12,6 +12,6 @@ private class LogInjectionTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - LogInjectionFlow::hasFlow(src, sink) + LogInjectionFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql b/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql index c434dbe413a..d90039cf920 100644 --- a/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql +++ b/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql @@ -6,6 +6,6 @@ class IntentUriPermissionManipulationTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - IntentUriPermissionManipulationFlow::hasFlow(src, sink) + IntentUriPermissionManipulationFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql b/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql index 5e2046c6fbf..55c07bbd301 100644 --- a/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql +++ b/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql @@ -6,6 +6,6 @@ class Test extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - UnsafeContentResolutionFlow::hasFlow(src, sink) + UnsafeContentResolutionFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql b/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql index 22b02c818f5..2771dd3af90 100644 --- a/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql +++ b/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql @@ -6,6 +6,6 @@ class Test extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - FragmentInjectionTaintFlow::hasFlow(src, sink) + FragmentInjectionTaintFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql b/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql index b868dcabf85..5de153a9e35 100644 --- a/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql +++ b/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql @@ -4,7 +4,7 @@ import semmle.code.java.security.SensitiveLoggingQuery class HasFlowTest extends InlineFlowTest { override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - SensitiveLoggerFlow::hasFlow(src, sink) + SensitiveLoggerFlow::flow(src, sink) } override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } diff --git a/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql b/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql index e31d890d908..75af0160def 100644 --- a/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql +++ b/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql @@ -9,7 +9,7 @@ class HasPolyRedos extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasPolyRedos" and exists(DataFlow::Node sink | - PolynomialRedosFlow::hasFlowTo(sink) and + PolynomialRedosFlow::flowTo(sink) and location = sink.getLocation() and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql b/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql index cdfdaea621e..01af77284f0 100644 --- a/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql +++ b/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql @@ -7,6 +7,6 @@ class HasFlowTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - RsaWithoutOaepFlow::hasFlow(src, sink) + RsaWithoutOaepFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql b/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql index b27d81ee073..865e6e8f0d3 100644 --- a/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql +++ b/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql @@ -10,7 +10,7 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "SSRF" and exists(DataFlow::Node sink | - RequestForgeryFlow::hasFlowTo(sink) and + RequestForgeryFlow::flowTo(sink) and sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql b/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql index c57c316310d..0f1864398b4 100644 --- a/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql +++ b/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql @@ -7,6 +7,6 @@ class HasFlowTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - SensitiveCommunicationFlow::hasFlow(src, sink) + SensitiveCommunicationFlow::flow(src, sink) } } diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/diagnostics.expected b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/diagnostics.expected new file mode 100644 index 00000000000..72108d0ebb5 --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/diagnostics.expected @@ -0,0 +1,15 @@ +{ + "timestamp": "2023-03-23T12:04:41.317+00:00", + "source": { + "id": "js/internal-error", + "name": "Internal error", + "extractorName": "javascript" + }, + "markdownMessage": "Internal error: com.semmle.util.exception.CatastrophicError: The TypeScript parser wrapper crashed with exit code 1", + "severity": "unknown", + "visibility": { + "cliSummaryTable": true, + "statusPage": false, + "telemetry": true + } +} \ No newline at end of file diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/src/my_failure.ts b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/src/my_failure.ts new file mode 100644 index 00000000000..29e78b136e8 --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/src/my_failure.ts @@ -0,0 +1,17 @@ +type Output = { + (...args: S): any; +}; + +declare function createThing( + type: K, + fn: (...args: S) => any +): Output; + +const one = createThing("one", () => ({})); + +const two = createThing("two", () => ({})); + +const three = createThing("three", (cursor: string) => null); +const four = createThing("four", (error: number) => null); + +type Events = Array; diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/test.py b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/test.py new file mode 100644 index 00000000000..3f6c33bf31c --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/test.py @@ -0,0 +1,7 @@ +import os +from create_database_utils import * +from diagnostics_test_utils import * + +run_codeql_database_create([], lang="javascript", runFunction = runUnsuccessfully, db = None) + +check_diagnostics() diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/tsconfig.json b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/tsconfig.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/tsconfig.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index bb0c197b3f2..53553dad5f4 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.5.1 + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getId` from the `Function`, `NamespaceDefinition`, and `ImportEqualsDeclaration` classes. +* Deleted the deprecated `flowsTo` predicate from the `HTTP::Servers::RequestSource` and `HTTP::Servers::ResponseSource` class. +* Deleted the deprecated `getEventName` predicate from the `SocketIO::ReceiveNode`, `SocketIO::SendNode`, `SocketIOClient::SendNode` classes. +* Deleted the deprecated `RateLimitedRouteHandlerExpr` and `RouteHandlerExpressionWithRateLimiter` classes. +* [Import assertions](https://github.com/tc39/proposal-import-assertions) are now supported. + Previously this feature was only supported in TypeScript code, but is now supported for plain JavaScript as well and is also accessible in the AST. + ## 0.5.0 ### Breaking Changes diff --git a/javascript/ql/lib/change-notes/2023-03-03-import-assertion.md b/javascript/ql/lib/change-notes/2023-03-03-import-assertion.md deleted file mode 100644 index b6ee92a6660..00000000000 --- a/javascript/ql/lib/change-notes/2023-03-03-import-assertion.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* [Import assertions](https://github.com/tc39/proposal-import-assertions) are now supported. - Previously this feature was only supported in TypeScript code, but is now supported for plain JavaScript as well and is also accessible in the AST. diff --git a/javascript/ql/lib/change-notes/2023-03-03-delete-deps.md b/javascript/ql/lib/change-notes/released/0.5.1.md similarity index 61% rename from javascript/ql/lib/change-notes/2023-03-03-delete-deps.md rename to javascript/ql/lib/change-notes/released/0.5.1.md index 3ac871fa8a2..972b37b573b 100644 --- a/javascript/ql/lib/change-notes/2023-03-03-delete-deps.md +++ b/javascript/ql/lib/change-notes/released/0.5.1.md @@ -1,8 +1,11 @@ ---- -category: minorAnalysis ---- +## 0.5.1 + +### Minor Analysis Improvements + * Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. * Deleted the deprecated `getId` from the `Function`, `NamespaceDefinition`, and `ImportEqualsDeclaration` classes. * Deleted the deprecated `flowsTo` predicate from the `HTTP::Servers::RequestSource` and `HTTP::Servers::ResponseSource` class. * Deleted the deprecated `getEventName` predicate from the `SocketIO::ReceiveNode`, `SocketIO::SendNode`, `SocketIOClient::SendNode` classes. -* Deleted the deprecated `RateLimitedRouteHandlerExpr` and `RouteHandlerExpressionWithRateLimiter` classes. \ No newline at end of file +* Deleted the deprecated `RateLimitedRouteHandlerExpr` and `RouteHandlerExpressionWithRateLimiter` classes. +* [Import assertions](https://github.com/tc39/proposal-import-assertions) are now supported. + Previously this feature was only supported in TypeScript code, but is now supported for plain JavaScript as well and is also accessible in the AST. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 30e271c5361..0bf7024c337 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.0 +lastReleaseVersion: 0.5.1 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 22328fa622b..5c650164c39 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 0.5.1-dev +version: 0.5.2-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll index dc28e44ecdd..888f41e0a71 100644 --- a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll +++ b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll @@ -270,6 +270,19 @@ module AccessPath { /** A module for computing an access to a variable that happens after a property has been written onto it */ private module GetLaterAccess { + /** + * Gets an reference to the SSA variable `variable`. + * Either the definition or a use of the SSA variable + */ + private VarRef getAVariableRef(SsaVariable variable) { + ( + result = variable.getAUse() + or + result = variable.getDefinition().(SsaExplicitDefinition).getDef().getTarget() + ) and + variable = getARelevantVariableSimple() + } + /** * Gets an access to a variable that is written to in `write`, where the access is after the write. * @@ -286,7 +299,7 @@ module AccessPath { pragma[noopt] DataFlow::Node getLaterBaseAccess(DataFlow::PropWrite write) { exists( - ControlFlowNode writeNode, BindingPattern access, VarRef otherAccess, Variable variable, + ControlFlowNode writeNode, BindingPattern access, VarRef otherAccess, SsaVariable variable, StmtContainer container | access = getBaseVar(write) and @@ -303,7 +316,7 @@ module AccessPath { i < j ) or - otherAccess.getBasicBlock() = getASuccessorBBThatReadsVar(write) // more manual magic - outlined into a helper predicate. + otherAccess.getBasicBlock() = getASuccessorBBThatReadsVar(write) ) } @@ -323,24 +336,34 @@ module AccessPath { } /** Gets an access to `var` inside `container` where `usedInWrite` indicates whether the access is the base of a property write. */ - private VarRef getAnAccessInContainer(Variable var, StmtContainer container, boolean usedInWrite) { - result.getVariable() = var and + private VarRef getAnAccessInContainer( + SsaVariable var, StmtContainer container, boolean usedInWrite + ) { + result = getAVariableRef(var) and result.getContainer() = container and - var.isLocal() and if result = getBaseVar(_) then usedInWrite = true else usedInWrite = false } - /** Gets a variable that is relevant for the computations in the `GetLaterAccess` module. */ - private Variable getARelevantVariable() { + /** + * Gets a variable that is relevant for the computations in the `GetLaterAccess` module. + * This predicate restricts as much as it can, but without depending on `getAVariableRef`. + */ + pragma[inline] + private SsaVariable getARelevantVariableSimple() { // The variable might be used where `getLaterBaseAccess()` is called. exists(DataFlow::Node node | exists(fromRhs(node, _)) and - node.asExpr().(VarAccess).getVariable() = result - ) and + node.asExpr() = result.getAUse() + ) + } + + /** + * Gets a variable that is relevant for the computations in the `GetLaterAccess` module. + * This predicate depends on `getAVariableRef`, which in turn depends on `getARelevantVariableSimple`. + */ + private SsaVariable getARelevantVariable() { // There is a write that writes to the variable. - getBaseVar(_).getVariable() = result and - // It's local. - result.isLocal() and // we skip global variables, because that turns messy quick. + getBaseVar(_) = getAVariableRef(result) and // There is both a "write" and "read" in the same container of the variable. exists(StmtContainer container | exists(getAnAccessInContainer(result, container, true)) and // a "write", an access to the variable that is the base of a property reference. @@ -350,15 +373,15 @@ module AccessPath { /** Gets a basic-block that has a read of the variable that is written to by `write`, where the basicblock occurs after `start`. */ private ReachableBasicBlock getASuccessorBBThatReadsVar(DataFlow::PropWrite write) { - exists(VarAccess baseExpr, Variable var, ControlFlowNode writeNode | + exists(VarRef baseExpr, SsaVariable var, ControlFlowNode writeNode | baseExpr = getBaseVar(write) and - var = baseExpr.getVariable() and + getAVariableRef(var) = baseExpr and var = getARelevantVariable() and writeNode = write.getWriteNode() and - writeNode.getBasicBlock().(ReachableBasicBlock).strictlyDominates(result) and - // manual magic. - result = getAnAccessInContainer(getARelevantVariable(), _, false).getBasicBlock() + result.getImmediateDominator() = writeNode.getBasicBlock() ) + or + result.getImmediateDominator() = getASuccessorBBThatReadsVar(write) } } diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 2b0ef33f565..1abcc918b2c 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.5.5 + +### Minor Analysis Improvements + +* The following queries now recognize HTML sanitizers as propagating taint: `js/sql-injection`, + `js/path-injection`, `js/server-side-unvalidated-url-redirection`, `js/client-side-unvalidated-url-redirection`, + and `js/request-forgery`. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql b/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql index 0f7e22b7f57..9826ebefe5f 100644 --- a/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql +++ b/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql @@ -21,4 +21,4 @@ where cfg.hasFlowPath(source, sink) and not source.getNode() instanceof CleartextPasswordExpr // flagged by js/insufficient-password-hash select sink.getNode(), source, sink, "A broken or weak cryptographic algorithm depends on $@.", - source.getNode(), "sensitive data from" + source.getNode().(Source).describe() + source.getNode(), "sensitive data from " + source.getNode().(Source).describe() diff --git a/javascript/ql/src/change-notes/2023-03-07-html-sanitizer-for-sql.md b/javascript/ql/src/change-notes/released/0.5.5.md similarity index 84% rename from javascript/ql/src/change-notes/2023-03-07-html-sanitizer-for-sql.md rename to javascript/ql/src/change-notes/released/0.5.5.md index b26c1caec02..78f2dd33acf 100644 --- a/javascript/ql/src/change-notes/2023-03-07-html-sanitizer-for-sql.md +++ b/javascript/ql/src/change-notes/released/0.5.5.md @@ -1,6 +1,7 @@ ---- -category: minorAnalysis ---- +## 0.5.5 + +### Minor Analysis Improvements + * The following queries now recognize HTML sanitizers as propagating taint: `js/sql-injection`, `js/path-injection`, `js/server-side-unvalidated-url-redirection`, `js/client-side-unvalidated-url-redirection`, and `js/request-forgery`. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index eda7c965604..ca8f353446a 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 0.5.5-dev +version: 0.5.6-dev groups: - javascript - queries diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected index 14733b4274d..725c600ecaa 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected @@ -42,8 +42,11 @@ nodes | lib/index.js:112:17:112:21 | taint | | lib/index.js:112:17:112:21 | taint | | lib/index.js:113:20:113:24 | taint | +| lib/index.js:115:38:115:42 | taint | | lib/index.js:121:34:121:38 | taint | | lib/index.js:129:32:129:36 | taint | +| lib/index.js:135:23:135:49 | this.op ... dOption | +| lib/index.js:135:23:135:49 | this.op ... dOption | | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:137:23:137:49 | this.op ... dOption | @@ -94,12 +97,16 @@ edges | lib/index.js:98:30:98:34 | taint | lib/index.js:105:21:105:47 | this.op ... dOption | | lib/index.js:112:17:112:21 | taint | lib/index.js:113:20:113:24 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:113:20:113:24 | taint | +| lib/index.js:112:17:112:21 | taint | lib/index.js:115:38:115:42 | taint | +| lib/index.js:112:17:112:21 | taint | lib/index.js:115:38:115:42 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:121:34:121:38 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:121:34:121:38 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:129:32:129:36 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:129:32:129:36 | taint | | lib/index.js:113:20:113:24 | taint | lib/index.js:138:23:138:32 | this.taint | | lib/index.js:113:20:113:24 | taint | lib/index.js:138:23:138:32 | this.taint | +| lib/index.js:115:38:115:42 | taint | lib/index.js:135:23:135:49 | this.op ... dOption | +| lib/index.js:115:38:115:42 | taint | lib/index.js:135:23:135:49 | this.op ... dOption | | lib/index.js:121:34:121:38 | taint | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:121:34:121:38 | taint | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:129:32:129:36 | taint | lib/index.js:137:23:137:49 | this.op ... dOption | @@ -114,6 +121,7 @@ edges | lib/index.js:104:21:104:47 | this.op ... dOption | lib/index.js:86:15:86:19 | taint | lib/index.js:104:21:104:47 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:86:15:86:19 | taint | library input | lib/index.js:104:10:104:67 | " var ... ing();" | interpreted as code | | lib/index.js:105:21:105:47 | this.op ... dOption | lib/index.js:86:15:86:19 | taint | lib/index.js:105:21:105:47 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:86:15:86:19 | taint | library input | lib/index.js:105:10:105:67 | " var ... ing();" | interpreted as code | | lib/index.js:106:21:106:30 | this.taint | lib/index.js:86:15:86:19 | taint | lib/index.js:106:21:106:30 | this.taint | This string concatenation which depends on $@ is later $@. | lib/index.js:86:15:86:19 | taint | library input | lib/index.js:106:10:106:50 | " var ... ing();" | interpreted as code | +| lib/index.js:135:23:135:49 | this.op ... dOption | lib/index.js:112:17:112:21 | taint | lib/index.js:135:23:135:49 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:135:12:135:69 | " var ... ing();" | interpreted as code | | lib/index.js:136:23:136:49 | this.op ... dOption | lib/index.js:112:17:112:21 | taint | lib/index.js:136:23:136:49 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:136:12:136:69 | " var ... ing();" | interpreted as code | | lib/index.js:137:23:137:49 | this.op ... dOption | lib/index.js:112:17:112:21 | taint | lib/index.js:137:23:137:49 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:137:12:137:69 | " var ... ing();" | interpreted as code | | lib/index.js:138:23:138:32 | this.taint | lib/index.js:112:17:112:21 | taint | lib/index.js:138:23:138:32 | this.taint | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:138:12:138:52 | " var ... ing();" | interpreted as code | diff --git a/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected b/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected index ce03e114f4e..1938b020355 100644 --- a/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected +++ b/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected @@ -26,8 +26,8 @@ edges | tst.js:19:17:19:24 | password | tst.js:19:17:19:24 | password | | tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | #select -| tst.js:11:17:11:26 | secretText | tst.js:3:18:3:24 | trusted | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data froman access to trusted | -| tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:11:17:11:26 | secretText | sensitive data froman access to secretText | -| tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | A broken or weak cryptographic algorithm depends on $@. | tst.js:17:17:17:25 | o.trusted | sensitive data froman access to trusted | -| tst.js:22:21:22:30 | secretText | tst.js:3:18:3:24 | trusted | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data froman access to trusted | -| tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:22:21:22:30 | secretText | sensitive data froman access to secretText | +| tst.js:11:17:11:26 | secretText | tst.js:3:18:3:24 | trusted | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data from an access to trusted | +| tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:11:17:11:26 | secretText | sensitive data from an access to secretText | +| tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | A broken or weak cryptographic algorithm depends on $@. | tst.js:17:17:17:25 | o.trusted | sensitive data from an access to trusted | +| tst.js:22:21:22:30 | secretText | tst.js:3:18:3:24 | trusted | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data from an access to trusted | +| tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:22:21:22:30 | secretText | sensitive data from an access to secretText | diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index d9ec2274496..80c3e1ddeb5 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.5 + +No user-facing changes. + ## 0.4.4 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/0.4.5.md b/misc/suite-helpers/change-notes/released/0.4.5.md new file mode 100644 index 00000000000..7ba9b2e8ade --- /dev/null +++ b/misc/suite-helpers/change-notes/released/0.4.5.md @@ -0,0 +1,3 @@ +## 0.4.5 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index e9b57993a01..466cd01cf4e 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.4 +lastReleaseVersion: 0.4.5 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index e6e1a928060..11aa41479a2 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,3 +1,3 @@ name: codeql/suite-helpers -version: 0.4.5-dev +version: 0.4.6-dev groups: shared diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index cd00bbba31a..de1895d3b6b 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,22 @@ +## 0.8.2 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. + ## 0.8.1 ### Major Analysis Improvements diff --git a/python/ql/lib/change-notes/2023-02-17-import-refined-variable.md b/python/ql/lib/change-notes/2023-02-17-import-refined-variable.md new file mode 100644 index 00000000000..e2dfcd8fd1a --- /dev/null +++ b/python/ql/lib/change-notes/2023-02-17-import-refined-variable.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed module resolution so we allow imports of definitions that have had an attribute assigned to it, such as `class Foo; Foo.bar = 42`. diff --git a/python/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/python/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/python/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/python/ql/lib/change-notes/2023-03-03-delete-deps.md b/python/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index 887db05e8c9..00000000000 --- a/python/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. \ No newline at end of file diff --git a/python/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/python/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/python/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/go/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/python/ql/lib/change-notes/released/0.8.2.md similarity index 53% rename from go/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md rename to python/ql/lib/change-notes/released/0.8.2.md index 89190af399f..6855fdaf72a 100644 --- a/go/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ b/python/ql/lib/change-notes/released/0.8.2.md @@ -1,9 +1,18 @@ ---- -category: majorAnalysis ---- +## 0.8.2 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + * The main data flow and taint tracking APIs have been changed. The old APIs remain in place for now and translate to the new through a backwards-compatible wrapper. If multiple configurations are in scope simultaneously, then this may affect results slightly. The new API is quite similar to the old, but makes use of a configuration module instead of a configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 2f693f95ba6..404110129dc 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.1 +lastReleaseVersion: 0.8.2 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 822ae117791..f40f7e10b4f 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 0.8.2-dev +version: 0.8.3-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python 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 617362ab4f0..865d7b4d6ce 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); 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 c47b0308855..39dbf8dc075 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index 7af9ca524aa..64ae4e50430 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -65,31 +65,75 @@ private import semmle.python.dataflow.new.internal.DataFlowPrivate */ module ImportResolution { /** - * Holds if the module `m` defines a name `name` by assigning `defn` to it. This is an - * overapproximation, as `name` may not in fact be exported (e.g. by defining an `__all__` that does - * not include `name`). + * Holds if there is an ESSA step from `defFrom` to `defTo`, which should be allowed + * for import resolution. + */ + private predicate allowedEssaImportStep(EssaDefinition defFrom, EssaDefinition defTo) { + // to handle definitions guarded by if-then-else + defFrom = defTo.(PhiFunction).getAnInput() + or + // refined variable + // example: https://github.com/nvbn/thefuck/blob/ceeaeab94b5df5a4fe9d94d61e4f6b0bbea96378/thefuck/utils.py#L25-L45 + defFrom = defTo.(EssaNodeRefinement).getInput().getDefinition() + } + + /** + * Holds if the module `m` defines a name `name` with the value `val`. The value + * represents the value `name` will have at the end of the module (the last place we + * have def-use flow to). + * + * Note: The handling of re-exporting imports is a bit simplistic. We assume that if + * an import is made, it will be re-exported (which will not be the case if a new + * value is assigned to the name, or it is deleted). */ pragma[nomagic] - predicate module_export(Module m, string name, DataFlow::CfgNode defn) { - exists(EssaVariable v, EssaDefinition essaDef | - v.getName() = name and - v.getAUse() = ImportStar::getStarImported*(m).getANormalExit() and - ( - essaDef = v.getDefinition() - or - // to handle definitions guarded by if-then-else - essaDef = v.getDefinition().(PhiFunction).getAnInput() - ) + predicate module_export(Module m, string name, DataFlow::Node val) { + // Definitions made inside `m` itself + // + // for code such as `foo = ...; foo.bar = ...` there will be TWO + // EssaDefinition/EssaVariable. One for `foo = ...` (AssignmentDefinition) and one + // for `foo.bar = ...`. The one for `foo.bar = ...` (EssaNodeRefinement). The + // EssaNodeRefinement is the one that will reach the end of the module (normal + // exit). + // + // However, we cannot just use the EssaNodeRefinement as the `val`, because the + // normal data-flow depends on use-use flow, and use-use flow targets CFG nodes not + // EssaNodes. So we need to go back from the EssaDefinition/EssaVariable that + // reaches the end of the module, to the first definition of the variable, and then + // track forwards using use-use flow to find a suitable CFG node that has flow into + // it from use-use flow. + exists(EssaVariable lastUseVar, EssaVariable firstDef | + lastUseVar.getName() = name and + // we ignore special variable $ introduced by our analysis (not used for anything) + // we ignore special variable * introduced by `from import *` -- TODO: understand why we even have this? + not name in ["$", "*"] and + lastUseVar.getAUse() = m.getANormalExit() and + allowedEssaImportStep*(firstDef, lastUseVar) and + not allowedEssaImportStep(_, firstDef) | - defn.getNode() = essaDef.(AssignmentDefinition).getValue() + not EssaFlow::defToFirstUse(firstDef, _) and + val.asVar() = firstDef or - defn.getNode() = essaDef.(ArgumentRefinement).getArgument() + exists(ControlFlowNode mid, ControlFlowNode end | + EssaFlow::defToFirstUse(firstDef, mid) and + EssaFlow::useToNextUse*(mid, end) and + not EssaFlow::useToNextUse(end, _) and + val.asCfgNode() = end + ) ) or + // re-exports from `from import *` + exists(Module importedFrom | + importedFrom = ImportStar::getStarImported(m) and + module_export(importedFrom, name, val) and + potential_module_export(importedFrom, name) + ) + or + // re-exports from `import ` or `from import ` exists(Alias a | - defn.asExpr() = [a.getValue(), a.getValue().(ImportMember).getModule()] and + val.asExpr() = a.getValue() and a.getAsname().(Name).getId() = name and - defn.getScope() = m + val.getScope() = m ) } @@ -263,9 +307,21 @@ module ImportResolution { module_reexport(reexporter, attr_name, m) ) or - // Submodules that are implicitly defined with relative imports of the form `from .foo import ...`. - // In practice, we create a definition for each module in a package, even if it is not imported. + // submodules of packages will be available as `.` after doing + // `import .` at least once in the program, or can be directly + // imported with `from import ` (even with an empty + // `.__init__` file). + // + // Until an import of `.` is executed, it is technically possible + // that `.` (or `from import `) can refer to an + // attribute set in `.__init__`. + // + // Therefore, if there is an attribute defined in `.__init__` with the same + // name as a submodule, we always consider that this attribute _could_ be a + // reference to the submodule, even if we don't know that the submodule has been + // imported yet. exists(string submodule, Module package | + submodule = result.asVar().getName() and SsaSource::init_module_submodule_defn(result.asVar().getSourceVariable(), package.getEntryNode()) and m = getModuleFromName(package.getPackageName() + "." + submodule) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index aa03127e160..3872807e4c5 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.5 + +### New Queries + +* Added a new query, `py/shell-command-constructed-from-input`, to detect libraries that unsafely construct shell commands from their inputs. + ## 0.6.4 No user-facing changes. diff --git a/python/ql/src/Security/CWE-327/FluentApiModel.qll b/python/ql/src/Security/CWE-327/FluentApiModel.qll index 3f479bc1627..6ba3231f49b 100644 --- a/python/ql/src/Security/CWE-327/FluentApiModel.qll +++ b/python/ql/src/Security/CWE-327/FluentApiModel.qll @@ -112,7 +112,7 @@ module InsecureContextConfiguration2 implements DataFlow::StateConfigSig { } } -private module InsecureContextFlow = DataFlow::MakeWithState; +private module InsecureContextFlow = DataFlow::GlobalWithState; /** * Holds if `conectionCreation` marks the creation of a connection based on the contex @@ -127,7 +127,7 @@ predicate unsafe_connection_creation_with_context( ) { // Connection created from a context allowing `insecure_version`. exists(InsecureContextFlow::PathNode src, InsecureContextFlow::PathNode sink | - InsecureContextFlow::hasFlowPath(src, sink) and + InsecureContextFlow::flowPath(src, sink) and src.getNode() = contextOrigin and sink.getNode() = connectionCreation and sink.getState().allowsInsecureVersion(insecure_version) and diff --git a/python/ql/src/change-notes/2023-02-03-unsafe-shell-command-construction.md b/python/ql/src/change-notes/released/0.6.5.md similarity index 84% rename from python/ql/src/change-notes/2023-02-03-unsafe-shell-command-construction.md rename to python/ql/src/change-notes/released/0.6.5.md index 0654a93582b..90a9171e732 100644 --- a/python/ql/src/change-notes/2023-02-03-unsafe-shell-command-construction.md +++ b/python/ql/src/change-notes/released/0.6.5.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- +## 0.6.5 + +### New Queries + * Added a new query, `py/shell-command-constructed-from-input`, to detect libraries that unsafely construct shell commands from their inputs. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index ced8cf94614..86780fb6148 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.4 +lastReleaseVersion: 0.6.5 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 29cb0d4698d..14d3672ce0b 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 0.6.5-dev +version: 0.6.6-dev groups: - python - queries diff --git a/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.qlref b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.qlref new file mode 100644 index 00000000000..58bedc4c88c --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.qlref @@ -0,0 +1 @@ +../coverage/argumentRoutingTest.ql diff --git a/python/ql/test/experimental/dataflow/coverage-py2/classes.py b/python/ql/test/experimental/dataflow/coverage-py2/classes.py new file mode 100644 index 00000000000..48dbaea8e93 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py2/classes.py @@ -0,0 +1,54 @@ +# Python 2 specific tests, like the one in coverage/classes.py +# +# User-defined methods, both instance methods and class methods, can be called in many non-standard ways +# i.e. differently from simply `c.f()` or `C.f()`. For example, a user-defined `__await__` method on a +# class `C` will be called by the syntactic construct `await c` when `c` is an instance of `C`. +# +# These tests should cover all the class calls that we hope to support. +# It is based on https://docs.python.org/3/reference/datamodel.html, and headings refer there. +# +# All functions starting with "test_" should run and execute `print("OK")` exactly once. +# This can be checked by running validTest.py. + +import sys +import os + +sys.path.append(os.path.dirname(os.path.dirname((__file__)))) +from testlib import expects + + +def SINK1(x): + pass + + +def SINK2(x): + pass + + +def SINK3(x): + pass + + +def SINK4(x): + pass + + +def OK(): + print("OK") + + +# 3.3.8. Emulating numeric types + +# object.__index__(self) +class With_index: + def __index__(self): + SINK1(self) + OK() # Call not found + return 0 + + +def test_index(): + import operator + + with_index = With_index() #$ MISSING: arg1="SSA variable with_index" func=With_index.__index__ + operator.index(with_index) diff --git a/python/ql/test/experimental/dataflow/coverage-py2/options b/python/ql/test/experimental/dataflow/coverage-py2/options new file mode 100644 index 00000000000..8dd8d25c998 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py2/options @@ -0,0 +1 @@ +semmle-extractor-options: --max-import-depth=1 --lang=2 diff --git a/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.qlref b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.qlref new file mode 100644 index 00000000000..58bedc4c88c --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.qlref @@ -0,0 +1 @@ +../coverage/argumentRoutingTest.ql diff --git a/python/ql/test/experimental/dataflow/coverage-py3/classes.py b/python/ql/test/experimental/dataflow/coverage-py3/classes.py new file mode 100644 index 00000000000..308c79acbb4 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py3/classes.py @@ -0,0 +1,72 @@ +# Python 3 specific tests, like the one in coverage/classes.py +# +# User-defined methods, both instance methods and class methods, can be called in many non-standard ways +# i.e. differently from simply `c.f()` or `C.f()`. For example, a user-defined `__await__` method on a +# class `C` will be called by the syntactic construct `await c` when `c` is an instance of `C`. +# +# These tests should cover all the class calls that we hope to support. +# It is based on https://docs.python.org/3/reference/datamodel.html, and headings refer there. +# +# All functions starting with "test_" should run and execute `print("OK")` exactly once. +# This can be checked by running validTest.py. + +import sys +import os + +sys.path.append(os.path.dirname(os.path.dirname((__file__)))) +from testlib import expects + + +def SINK1(x): + pass + + +def SINK2(x): + pass + + +def SINK3(x): + pass + + +def SINK4(x): + pass + + +def OK(): + print("OK") + + + +# 3.3.7. Emulating container types + +# object.__length_hint__(self) +class With_length_hint: + def __length_hint__(self): + SINK1(self) + OK() + return 0 + + +def test_length_hint(): + import operator + + with_length_hint = With_length_hint() #$ arg1="SSA variable with_length_hint" func=With_length_hint.__length_hint__ + operator.length_hint(with_length_hint) + + +# 3.3.8. Emulating numeric types + +# object.__index__(self) +class With_index: + def __index__(self): + SINK1(self) + OK() # Call not found + return 0 + + +def test_index(): + import operator + + with_index = With_index() #$ arg1="SSA variable with_index" func=With_index.__index__ + operator.index(with_index) diff --git a/python/ql/test/experimental/dataflow/coverage-py3/options b/python/ql/test/experimental/dataflow/coverage-py3/options new file mode 100644 index 00000000000..cfef58cf2b2 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py3/options @@ -0,0 +1 @@ +semmle-extractor-options: --max-import-depth=1 --lang=3 diff --git a/python/ql/test/experimental/dataflow/coverage/classes.py b/python/ql/test/experimental/dataflow/coverage/classes.py index d74a632b7c3..2569921d6c9 100644 --- a/python/ql/test/experimental/dataflow/coverage/classes.py +++ b/python/ql/test/experimental/dataflow/coverage/classes.py @@ -535,21 +535,6 @@ def test_len_if(): pass -# object.__length_hint__(self) -class With_length_hint: - def __length_hint__(self): - SINK1(self) - OK() # Call not found - return 0 - - -def test_length_hint(): - import operator - - with_length_hint = With_length_hint() #$ MISSING: arg1="SSA variable with_length_hint" func=With_length_hint.__length_hint__ - operator.length_hint(with_length_hint) - - # object.__getitem__(self, key) class With_getitem: def __getitem__(self, key): @@ -1378,13 +1363,6 @@ class With_index: return 0 -def test_index(): - import operator - - with_index = With_index() #$ MISSING: arg1="SSA variable with_index" func=With_index.__index__ - operator.index(with_index) - - def test_index_slicing(): with_index = With_index() #$ MISSING: arg1="SSA variable with_index" func=With_index.__index__ [0][with_index:1] diff --git a/python/ql/test/experimental/dataflow/validTest.py b/python/ql/test/experimental/dataflow/validTest.py index c2280521113..eeb6604ce7a 100644 --- a/python/ql/test/experimental/dataflow/validTest.py +++ b/python/ql/test/experimental/dataflow/validTest.py @@ -64,9 +64,12 @@ if __name__ == "__main__": check_tests_valid("coverage.test") check_tests_valid("coverage.argumentPassing") check_tests_valid("coverage.datamodel") + check_tests_valid("coverage-py2.classes") + check_tests_valid("coverage-py3.classes") check_tests_valid("variable-capture.in") check_tests_valid("variable-capture.nonlocal") check_tests_valid("variable-capture.dict") + check_tests_valid("variable-capture.collections") check_tests_valid("module-initialization.multiphase") check_tests_valid("fieldflow.test") check_tests_valid_after_version("match.test", (3, 10)) diff --git a/python/ql/test/experimental/dataflow/variable-capture/collections.py b/python/ql/test/experimental/dataflow/variable-capture/collections.py index 11504695ceb..0920c8d595a 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/collections.py +++ b/python/ql/test/experimental/dataflow/variable-capture/collections.py @@ -31,7 +31,7 @@ def SINK_F(x): print("OK") l = [NONSOURCE] -SINK_F(l_mod[0]) +SINK_F(l[0]) l_mod = [SOURCE for x in l] SINK(l_mod[0]) #$ captured diff --git a/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected b/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected index 820c89524bf..fa1789c0a86 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected +++ b/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected @@ -1,5 +1,10 @@ uniqueEnclosingCallable uniqueCallEnclosingCallable +| collections.py:39:17:39:38 | Lambda() | Call should have one enclosing callable but has 0. | +| collections.py:39:17:39:38 | Lambda() | Call should have one enclosing callable but has 0. | +| collections.py:45:19:45:24 | mod() | Call should have one enclosing callable but has 0. | +| collections.py:45:19:45:24 | mod() | Call should have one enclosing callable but has 0. | +| collections.py:52:13:52:24 | mod_local() | Call should have one enclosing callable but has 0. | uniqueType uniqueNodeLocation missingLocation diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected new file mode 100644 index 00000000000..b1f63a02a78 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -0,0 +1,160 @@ +| attr_clash.__init__ | __file__ | attr_clash/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| attr_clash.__init__ | __name__ | attr_clash/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| attr_clash.__init__ | __package__ | attr_clash/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:1:4:13 | GSSA Variable clashing_attr | +| attr_clash.__init__ | enter | attr_clash/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| attr_clash.__init__ | exit | attr_clash/__init__.py:6:1:6:4 | ControlFlowNode for exit | +| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:4:6:4:13 | ControlFlowNode for __file__ | +| attr_clash.clashing_attr | __name__ | attr_clash/clashing_attr.py:0:0:0:0 | GSSA Variable __name__ | +| attr_clash.clashing_attr | __package__ | attr_clash/clashing_attr.py:0:0:0:0 | GSSA Variable __package__ | +| attr_clash.clashing_attr | enter | attr_clash/clashing_attr.py:2:1:2:5 | ControlFlowNode for enter | +| attr_clash.clashing_attr | exit | attr_clash/clashing_attr.py:4:1:4:4 | ControlFlowNode for exit | +| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:4:6:4:13 | ControlFlowNode for __file__ | +| attr_clash.non_clashing_submodule | __name__ | attr_clash/non_clashing_submodule.py:0:0:0:0 | GSSA Variable __name__ | +| attr_clash.non_clashing_submodule | __package__ | attr_clash/non_clashing_submodule.py:0:0:0:0 | GSSA Variable __package__ | +| attr_clash.non_clashing_submodule | enter | attr_clash/non_clashing_submodule.py:2:1:2:5 | ControlFlowNode for enter | +| attr_clash.non_clashing_submodule | exit | attr_clash/non_clashing_submodule.py:4:1:4:4 | ControlFlowNode for exit | +| bar | __file__ | bar.py:6:6:6:13 | ControlFlowNode for __file__ | +| bar | __name__ | bar.py:0:0:0:0 | GSSA Variable __name__ | +| bar | __package__ | bar.py:0:0:0:0 | GSSA Variable __package__ | +| bar | bar_attr | bar.py:4:1:4:8 | GSSA Variable bar_attr | +| bar | enter | bar.py:2:1:2:5 | ControlFlowNode for enter | +| bar | exit | bar.py:6:1:6:4 | ControlFlowNode for exit | +| baz | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | +| baz | __name__ | baz.py:0:0:0:0 | GSSA Variable __name__ | +| baz | __package__ | baz.py:0:0:0:0 | GSSA Variable __package__ | +| baz | baz_attr | baz.py:4:1:4:8 | GSSA Variable baz_attr | +| baz | enter | baz.py:2:1:2:5 | ControlFlowNode for enter | +| baz | exit | baz.py:6:1:6:4 | ControlFlowNode for exit | +| block_flow_check | SOURCE | block_flow_check.py:12:25:12:30 | ControlFlowNode for SOURCE | +| block_flow_check | __file__ | block_flow_check.py:14:6:14:13 | ControlFlowNode for __file__ | +| block_flow_check | __name__ | block_flow_check.py:0:0:0:0 | GSSA Variable __name__ | +| block_flow_check | __package__ | block_flow_check.py:0:0:0:0 | GSSA Variable __package__ | +| block_flow_check | check | block_flow_check.py:12:1:12:5 | ControlFlowNode for check | +| block_flow_check | enter | block_flow_check.py:2:1:2:5 | ControlFlowNode for enter | +| block_flow_check | exit | block_flow_check.py:14:1:14:4 | ControlFlowNode for exit | +| block_flow_check | globals | block_flow_check.py:12:33:12:39 | ControlFlowNode for globals | +| block_flow_check | object | block_flow_check.py:4:14:4:19 | ControlFlowNode for object | +| block_flow_check | staticmethod | block_flow_check.py:0:0:0:0 | GSSA Variable staticmethod | +| foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | +| foo | __name__ | foo.py:0:0:0:0 | GSSA Variable __name__ | +| foo | __package__ | foo.py:0:0:0:0 | GSSA Variable __package__ | +| foo | __private_foo_attr | foo.py:8:1:8:18 | GSSA Variable __private_foo_attr | +| foo | bar_reexported | foo.py:11:8:11:10 | ControlFlowNode for ImportExpr | +| foo | bar_reexported | foo.py:12:34:12:47 | ControlFlowNode for bar_reexported | +| foo | check | foo.py:12:1:12:5 | ControlFlowNode for check | +| foo | enter | foo.py:2:1:2:5 | ControlFlowNode for enter | +| foo | exit | foo.py:14:1:14:4 | ControlFlowNode for exit | +| foo | foo_attr | foo.py:5:1:5:8 | GSSA Variable foo_attr | +| foo | globals | foo.py:12:71:12:77 | ControlFlowNode for globals | +| generous_export | Exception | generous_export.py:16:11:16:19 | ControlFlowNode for Exception | +| generous_export | SOURCE | generous_export.py:15:11:15:16 | ControlFlowNode for SOURCE | +| generous_export | SOURCE | generous_export.py:20:25:20:30 | ControlFlowNode for SOURCE | +| generous_export | __file__ | generous_export.py:22:6:22:13 | ControlFlowNode for __file__ | +| generous_export | __name__ | generous_export.py:0:0:0:0 | GSSA Variable __name__ | +| generous_export | __package__ | generous_export.py:0:0:0:0 | GSSA Variable __package__ | +| generous_export | check | generous_export.py:20:1:20:5 | ControlFlowNode for check | +| generous_export | enter | generous_export.py:2:1:2:5 | ControlFlowNode for enter | +| generous_export | eval | generous_export.py:10:4:10:7 | ControlFlowNode for eval | +| generous_export | exit | generous_export.py:22:1:22:4 | ControlFlowNode for exit | +| generous_export | globals | generous_export.py:20:33:20:39 | ControlFlowNode for globals | +| generous_export | object | generous_export.py:4:14:4:19 | ControlFlowNode for object | +| generous_export | print | generous_export.py:15:5:15:9 | ControlFlowNode for print | +| generous_export | staticmethod | generous_export.py:0:0:0:0 | GSSA Variable staticmethod | +| has_defined_all | __all__ | has_defined_all.py:7:1:7:7 | GSSA Variable __all__ | +| has_defined_all | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | +| has_defined_all | __name__ | has_defined_all.py:0:0:0:0 | GSSA Variable __name__ | +| has_defined_all | __package__ | has_defined_all.py:0:0:0:0 | GSSA Variable __package__ | +| has_defined_all | all_defined_bar | has_defined_all.py:5:1:5:15 | GSSA Variable all_defined_bar | +| has_defined_all | all_defined_foo | has_defined_all.py:4:1:4:15 | GSSA Variable all_defined_foo | +| has_defined_all | enter | has_defined_all.py:2:1:2:5 | ControlFlowNode for enter | +| has_defined_all | exit | has_defined_all.py:9:1:9:4 | ControlFlowNode for exit | +| has_defined_all_copy | __all__ | has_defined_all_copy.py:9:1:9:7 | GSSA Variable __all__ | +| has_defined_all_copy | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | +| has_defined_all_copy | __name__ | has_defined_all_copy.py:0:0:0:0 | GSSA Variable __name__ | +| has_defined_all_copy | __package__ | has_defined_all_copy.py:0:0:0:0 | GSSA Variable __package__ | +| has_defined_all_copy | all_defined_bar_copy | has_defined_all_copy.py:7:1:7:20 | GSSA Variable all_defined_bar_copy | +| has_defined_all_copy | all_defined_foo_copy | has_defined_all_copy.py:6:1:6:20 | GSSA Variable all_defined_foo_copy | +| has_defined_all_copy | enter | has_defined_all_copy.py:4:1:4:5 | ControlFlowNode for enter | +| has_defined_all_copy | exit | has_defined_all_copy.py:11:1:11:4 | ControlFlowNode for exit | +| has_defined_all_indirection | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | +| has_defined_all_indirection | __name__ | has_defined_all_indirection.py:0:0:0:0 | GSSA Variable __name__ | +| has_defined_all_indirection | __package__ | has_defined_all_indirection.py:0:0:0:0 | GSSA Variable __package__ | +| has_defined_all_indirection | all_defined_foo_copy | has_defined_all_copy.py:6:1:6:20 | GSSA Variable all_defined_foo_copy | +| has_defined_all_indirection | enter | has_defined_all_indirection.py:2:1:2:5 | ControlFlowNode for enter | +| has_defined_all_indirection | exit | has_defined_all_indirection.py:6:1:6:4 | ControlFlowNode for exit | +| if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | +| if_then_else | __name__ | if_then_else.py:0:0:0:0 | GSSA Variable __name__ | +| if_then_else | __package__ | if_then_else.py:0:0:0:0 | GSSA Variable __package__ | +| if_then_else | enter | if_then_else.py:2:1:2:5 | ControlFlowNode for enter | +| if_then_else | eval | if_then_else.py:11:8:11:11 | ControlFlowNode for eval | +| if_then_else | exit | if_then_else.py:16:1:16:4 | ControlFlowNode for exit | +| if_then_else | if_then_else_defined | if_then_else.py:7:5:7:24 | GSSA Variable if_then_else_defined | +| if_then_else | if_then_else_defined | if_then_else.py:12:9:12:28 | GSSA Variable if_then_else_defined | +| if_then_else | if_then_else_defined | if_then_else.py:14:9:14:28 | GSSA Variable if_then_else_defined | +| if_then_else_refined | SOURCE | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | SOURCE | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | +| if_then_else_refined | __name__ | if_then_else_refined.py:0:0:0:0 | GSSA Variable __name__ | +| if_then_else_refined | __package__ | if_then_else_refined.py:0:0:0:0 | GSSA Variable __package__ | +| if_then_else_refined | check | if_then_else_refined.py:17:1:17:5 | ControlFlowNode for check | +| if_then_else_refined | enter | if_then_else_refined.py:4:1:4:5 | ControlFlowNode for enter | +| if_then_else_refined | eval | if_then_else_refined.py:10:4:10:7 | ControlFlowNode for eval | +| if_then_else_refined | exit | if_then_else_refined.py:19:1:19:4 | ControlFlowNode for exit | +| if_then_else_refined | globals | if_then_else_refined.py:17:24:17:30 | ControlFlowNode for globals | +| if_then_else_refined | src | if_then_else_refined.py:17:19:17:21 | ControlFlowNode for src | +| package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | +| package.__init__ | __name__ | package/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| package.__init__ | __package__ | package/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| package.__init__ | attr_used_in_subpackage | package/__init__.py:4:1:4:23 | GSSA Variable attr_used_in_subpackage | +| package.__init__ | enter | package/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| package.__init__ | exit | package/__init__.py:7:1:7:4 | ControlFlowNode for exit | +| package.__init__ | package_attr | package/__init__.py:5:1:5:12 | GSSA Variable package_attr | +| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| package.subpackage2.__init__ | __name__ | package/subpackage2/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| package.subpackage2.__init__ | __package__ | package/subpackage2/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| package.subpackage2.__init__ | enter | package/subpackage2/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| package.subpackage2.__init__ | exit | package/subpackage2/__init__.py:6:1:6:4 | ControlFlowNode for exit | +| package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:1:4:16 | GSSA Variable subpackage2_attr | +| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:14:6:14:13 | ControlFlowNode for __file__ | +| package.subpackage.__init__ | __name__ | package/subpackage/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| package.subpackage.__init__ | __package__ | package/subpackage/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| package.subpackage.__init__ | check | package/subpackage/__init__.py:12:1:12:5 | ControlFlowNode for check | +| package.subpackage.__init__ | enter | package/subpackage/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| package.subpackage.__init__ | exit | package/subpackage/__init__.py:14:1:14:4 | ControlFlowNode for exit | +| package.subpackage.__init__ | globals | package/subpackage/__init__.py:12:79:12:85 | ControlFlowNode for globals | +| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:8:24:8:36 | ControlFlowNode for imported_attr | +| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | GSSA Variable irrelevant_attr | +| package.subpackage.__init__ | submodule | package/subpackage/__init__.py:12:35:12:43 | ControlFlowNode for submodule | +| package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:1:4:15 | GSSA Variable subpackage_attr | +| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:7:6:7:13 | ControlFlowNode for __file__ | +| package.subpackage.submodule | __name__ | package/subpackage/submodule.py:0:0:0:0 | GSSA Variable __name__ | +| package.subpackage.submodule | __package__ | package/subpackage/submodule.py:0:0:0:0 | GSSA Variable __package__ | +| package.subpackage.submodule | enter | package/subpackage/submodule.py:2:1:2:5 | ControlFlowNode for enter | +| package.subpackage.submodule | exit | package/subpackage/submodule.py:7:1:7:4 | ControlFlowNode for exit | +| package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:1:5:15 | GSSA Variable irrelevant_attr | +| package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:1:4:14 | GSSA Variable submodule_attr | +| refined | SOURCE | refined.py:12:25:12:30 | ControlFlowNode for SOURCE | +| refined | __file__ | refined.py:14:6:14:13 | ControlFlowNode for __file__ | +| refined | __name__ | refined.py:0:0:0:0 | GSSA Variable __name__ | +| refined | __package__ | refined.py:0:0:0:0 | GSSA Variable __package__ | +| refined | check | refined.py:12:1:12:5 | ControlFlowNode for check | +| refined | enter | refined.py:2:1:2:5 | ControlFlowNode for enter | +| refined | exit | refined.py:14:1:14:4 | ControlFlowNode for exit | +| refined | globals | refined.py:12:33:12:39 | ControlFlowNode for globals | +| refined | object | refined.py:4:14:4:19 | ControlFlowNode for object | +| simplistic_reexport | __file__ | simplistic_reexport.py:19:6:19:13 | ControlFlowNode for __file__ | +| simplistic_reexport | __name__ | simplistic_reexport.py:0:0:0:0 | GSSA Variable __name__ | +| simplistic_reexport | __package__ | simplistic_reexport.py:0:0:0:0 | GSSA Variable __package__ | +| simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember | +| simplistic_reexport | bar_attr | simplistic_reexport.py:10:19:10:26 | ControlFlowNode for bar_attr | +| simplistic_reexport | baz_attr | baz.py:4:1:4:8 | GSSA Variable baz_attr | +| simplistic_reexport | baz_attr | simplistic_reexport.py:17:19:17:26 | ControlFlowNode for baz_attr | +| simplistic_reexport | check | simplistic_reexport.py:17:1:17:5 | ControlFlowNode for check | +| simplistic_reexport | enter | baz.py:2:1:2:5 | ControlFlowNode for enter | +| simplistic_reexport | enter | simplistic_reexport.py:4:1:4:5 | ControlFlowNode for enter | +| simplistic_reexport | exit | baz.py:6:1:6:4 | ControlFlowNode for exit | +| simplistic_reexport | exit | simplistic_reexport.py:19:1:19:4 | ControlFlowNode for exit | +| simplistic_reexport | globals | simplistic_reexport.py:17:44:17:50 | ControlFlowNode for globals | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.ql b/python/ql/test/experimental/import-resolution/ModuleExport.ql new file mode 100644 index 00000000000..56db660b103 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/ModuleExport.ql @@ -0,0 +1,17 @@ +import python +import semmle.python.dataflow.new.DataFlow +import semmle.python.dataflow.new.internal.ImportResolution + +from Module m, string name, DataFlow::Node defn +where + ImportResolution::module_export(m, name, defn) and + exists(m.getLocation().getFile().getRelativePath()) and + not defn.getScope() = any(Module trace | trace.getName() = "trace") and + not m.getName() = "main" and + // Since we test on both Python 2 and Python 3, but `namespace_package` is not allowed + // on Python 2 because of the missing `__init__.py` files, we remove those results + // from Python 3 tests as well. One alternative is to only run these tests under + // Python 3, but that does not seems like a good solution -- we could easily miss a + // Python 2 only regression then :O + not m.getName() = "namespace_package.namespace_module" +select m.getName(), name, defn diff --git a/python/ql/test/experimental/import-resolution/baz.py b/python/ql/test/experimental/import-resolution/baz.py new file mode 100644 index 00000000000..66838a315be --- /dev/null +++ b/python/ql/test/experimental/import-resolution/baz.py @@ -0,0 +1,6 @@ +from trace import * +enter(__file__) + +baz_attr = "baz_attr" + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/block_flow_check.py b/python/ql/test/experimental/import-resolution/block_flow_check.py new file mode 100644 index 00000000000..cd939b037e6 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/block_flow_check.py @@ -0,0 +1,14 @@ +from trace import * +enter(__file__) + +class SOURCE(object): + @staticmethod + def block_flow(): pass + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +SOURCE.block_flow() + +check("SOURCE", SOURCE, SOURCE, globals()) + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/generous_export.py b/python/ql/test/experimental/import-resolution/generous_export.py new file mode 100644 index 00000000000..cbea96e19ce --- /dev/null +++ b/python/ql/test/experimental/import-resolution/generous_export.py @@ -0,0 +1,22 @@ +from trace import * +enter(__file__) + +class SOURCE(object): + @staticmethod + def block_flow(): pass + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +if eval("False"): + # With our current import resolution, this value for SOURCE will be considered to be + # a valid value at the end of this module, because it's the end of a use-use flow. + # This is clearly wrong, so our import resolution is a bit too generous on what is + # exported + print(SOURCE) + raise Exception() + +SOURCE.block_flow() + +check("SOURCE", SOURCE, SOURCE, globals()) + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/has_defined_all.py b/python/ql/test/experimental/import-resolution/has_defined_all.py new file mode 100644 index 00000000000..9716a9a2ee1 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/has_defined_all.py @@ -0,0 +1,9 @@ +from trace import * +enter(__file__) + +all_defined_foo = "all_defined_foo" +all_defined_bar = "all_defined_bar" + +__all__ = ["all_defined_foo"] + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/has_defined_all_copy.py b/python/ql/test/experimental/import-resolution/has_defined_all_copy.py new file mode 100644 index 00000000000..bfcb1eb5054 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/has_defined_all_copy.py @@ -0,0 +1,11 @@ +# a copy of `has_defined_all.py` that is imported by `has_defined_all_indirection.py` +# with its' own names such that we can check both `import *` without any cross-talk +from trace import * +enter(__file__) + +all_defined_foo_copy = "all_defined_foo_copy" +all_defined_bar_copy = "all_defined_bar_copy" + +__all__ = ["all_defined_foo_copy"] + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/has_defined_all_indirection.py b/python/ql/test/experimental/import-resolution/has_defined_all_indirection.py new file mode 100644 index 00000000000..c928205fdcb --- /dev/null +++ b/python/ql/test/experimental/import-resolution/has_defined_all_indirection.py @@ -0,0 +1,6 @@ +from trace import * +enter(__file__) + +from has_defined_all_copy import * + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/if_then_else_refined.py b/python/ql/test/experimental/import-resolution/if_then_else_refined.py new file mode 100644 index 00000000000..670c7f178e9 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/if_then_else_refined.py @@ -0,0 +1,19 @@ +# combination of refined and if_then_else + +from trace import * +enter(__file__) + +class SOURCE(): pass + +# definition based on "random" choice in this case it will always go the the if-branch, +# but our analysis is not able to figure this out +if eval("True"): + src = SOURCE +else: + src = SOURCE + +src.foo = 42 + +check("src", src, src, globals()) #$ prints=SOURCE + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/importflow.ql b/python/ql/test/experimental/import-resolution/importflow.ql index e6e51afa963..afb2278d1c5 100644 --- a/python/ql/test/experimental/import-resolution/importflow.ql +++ b/python/ql/test/experimental/import-resolution/importflow.ql @@ -11,6 +11,9 @@ private class SourceString extends DataFlow::Node { SourceString() { this.asExpr().(StrConst).getText() = contents and this.asExpr().getParent() instanceof Assign + or + this.asExpr().(ClassExpr).getInnerScope().getName() = "SOURCE" and + contents = "SOURCE" } string getContents() { result = contents } @@ -63,6 +66,10 @@ private class ImportConfiguration extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { sink = API::moduleImport("trace").getMember("check").getACall().getArg(1) } + + override predicate isBarrier(DataFlow::Node node) { + exists(DataFlow::MethodCallNode call | call.calls(node, "block_flow")) + } } class ResolutionTest extends InlineExpectationsTest { diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 840da95a03c..ce1bee040f4 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -84,6 +84,52 @@ from attr_clash import clashing_attr, non_clashing_submodule #$ imports=attr_cla check("clashing_attr", clashing_attr, "clashing_attr", globals()) #$ prints=clashing_attr SPURIOUS: prints="" check("non_clashing_submodule", non_clashing_submodule, "", globals()) #$ prints="" +import attr_clash.clashing_attr as _doesnt_matter #$ imports=attr_clash.clashing_attr as=_doesnt_matter +from attr_clash import clashing_attr, non_clashing_submodule #$ imports=attr_clash.clashing_attr as=clashing_attr imports=attr_clash.non_clashing_submodule as=non_clashing_submodule +check("clashing_attr", clashing_attr, "", globals()) #$ prints="" SPURIOUS: prints=clashing_attr + +# check that import * only imports the __all__ attributes +from has_defined_all import * +check("all_defined_foo", all_defined_foo, "all_defined_foo", globals()) #$ prints=all_defined_foo + +try: + check("all_defined_bar", all_defined_bar, "all_defined_bar", globals()) #$ SPURIOUS: prints=all_defined_bar + raise Exception("Did not get expected NameError") +except NameError as e: + if "all_defined_bar" in str(e): + print("Got expected NameError:", e) + else: + raise + +import has_defined_all # $ imports=has_defined_all as=has_defined_all +check("has_defined_all.all_defined_foo", has_defined_all.all_defined_foo, "all_defined_foo", globals()) #$ prints=all_defined_foo +check("has_defined_all.all_defined_bar", has_defined_all.all_defined_bar, "all_defined_bar", globals()) #$ prints=all_defined_bar + +# same check as above, but going through one level of indirection (which can make a difference) +from has_defined_all_indirection import * +check("all_defined_foo_copy", all_defined_foo_copy, "all_defined_foo_copy", globals()) #$ prints=all_defined_foo_copy + +try: + check("all_defined_bar_copy", all_defined_bar_copy, "all_defined_bar_copy", globals()) #$ SPURIOUS: prints=all_defined_bar_copy + raise Exception("Did not get expected NameError") +except NameError as e: + if "all_defined_bar_copy" in str(e): + print("Got expected NameError:", e) + else: + raise + +# same check as above, but going through one level of indirection (which can make a difference) +import has_defined_all_indirection # $ imports=has_defined_all_indirection as=has_defined_all_indirection +check("has_defined_all_indirection.all_defined_foo_copy", has_defined_all_indirection.all_defined_foo_copy, "all_defined_foo_copy", globals()) #$ prints=all_defined_foo_copy + +try: + check("has_defined_all_indirection.all_defined_bar_copy", has_defined_all_indirection.all_defined_bar_copy, "all_defined_bar_copy", globals()) + raise Exception("Did not get expected AttributeError") +except AttributeError as e: + if "all_defined_bar_copy" in str(e): + print("Got expected AttributeError:", e) + else: + raise # check that import * from an __init__ file works from package.subpackage2 import * @@ -93,6 +139,25 @@ check("subpackage2_attr", subpackage2_attr, "subpackage2_attr", globals()) #$ pr from if_then_else import if_then_else_defined check("if_then_else_defined", if_then_else_defined, "if_defined", globals()) #$ prints=if_defined prints=else_defined_1 prints=else_defined_2 +# check that refined definitions are handled correctly +import refined # $ imports=refined as=refined +check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ prints=SOURCE + +import if_then_else_refined # $ imports=if_then_else_refined as=if_then_else_refined +check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ prints=SOURCE + +import simplistic_reexport # $ imports=simplistic_reexport as=simplistic_reexport +check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=bar_attr +check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=baz_attr + +# check that we don't treat all assignments as being exports +import block_flow_check #$ imports=block_flow_check as=block_flow_check +check("block_flow_check.SOURCE", block_flow_check.SOURCE, block_flow_check.SOURCE, globals()) + +# show that import resolution is a bit too generous with definitions +import generous_export #$ imports=generous_export as=generous_export +check("generous_export.SOURCE", generous_export.SOURCE, generous_export.SOURCE, globals()) #$ SPURIOUS: prints=SOURCE + exit(__file__) print() diff --git a/python/ql/test/experimental/import-resolution/refined.py b/python/ql/test/experimental/import-resolution/refined.py new file mode 100644 index 00000000000..3694168c5df --- /dev/null +++ b/python/ql/test/experimental/import-resolution/refined.py @@ -0,0 +1,14 @@ +from trace import * +enter(__file__) + +class SOURCE(object): pass + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +SOURCE.foo = 42 +SOURCE.bar = 43 +SOURCE.baz = 44 + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/simplistic_reexport.py b/python/ql/test/experimental/import-resolution/simplistic_reexport.py new file mode 100644 index 00000000000..2847a8a66e0 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/simplistic_reexport.py @@ -0,0 +1,19 @@ +# we might consider anything imported to also be exported, but this is not the case + +from trace import * +enter(__file__) + +from bar import bar_attr +check("bar_attr", bar_attr, "bar_attr", globals()) #$ prints=bar_attr + +bar_attr = "overwritten" +check("bar_attr", bar_attr, "overwritten", globals()) #$ prints=overwritten + + +from baz import * +check("baz_attr", baz_attr, "baz_attr", globals()) #$ MISSING: prints=baz_attr + +baz_attr = "overwritten" +check("baz_attr", baz_attr, "overwritten", globals()) #$ prints=overwritten + +exit(__file__) diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected index d6bc954de82..a26a700542f 100644 --- a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected @@ -10,6 +10,12 @@ | InsecureProtocol.py:19:1:19:19 | ControlFlowNode for Attribute() | Insecure SSL/TLS protocol version SSLv2 specified by $@. | InsecureProtocol.py:19:1:19:19 | ControlFlowNode for Attribute() | call to SSL.Context | | InsecureProtocol.py:23:1:23:43 | ControlFlowNode for Attribute() | Insecure SSL/TLS protocol version SSLv2 specified by $@. | InsecureProtocol.py:23:1:23:43 | ControlFlowNode for Attribute() | call to ssl.wrap_socket | | InsecureProtocol.py:24:1:24:35 | ControlFlowNode for SSLContext() | Insecure SSL/TLS protocol version SSLv2 specified by $@. | InsecureProtocol.py:24:1:24:35 | ControlFlowNode for SSLContext() | call to SSLContext | +| import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_all_one_file.py:29:14:29:39 | ControlFlowNode for copy_also_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:12:30:12:61 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:17:14:17:34 | ControlFlowNode for also_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:10:25:10:56 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv2 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv3 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | | pyOpenSSL_fluent.py:18:27:18:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv2 allowed by $@. | pyOpenSSL_fluent.py:15:15:15:44 | ControlFlowNode for Attribute() | call to SSL.Context | diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_all_one_file.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_all_one_file.py new file mode 100644 index 00000000000..aab459ceeea --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_all_one_file.py @@ -0,0 +1,30 @@ +# use to compare alerts without import + +import ssl + +copy_secure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +copy_secure_context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 + +# this is just to allow us to see how un-altered exports work +copy_completely_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) + +# and an insecure export that is refined +copy_also_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +copy_also_insecure_context.options |= ssl.OP_NO_TLSv1 + + + +import socket +hostname = 'www.python.org' + +with socket.create_connection((hostname, 443)) as sock: + with copy_secure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with copy_completely_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with copy_also_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_def.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_def.py new file mode 100644 index 00000000000..d8e37542b94 --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_def.py @@ -0,0 +1,11 @@ +import ssl + +secure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +secure_context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 + +# this is just to allow us to see how un-altered exports work +completely_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) + +# and an insecure export that is refined +also_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +also_insecure_context.options |= ssl.OP_NO_TLSv1 diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_use.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_use.py new file mode 100644 index 00000000000..3c12fd81355 --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_use.py @@ -0,0 +1,18 @@ +# check that query works properly with imports + +import socket +from import_def import secure_context, completely_insecure_context, also_insecure_context + +hostname = 'www.python.org' + +with socket.create_connection((hostname, 443)) as sock: + with secure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with completely_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with also_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) diff --git a/ql/Cargo.lock b/ql/Cargo.lock index 08d54ab697a..f1428bd8bea 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 c7e1918975d..b12e6d9a9c6 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.1" +regex = "1.7.2" diff --git a/ql/extractor/Cargo.toml b/ql/extractor/Cargo.toml index 308953d1f8f..e7dc17f2feb 100644 --- a/ql/extractor/Cargo.toml +++ b/ql/extractor/Cargo.toml @@ -20,4 +20,4 @@ tracing = "0.1" tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } rayon = "1.7.0" num_cpus = "1.14.0" -regex = "1.7.1" +regex = "1.7.2" diff --git a/ql/ql/src/codeql_ql/StructuredLogs.qll b/ql/ql/src/codeql_ql/StructuredLogs.qll index f2e6939f7e6..60ea7e014ed 100644 --- a/ql/ql/src/codeql_ql/StructuredLogs.qll +++ b/ql/ql/src/codeql_ql/StructuredLogs.qll @@ -405,7 +405,7 @@ module KindPredicatesLog { or cand.(InLayer).getComputeRecursiveEvent() = recursive ) and - cand.hasLocationInfo(filepath, startline, _, _, _) + cand.getLocation().hasLocationInfo(filepath, startline, _, _, _) | cand order by filepath, startline ) diff --git a/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll b/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll index 1e7bfa71352..d15da37b4f2 100644 --- a/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll +++ b/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll @@ -1866,12 +1866,6 @@ module JSON { /** Gets the location of this element. */ final L::Location getLocation() { json_ast_node_info(this, _, _, result) } - predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - this.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - /** Gets the parent of this element. */ final AstNode getParent() { json_ast_node_info(this, result, _, _) } diff --git a/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql b/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql index 5009e9370fb..85a65fbfdeb 100644 --- a/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql +++ b/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql @@ -58,6 +58,7 @@ where or ModConsistency::noResolve(node) and msg = "ModConsistency::noResolve" ) and + none() and // disabled for now not node.getLocation() .getFile() .getAbsolutePath() diff --git a/ruby/doc/HOWTO.md b/ruby/doc/HOWTO.md index d2c4c316db5..ccfb8c9bc5e 100644 --- a/ruby/doc/HOWTO.md +++ b/ruby/doc/HOWTO.md @@ -7,7 +7,7 @@ This document contains information about common development tasks. [Install Rust](https://www.rust-lang.org/tools/install), then run: ```bash -cargo build --release +(cd extractor && cargo build --release) ``` ## Generating the database schema and QL library @@ -16,7 +16,7 @@ The generated `ql/lib/ruby.dbscheme` and `ql/lib/codeql/ruby/ast/internal/TreeSi ```bash # Run the generator -cargo run --release -p ruby-generator -- --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll +(cd extractor && cargo run --release --bin generator -- --dbscheme ../ql/lib/ruby.dbscheme --library ../ql/lib/codeql/ruby/ast/internal/TreeSitter.qll) # Then auto-format the QL library codeql query format -i ql/lib/codeql/ruby/ast/internal/TreeSitter.qll ``` diff --git a/ruby/extractor/rust-toolchain.toml b/ruby/extractor/rust-toolchain.toml index a4602066f4b..e56467f055c 100644 --- a/ruby/extractor/rust-toolchain.toml +++ b/ruby/extractor/rust-toolchain.toml @@ -2,6 +2,6 @@ # extractor. It is set to the lowest version of Rust we want to support. [toolchain] -channel = "1.54" +channel = "1.68" profile = "minimal" components = [ "rustfmt" ] diff --git a/ruby/extractor/src/bin/extractor.rs b/ruby/extractor/src/bin/extractor.rs index 300a94444a6..c79e3e1b51c 100644 --- a/ruby/extractor/src/bin/extractor.rs +++ b/ruby/extractor/src/bin/extractor.rs @@ -320,6 +320,8 @@ fn scan_erb( (result, line_breaks) } +/// Advance `index` to the next non-whitespace character. +/// Newlines are **not** considered whitespace. fn skip_space(content: &[u8], index: usize) -> usize { let mut index = index; while index < content.len() { diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 9613a598176..fd99d1504a2 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,29 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. +* The Active Record query methods `reorder` and `count_by_sql` are now recognized as SQL executions. +* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognized as SQL executions. +* Data flow through `ActionController::Parameters#require` is now tracked properly. +* The severity of parse errors was reduced to warning (previously error). +* Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. +* Deleted the deprecated `getWhenBranch` and `getAWhenBranch` predicates from the `CaseExpr` class. +* Deleted the deprecated `Self`, `PatternParameter`, `Pattern`, `VariablePattern`, `TuplePattern`, and `TuplePatternParameter` classes. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/ruby/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/ruby/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/ruby/ql/lib/change-notes/2023-03-03-delete-deps.md b/ruby/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index aab1e76bf70..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. -* Deleted the deprecated `getWhenBranch` and `getAWhenBranch` predicates from the `CaseExpr` class. -* Deleted the deprecated `Self`, `PatternParameter`, `Pattern`, `VariablePattern`, `TuplePattern`, and `TuplePatternParameter` classes. \ No newline at end of file diff --git a/ruby/ql/lib/change-notes/2023-03-09-parse-error.md b/ruby/ql/lib/change-notes/2023-03-09-parse-error.md deleted file mode 100644 index da07ab22b5f..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-09-parse-error.md +++ /dev/null @@ -1,4 +0,0 @@ ---- - category: minorAnalysis ---- -* The severity of parse errors was reduced to warning (previously error). diff --git a/ruby/ql/lib/change-notes/2023-03-13-initalize-flow.md b/ruby/ql/lib/change-notes/2023-03-13-initalize-flow.md deleted file mode 100644 index bc366496e6f..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-13-initalize-flow.md +++ /dev/null @@ -1,4 +0,0 @@ ---- - category: minorAnalysis ---- -* Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. diff --git a/ruby/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/ruby/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/ruby/ql/lib/change-notes/2023-03-13-rails-sinks.md b/ruby/ql/lib/change-notes/2023-03-13-rails-sinks.md deleted file mode 100644 index 6827b2755ed..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-13-rails-sinks.md +++ /dev/null @@ -1,6 +0,0 @@ ---- - category: minorAnalysis ---- -* The Active Record query methods `reorder` and `count_by_sql` are now recognised as SQL executions. -* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognised as SQL executions. -* Data flow through `ActionController::Parameters#require` is now tracked properly. \ No newline at end of file diff --git a/ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/ruby/ql/lib/change-notes/released/0.5.5.md b/ruby/ql/lib/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..a6c6618886d --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.5.5.md @@ -0,0 +1,25 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. +* The Active Record query methods `reorder` and `count_by_sql` are now recognized as SQL executions. +* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognized as SQL executions. +* Data flow through `ActionController::Parameters#require` is now tracked properly. +* The severity of parse errors was reduced to warning (previously error). +* Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. +* Deleted the deprecated `getWhenBranch` and `getAWhenBranch` predicates from the `CaseExpr` class. +* Deleted the deprecated `Self`, `PatternParameter`, `Pattern`, `VariablePattern`, `TuplePattern`, and `TuplePatternParameter` classes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll index 241b2bb763a..97bb3407b57 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll @@ -216,9 +216,9 @@ module Ssa { ) } - final override string toString() { result = Definition.super.toString() } + final override string toString() { result = write.toString() } - final override Location getLocation() { result = this.getControlFlowNode().getLocation() } + final override Location getLocation() { result = write.getLocation() } } /** diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll index 617362ab4f0..865d7b4d6ce 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll index c47b0308855..39dbf8dc075 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 82a5271e9b9..cd84298c41a 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -1,3 +1,4 @@ +private import codeql.util.Boolean private import codeql.ruby.AST private import codeql.ruby.ast.internal.Synthesis private import codeql.ruby.CFG @@ -456,12 +457,15 @@ private module Cached { FlowSummaryImplSpecific::ParsePositions::isParsedElementLowerBoundPosition(_, includeUnknown, lower) } or + TElementContentOfTypeContent(string type, Boolean includeUnknown) { + type = any(Content::KnownElementContent content).getIndex().getValueType() + } or TNoContentSet() // Only used by type-tracking cached class TContentSet = TSingletonContent or TAnyElementContent or TKnownOrUnknownElementContent or - TElementLowerBoundContent; + TElementLowerBoundContent or TElementContentOfTypeContent; private predicate trackKnownValue(ConstantValue cv) { not cv.isFloat(_) and @@ -524,10 +528,7 @@ import Cached /** Holds if `n` should be hidden from path explanations. */ predicate nodeIsHidden(Node n) { exists(SsaImpl::DefinitionExt def | def = n.(SsaDefinitionExtNode).getDefinitionExt() | - def instanceof Ssa::PhiNode or - def instanceof SsaImpl::PhiReadNode or - def instanceof Ssa::CapturedEntryDefinition or - def instanceof Ssa::CapturedCallDefinition + not def instanceof Ssa::WriteDefinition ) or n = LocalFlow::getParameterDefNode(_) @@ -1329,7 +1330,15 @@ private module PostUpdateNodes { private import PostUpdateNodes /** A node that performs a type cast. */ -class CastNode extends Node instanceof ReturningNode { } +class CastNode extends Node { + CastNode() { + // ensure that actual return nodes are included in the path graph + this instanceof ReturningNode + or + // ensure that all variable assignments are included in the path graph + this.(SsaDefinitionExtNode).getDefinitionExt() instanceof Ssa::WriteDefinition + } +} class DataFlowExpr = CfgNodes::ExprCfgNode; diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll index 4ea02818c92..418e3f621d2 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll @@ -534,6 +534,21 @@ class ContentSet extends TContentSet { this = TElementLowerBoundContent(lower, true) } + /** + * Holds if this content set represents all `KnownElementContent`s where + * the index is of type `type`, as per `ConstantValue::getValueType/0`. + */ + predicate isElementOfType(string type) { this = TElementContentOfTypeContent(type, false) } + + /** + * Holds if this content set represents `UnknownElementContent` unioned with + * all `KnownElementContent`s where the index is of type `type`, as per + * `ConstantValue::getValueType/0`. + */ + predicate isElementOfTypeOrUnknown(string type) { + this = TElementContentOfTypeContent(type, true) + } + /** Gets a textual representation of this content set. */ string toString() { exists(Content c | @@ -558,6 +573,16 @@ class ContentSet extends TContentSet { includeUnknown = true and result = lower + ".." ) + or + exists(string type, boolean includeUnknown | + this = TElementContentOfTypeContent(type, includeUnknown) + | + includeUnknown = false and + result = "any(" + type + ")!" + or + includeUnknown = true and + result = "any(" + type + ")" + ) } /** Gets a content that may be stored into when storing into this set. */ @@ -576,7 +601,14 @@ class ContentSet extends TContentSet { // step that store only into `1` this.isKnownOrUnknownElement(result) or - this.isElementLowerBound(_) and + // These reverse stores are not as accurate as they could be, but making + // them more accurate would result in a large fan-out + ( + this.isElementLowerBound(_) or + this.isElementLowerBoundOrUnknown(_) or + this.isElementOfType(_) or + this.isElementOfTypeOrUnknown(_) + ) and result = TUnknownElementContent() } @@ -603,6 +635,15 @@ class ContentSet extends TContentSet { includeUnknown = true and result = TUnknownElementContent() ) + or + exists(string type, boolean includeUnknown | + this = TElementContentOfTypeContent(type, includeUnknown) + | + type = result.(Content::KnownElementContent).getIndex().getValueType() + or + includeUnknown = true and + result = TUnknownElementContent() + ) } } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} diff --git a/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll b/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll index abec1880e65..f08529988c7 100644 --- a/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll @@ -56,7 +56,7 @@ module StoredXss { } } - import TaintTracking::Make + import TaintTracking::Global } /** DEPRECATED: Alias for StoredXss */ diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll index e0d9508c4a8..c5b5c5489a2 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll @@ -34,8 +34,6 @@ class Configuration extends TaintTracking::Configuration { override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet set) { // allow implicit reads of array elements this.isSink(node) and - set.isKnownOrUnknownElement(any(DataFlow::Content::KnownElementContent content | - content.getIndex().getValueType() = "int" - )) + set.isElementOfTypeOrUnknown("int") } } diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll index 49f03f18144..35ff4ffea97 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll @@ -36,8 +36,6 @@ class Configuration extends TaintTracking::Configuration { override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet set) { // allow implicit reads of array elements this.isSink(node) and - set.isKnownOrUnknownElement(any(DataFlow::Content::KnownElementContent content | - content.getIndex().getValueType() = "int" - )) + set.isElementOfTypeOrUnknown("int") } } diff --git a/ruby/ql/lib/codeql/ruby/security/XSS.qll b/ruby/ql/lib/codeql/ruby/security/XSS.qll index dbed650250e..d4b99766a58 100644 --- a/ruby/ql/lib/codeql/ruby/security/XSS.qll +++ b/ruby/ql/lib/codeql/ruby/security/XSS.qll @@ -304,7 +304,7 @@ private module OrmTracking { } } - import DataFlow::Make + import DataFlow::Global } /** Provides default sources, sinks and sanitizers for detecting stored cross-site scripting (XSS) vulnerabilities. */ @@ -336,7 +336,7 @@ module StoredXss { private class OrmFieldAsSource extends Source instanceof DataFlow::CallNode { OrmFieldAsSource() { exists(DataFlow::CallNode subSrc | - OrmTracking::hasFlow(subSrc, this.getReceiver()) and + OrmTracking::flow(subSrc, this.getReceiver()) and subSrc.(OrmInstantiation).methodCallMayAccessField(this.getMethodName()) ) } diff --git a/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll b/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll index cc11b6b2a87..69ac88c777e 100644 --- a/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll +++ b/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll @@ -449,6 +449,8 @@ private ContentFilter getFilterFromWithoutContentStep(DataFlow::ContentSet conte or content.isElementLowerBoundOrUnknown(_) or + content.isElementOfTypeOrUnknown(_) + or content.isSingleton(any(DataFlow::Content::UnknownElementContent c)) ) and result = MkElementFilter() @@ -484,6 +486,10 @@ private ContentFilter getFilterFromWithContentStep(DataFlow::ContentSet content) or content.isElementLowerBoundOrUnknown(_) or + content.isElementOfType(_) + or + content.isElementOfTypeOrUnknown(_) + or content.isSingleton(any(DataFlow::Content::ElementContent c)) ) and result = MkElementFilter() diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 767902b86d9..0cbb3cc99da 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 0.5.5-dev +version: 0.5.6-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 03759edabe6..39ca0718982 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.5.5 + +### New Queries + +* Added a new query, `rb/zip-slip`, to detect arbitrary file writes during extraction of zip/tar archives. + ## 0.5.4 No user-facing changes. diff --git a/ruby/ql/src/change-notes/2023-02-17-zip-slip-query.md b/ruby/ql/src/change-notes/2023-02-17-zip-slip-query.md deleted file mode 100644 index ebf17acb7be..00000000000 --- a/ruby/ql/src/change-notes/2023-02-17-zip-slip-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* Added a new query, `rb/zip-slip`, to detect arbitrary file writes during extraction of zip/tar archives. \ No newline at end of file diff --git a/ruby/ql/src/change-notes/released/0.5.5.md b/ruby/ql/src/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..20cdffb6307 --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.5.5.md @@ -0,0 +1,5 @@ +## 0.5.5 + +### New Queries + +* Added a new query, `rb/zip-slip`, to detect arbitrary file writes during extraction of zip/tar archives. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index ca67c75eca6..58e6d53f3bc 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 0.5.5-dev +version: 0.5.6-dev groups: - ruby - queries diff --git a/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql b/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql index 1dc855230a1..da1bd427589 100644 --- a/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql +++ b/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql @@ -17,6 +17,6 @@ import codeql.ruby.security.StoredXSSQuery import StoredXss::PathGraph from StoredXss::PathNode source, StoredXss::PathNode sink -where StoredXss::hasFlowPath(source, sink) +where StoredXss::flowPath(source, sink) select sink.getNode(), source, sink, "Stored cross-site scripting vulnerability due to $@.", source.getNode(), "stored value" 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 399a65de525..2e813207b6a 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,103 +1,135 @@ failures edges -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:5:10:5:10 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [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: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:13:9:21 | call to source : | array_flow.rb:11:10:11:10 | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:11:10:11:10 | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13:10 | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13: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: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:9:17:33 | call to new [element] : | array_flow.rb:18:10:18:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:18:10:18:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:19:10:19:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:19:10:19:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:21:19:21:19 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:21:19:21:19 | 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: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:9:21:20 | call to new [element] : | array_flow.rb:22:10:22:10 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:22:10:22:10 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:23:10:23:10 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:23:10:23: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: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:9:27:7 | call to new [element] : | array_flow.rb:28:10:28:10 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:28:10:28:10 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:29:10:29:10 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:29:10:29: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: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:10:33:18 | call to source : | array_flow.rb:34:27:34:27 | a [element 0] : | -| array_flow.rb:33:10:33:18 | call to source : | 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:34:9:34:28 | call to try_convert [element 0] : | array_flow.rb:35:10:35:10 | b [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: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:10:40:20 | call to source : | array_flow.rb:42:9:42:9 | a [element 0] : | -| array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:42:9:42:9 | a [element 0] : | -| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:42:13:42:13 | b [element 2] : | -| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:42:13:42:13 | b [element 2] : | +| 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:43:10:43:10 | c [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:43:10:43:10 | c [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:44:10:44:10 | c [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:44:10:44:10 | c [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:10:48:18 | call to source : | array_flow.rb:49:9:49:9 | a [element 0] : | -| array_flow.rb:48:10:48:18 | call to source : | 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: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:50:10:50:10 | b [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:50:10:50:10 | b [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:51:10:51:10 | b [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:51:10:51:10 | b [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:10:55:20 | call to source : | array_flow.rb:57:9:57:9 | a [element 0] : | -| array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:57:9:57:9 | a [element 0] : | -| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:57:13:57:13 | b [element 1] : | -| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:57:13:57:13 | b [element 1] : | +| 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:58:10:58:10 | c [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | array_flow.rb:58:10:58:10 | c [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:58:10:58:10 | c [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:58:10:58:10 | c [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:59:10:59:10 | c [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:59:10:59:10 | c [element] : | +| 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 | ...[...] | @@ -106,40 +138,51 @@ edges | 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:10:63:20 | call to source : | array_flow.rb:65:9:65:9 | a [element 0] : | -| array_flow.rb:63:10:63:20 | call to source : | 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: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:66:10:66:10 | c [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:66:10:66:10 | c [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:67:10:67:10 | c [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:67:10:67:10 | c [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:10:71:20 | call to source : | array_flow.rb:72:9:72:9 | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:72:9:72:9 | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:10 | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:10 | 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: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:75:10:75:10 | b [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | array_flow.rb:75:10:75:10 | b [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:75:10:75:10 | b [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:75:10:75:10 | b [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:76:10:76:10 | b [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:76:10:76:10 | b [element] : | +| 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:72:14:72:24 | call to source : | array_flow.rb:75:10:75:10 | b : | -| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:76:10:76:10 | b : | | 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 | ...[...] | @@ -154,70 +197,96 @@ edges | 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:13:80:21 | call to source : | array_flow.rb:81:15:81:15 | a [element 1] : | -| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:81:15:81:15 | a [element 1] : | -| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:83:10:83:10 | c | -| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:83:10:83:10 | c | -| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:89:9:89:9 | a [element 1] : | -| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:89:9:89:9 | 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: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__0 [element 1] : | array_flow.rb:81:8:81:8 | c : | +| array_flow.rb:81:15:81:15 | __synth__0 [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__0 [element 1] : | +| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__0 [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:91:10:91:10 | b [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:91:10:91:10 | b [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:92:10:92:10 | b [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:92:10:92:10 | 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: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:13:96:22 | call to source : | array_flow.rb:97:9:97:9 | a [element 1] : | -| array_flow.rb:96:13:96:22 | call to source : | 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: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:99:10:99:10 | b [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:99:10:99:10 | b [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:101:10:101:10 | b [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:101:10:101:10 | 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: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:13:103:24 | call to source : | array_flow.rb:104:9:104:9 | a [element 1] : | -| array_flow.rb:103:13:103:24 | call to source : | 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: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:106:10:106:10 | b [element 1] : | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | array_flow.rb:106:10:106:10 | 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: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:13:109:24 | call to source : | array_flow.rb:110:9:110:9 | a [element 1] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:110:9:110:9 | a [element 1] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:114:9:114:9 | a [element 1] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:114:9:114:9 | a [element 1] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:110:9:110:9 | a [element 3] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:110:9:110:9 | a [element 3] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:114:9:114:9 | a [element 3] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:114:9:114:9 | a [element 3] : | +| 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:111:10:111:10 | b [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:111:10:111:10 | b [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:112:10:112:10 | b [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:112:10:112:10 | b [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:115:10:115:10 | b [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:115:10:115:10 | b [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:116:10:116:10 | b [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:116:10:116:10 | b [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 | ...[...] | @@ -278,34 +347,44 @@ edges | 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:16:152:25 | call to source : | array_flow.rb:153:5:153:5 | a [element 2] : | -| array_flow.rb:152:16:152:25 | call to source : | 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: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:16:159:25 | call to source : | array_flow.rb:160:5:160:5 | a [element 2] : | -| array_flow.rb:159:16:159:25 | call to source : | 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: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:10:166:21 | call to source : | array_flow.rb:167:9:167:9 | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:167:9:167:9 | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:10 | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:10 | 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: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:170:10:170:10 | b [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element 0] : | array_flow.rb:170:10:170:10 | b [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:170:10:170:10 | b [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:170:10:170:10 | b [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:171:10:171:10 | b [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:171:10:171:10 | b [element] : | +| 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] : | @@ -326,12 +405,16 @@ edges | 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:15:177:24 | call to source : | array_flow.rb:178:16:178:16 | c [element 1] : | -| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:178:16:178:16 | c [element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [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:180:11:180:11 | d [element 2, 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: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 | ...[...] : | @@ -344,40 +427,54 @@ edges | 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:13:184:22 | call to source : | array_flow.rb:186:10:186:10 | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:186:10:186:10 | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188:10 | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188: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: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:16:192:25 | call to source : | array_flow.rb:193:9:193:9 | a [element 2] : | -| array_flow.rb:192:16:192:25 | call to source : | 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: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:196:10:196:10 | b | -| array_flow.rb:193:9:195:7 | call to bsearch : | array_flow.rb:196:10:196:10 | b | +| 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:16:200:25 | call to source : | array_flow.rb:201:9:201:9 | a [element 2] : | -| array_flow.rb:200:16:200:25 | call to source : | 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: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:16:208:25 | call to source : | array_flow.rb:209:5:209:5 | a [element 2] : | -| array_flow.rb:208:16:208:25 | call to source : | 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: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:16:215:27 | call to source : | array_flow.rb:216:9:216:9 | a [element 2] : | -| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:216:9:216:9 | a [element 2] : | -| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:216:9:216:9 | a [element 3] : | -| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:216:9:216:9 | a [element 3] : | +| 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 : | @@ -390,26 +487,34 @@ edges | 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:16:231:27 | call to source : | array_flow.rb:232:9:232:9 | a [element 2] : | -| array_flow.rb:231:16:231:27 | call to source : | 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: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:236:10:236:10 | b [element] : | -| array_flow.rb:232:9:235:7 | call to collect [element] : | array_flow.rb:236:10:236:10 | 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: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:16:240:27 | call to source : | array_flow.rb:241:9:241:9 | a [element 2] : | -| array_flow.rb:240:16:240:27 | call to source : | 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: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:246:10:246:10 | b [element] : | -| array_flow.rb:241:9:244:7 | call to collect! [element] : | array_flow.rb:246:10:246:10 | 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: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] : | @@ -420,72 +525,94 @@ edges | 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:16:250:27 | call to source : | array_flow.rb:251:9:251:9 | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:251:9:251:9 | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:256:9:256:9 | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:256:9:256: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: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:255:10:255:10 | b [element] : | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | array_flow.rb:255:10:255:10 | 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: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:260:10:260:10 | b [element] : | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | array_flow.rb:260:10:260:10 | 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: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:16:264:25 | call to source : | array_flow.rb:265:9:265:9 | a [element 2] : | -| array_flow.rb:264:16:264:25 | call to source : | 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: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:269:10:269:10 | b [element 2] : | -| array_flow.rb:265:9:267:7 | call to combination [element 2] : | array_flow.rb:269:10:269:10 | 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: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:16:273:25 | call to source : | array_flow.rb:274:9:274:9 | a [element 2] : | -| array_flow.rb:273:16:273:25 | call to source : | 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: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:275:10:275:10 | b [element] : | -| array_flow.rb:274:9:274:17 | call to compact [element] : | array_flow.rb:275:10:275:10 | 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: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:16:279:25 | call to source : | array_flow.rb:280:9:280:9 | a [element 2] : | -| array_flow.rb:279:16:279:25 | call to source : | 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: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:282:10:282:10 | b [element] : | -| array_flow.rb:280:9:280:18 | call to compact! [element] : | array_flow.rb:282:10:282:10 | 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: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:16:286:27 | call to source : | array_flow.rb:290:10:290:10 | a [element 2] : | -| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:290:10:290:10 | a [element 2] : | -| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:288:14:288:14 | b [element 2] : | -| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:288:14:288:14 | b [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: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] : | @@ -498,52 +625,76 @@ edges | 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:16:294:25 | call to source : | array_flow.rb:295:5:295:5 | a [element 2] : | -| array_flow.rb:294:16:294:25 | call to source : | 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: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:16:301:25 | call to source : | array_flow.rb:302:5:302:5 | a [element 2] : | -| array_flow.rb:301:16:301:25 | call to source : | 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: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:16:308:25 | call to source : | array_flow.rb:309:9:309:9 | a [element 2] : | -| array_flow.rb:308:16:308:25 | call to source : | 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: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:312:10:312:10 | b [element 2] : | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | array_flow.rb:312:10:312:10 | 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: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:16:316:27 | call to source : | array_flow.rb:317:9:317:9 | a [element 2] : | -| array_flow.rb:316:16:316:27 | call to source : | 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: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:318:10:318:10 | b | -| array_flow.rb:317:9:317:36 | call to delete : | array_flow.rb:318:10:318:10 | b | +| 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:16:325:27 | call to source : | array_flow.rb:326:9:326:9 | a [element 2] : | -| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:326:9:326:9 | a [element 2] : | -| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:326:9:326:9 | a [element 3] : | -| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:326:9:326:9 | a [element 3] : | +| 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:327:10:327:10 | b | -| array_flow.rb:326:9:326:22 | call to delete_at : | array_flow.rb:327:10:327:10 | b | +| 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:16:330:27 | call to source : | array_flow.rb:331:9:331:9 | a [element 2] : | -| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:331:9:331:9 | a [element 2] : | -| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:331:9:331:9 | a [element 3] : | -| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:331:9:331:9 | a [element 3] : | +| 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] : | @@ -556,14 +707,18 @@ edges | 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:332:10:332:10 | b | -| array_flow.rb:331:9:331:22 | call to delete_at : | array_flow.rb:332:10:332:10 | b | +| 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:16:338:25 | call to source : | array_flow.rb:339:9:339:9 | a [element 2] : | -| array_flow.rb:338:16:338:25 | call to source : | 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: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] : | @@ -576,8 +731,8 @@ edges | 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:342:10:342:10 | b [element] : | -| array_flow.rb:339:9:341:7 | call to delete_if [element] : | array_flow.rb:342:10:342:10 | 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: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 | ...[...] | @@ -588,66 +743,88 @@ edges | 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:16:349:25 | call to source : | array_flow.rb:350:9:350:9 | a [element 2] : | -| array_flow.rb:349:16:349:25 | call to source : | 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: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:351:10:351:10 | b [element] : | -| array_flow.rb:350:9:350:25 | call to difference [element] : | array_flow.rb:351:10:351:10 | 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: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:16:355:27 | call to source : | array_flow.rb:357:10:357:10 | a [element 2] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:357:10:357:10 | a [element 2] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:10 | a [element 2] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:10 | a [element 2] : | -| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | -| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | +| 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:16:364:27 | call to source : | array_flow.rb:365:9:365:9 | a [element 2] : | -| array_flow.rb:364:16:364:27 | call to source : | 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: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:368:10:368:10 | b | -| array_flow.rb:365:9:367:7 | call to detect : | array_flow.rb:368:10:368:10 | b | +| 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:16:372:27 | call to source : | array_flow.rb:373:9:373:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:373:9:373:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:375:9:375:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:375:9:375:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:380:9:380:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:380:9:380:9 | a [element 2] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:373:9:373:9 | a [element 3] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:373:9:373:9 | a [element 3] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:375:9:375:9 | a [element 3] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:375:9:375:9 | a [element 3] : | +| 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:374:10:374:10 | b [element] : | -| array_flow.rb:373:9:373:17 | call to drop [element] : | array_flow.rb:374:10:374:10 | 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: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:377:10:377:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:377:10:377:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:378:10:378:10 | b [element 2] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:378:10:378:10 | b [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 | ...[...] | @@ -658,30 +835,42 @@ edges | 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:381:10:381:10 | b [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element 1] : | array_flow.rb:381:10:381:10 | b [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:381:10:381:10 | b [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:381:10:381:10 | b [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:382:9:382:9 | b [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:382:9:382:9 | b [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:383:10:383:10 | c [element] : | -| array_flow.rb:382:9:382:19 | call to drop [element] : | array_flow.rb:383:10:383:10 | 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: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:16:387:27 | call to source : | array_flow.rb:388:9:388:9 | a [element 2] : | -| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:388:9:388:9 | a [element 2] : | -| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:388:9:388:9 | a [element 3] : | -| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:388:9:388:9 | a [element 3] : | +| 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 : | @@ -690,40 +879,50 @@ edges | 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:391:10:391:10 | b [element] : | -| array_flow.rb:388:9:390:7 | call to drop_while [element] : | array_flow.rb:391:10:391:10 | 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: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:16:395:25 | call to source : | array_flow.rb:396:9:396:9 | a [element 2] : | -| array_flow.rb:395:16:395:25 | call to source : | 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: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:399:10:399:10 | b [element 2] : | -| array_flow.rb:396:9:398:7 | call to each [element 2] : | array_flow.rb:399:10:399:10 | 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: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:16:403:25 | call to source : | array_flow.rb:404:18:404:18 | a [element 2] : | -| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:404:18:404:18 | a [element 2] : | -| array_flow.rb:404:9:406:7 | ... = ... : | array_flow.rb:407:10:407:10 | x | -| array_flow.rb:404:9:406:7 | ... = ... : | array_flow.rb:407:10:407:10 | x | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:9:406:7 | ... = ... : | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:9:406:7 | ... = ... : | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:405:14:405:14 | x | -| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:405:14:405:14 | x | +| 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:404:18:404:18 | a [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | -| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | | 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:16:412:25 | call to source : | array_flow.rb:413:5:413:5 | a [element 2] : | -| array_flow.rb:412:16:412:25 | call to source : | 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: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] : | @@ -732,52 +931,70 @@ edges | 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:16:419:25 | call to source : | array_flow.rb:420:9:420:9 | a [element 2] : | -| array_flow.rb:419:16:419:25 | call to source : | 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: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:423:10:423:10 | b [element 2] : | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | array_flow.rb:423:10:423:10 | 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: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:16:427:25 | call to source : | array_flow.rb:428:9:428:9 | a [element 2] : | -| array_flow.rb:427:16:427:25 | call to source : | 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: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:431:10:431:10 | b [element 2] : | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | array_flow.rb:431:10:431:10 | 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: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:19:435:28 | call to source : | array_flow.rb:436:5:436:5 | a [element 3] : | -| array_flow.rb:435:19:435:28 | call to source : | 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: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:19:442:28 | call to source : | array_flow.rb:443:9:443:9 | a [element 3] : | -| array_flow.rb:442:19:442:28 | call to source : | 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: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:447:10:447:10 | b [element 3] : | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | array_flow.rb:447:10:447:10 | 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: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:19:451:30 | call to source : | array_flow.rb:452:9:452:9 | a [element 3] : | -| array_flow.rb:451:19:451:30 | call to source : | 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: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:456:10:456:10 | b | -| array_flow.rb:452:9:455:7 | call to each_with_object : | array_flow.rb:456:10:456:10 | 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: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 : | @@ -786,60 +1003,80 @@ edges | 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:19:460:28 | call to source : | array_flow.rb:461:9:461:9 | a [element 3] : | -| array_flow.rb:460:19:460:28 | call to source : | 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: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:462:10:462:10 | b [element 3] : | -| array_flow.rb:461:9:461:17 | call to entries [element 3] : | array_flow.rb:462:10:462:10 | 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: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:19:466:30 | call to source : | array_flow.rb:467:9:467:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:467:9:467:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:471:9:471:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:471:9:471:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:473:9:473:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:473:9:473:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:477:9:477:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:477:9:477:9 | a [element 3] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:467:9:467:9 | a [element 4] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:467:9:467:9 | a [element 4] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:477:9:477:9 | a [element 4] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:477:9:477:9 | a [element 4] : | +| 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:470:10:470:10 | b | -| array_flow.rb:467:9:469:7 | call to fetch : | array_flow.rb:470:10:470:10 | b | +| 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:472:10:472:10 | b | -| array_flow.rb:471:9:471:18 | call to fetch : | array_flow.rb:472:10:472:10 | b | +| 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:474:10:474:10 | b | -| array_flow.rb:473:9:473:32 | call to fetch : | array_flow.rb:474:10:474:10 | b | +| 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:9:475:34 | call to fetch : | array_flow.rb:476:10:476:10 | b | -| array_flow.rb:475:9:475:34 | call to fetch : | 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: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:478:10:478:10 | b | -| array_flow.rb:477:9:477:32 | call to fetch : | array_flow.rb:478:10:478:10 | b | +| 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:19:482:30 | call to source : | array_flow.rb:484:10:484:10 | a [element 3] : | -| array_flow.rb:482:19:482:30 | call to source : | 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: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] : | @@ -868,32 +1105,44 @@ edges | 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:19:498:28 | call to source : | array_flow.rb:499:9:499:9 | a [element 3] : | -| array_flow.rb:498:19:498:28 | call to source : | 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: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:502:10:502:10 | b [element] : | -| array_flow.rb:499:9:501:7 | call to filter [element] : | array_flow.rb:502:10:502:10 | 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: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:19:506:28 | call to source : | array_flow.rb:507:9:507:9 | a [element 3] : | -| array_flow.rb:506:19:506:28 | call to source : | 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: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:510:10:510:10 | b [element] : | -| array_flow.rb:507:9:509:7 | call to filter_map [element] : | array_flow.rb:510:10:510:10 | 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: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:19:514:28 | call to source : | array_flow.rb:515:9:515:9 | a [element 3] : | -| array_flow.rb:514:19:514:28 | call to source : | 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: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] : | @@ -902,52 +1151,66 @@ edges | 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:520:10:520:10 | b [element] : | -| array_flow.rb:515:9:518:7 | call to filter! [element] : | array_flow.rb:520:10:520:10 | 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: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:19:524:30 | call to source : | array_flow.rb:525:9:525:9 | a [element 3] : | -| array_flow.rb:524:19:524:30 | call to source : | 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: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:528:10:528:10 | b | -| array_flow.rb:525:9:527:7 | call to find : | array_flow.rb:528:10:528:10 | b | +| 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:19:532:28 | call to source : | array_flow.rb:533:9:533:9 | a [element 3] : | -| array_flow.rb:532:19:532:28 | call to source : | 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: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:536:10:536:10 | b [element] : | -| array_flow.rb:533:9:535:7 | call to find_all [element] : | array_flow.rb:536:10:536:10 | 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: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:19:540:28 | call to source : | array_flow.rb:541:5:541:5 | a [element 3] : | -| array_flow.rb:540:19:540:28 | call to source : | 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: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:10:547:21 | call to source : | array_flow.rb:549:10:549:10 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:549:10:549:10 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:550:9:550:9 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:550:9:550:9 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:553:9:553:9 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:553:9:553:9 | a [element 0] : | -| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:553:9:553:9 | a [element 3] : | -| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:553:9:553:9 | a [element 3] : | +| 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] : | @@ -960,36 +1223,46 @@ edges | 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:551:10:551:10 | b [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element 0] : | array_flow.rb:551:10:551:10 | b [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:551:10:551:10 | b [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:551:10:551:10 | b [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:552:10:552:10 | b [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:552:10:552:10 | b [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:554:10:554:10 | c [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 0] : | array_flow.rb:554:10:554:10 | c [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:554:10:554:10 | c [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:554:10:554:10 | c [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:555:10:555:10 | c [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:555:10:555:10 | c [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 | ...[...] | @@ -998,48 +1271,65 @@ edges | 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:16:559:27 | call to source : | array_flow.rb:560:9:560:9 | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:560:9:560:9 | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:565:9:565:9 | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:565:9:565: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: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:564:10:564:10 | b [element] : | -| array_flow.rb:560:9:563:7 | call to flat_map [element] : | array_flow.rb:564:10:564:10 | 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: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:569:10:569:10 | b [element] : | -| array_flow.rb:565:9:568:7 | call to flat_map [element] : | array_flow.rb:569:10:569:10 | 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: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:20:573:29 | call to source : | 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: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: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:575:10:575:10 | b [element] : | -| array_flow.rb:574:9:574:17 | call to flatten [element] : | array_flow.rb:575:10:575:10 | 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: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:20:579:29 | call to source : | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | 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:581:9:581:9 | 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: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] : | @@ -1053,11 +1343,10 @@ edges | 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:585:10:585:10 | b [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | array_flow.rb:585:10:585:10 | b [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:584:10:584:10 | b [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:584:10:584:10 | b [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:585:10:585:10 | b [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] : | @@ -1074,90 +1363,122 @@ edges | 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:19:589:30 | call to source : | array_flow.rb:590:9:590:9 | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:590:9:590:9 | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:592:9:592:9 | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:592:9:592: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: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:591:10:591:10 | b [element] : | -| array_flow.rb:590:9:590:20 | call to grep [element] : | array_flow.rb:591:10:591:10 | 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: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:596:10:596:10 | b [element] : | -| array_flow.rb:592:9:595:7 | call to grep [element] : | array_flow.rb:596:10:596:10 | 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: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:19:600:30 | call to source : | array_flow.rb:601:9:601:9 | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:601:9:601:9 | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:603:9:603:9 | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:603:9:603: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: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:602:10:602:10 | b [element] : | -| array_flow.rb:601:9:601:21 | call to grep_v [element] : | array_flow.rb:602:10:602:10 | 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: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:607:10:607:10 | b [element] : | -| array_flow.rb:603:9:606:7 | call to grep_v [element] : | array_flow.rb:607:10:607:10 | 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: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:19:611:30 | call to source : | array_flow.rb:612:9:612:9 | a [element 3] : | -| array_flow.rb:611:19:611:30 | call to source : | 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: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:19:620:28 | call to source : | array_flow.rb:621:5:621:5 | a [element 3] : | -| array_flow.rb:620:19:620:28 | call to source : | 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: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:10:627:21 | call to source : | array_flow.rb:628:9:628:9 | a [element 0] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:628:9:628:9 | a [element 0] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:634:9:634:9 | a [element 0] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:634:9:634:9 | a [element 0] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:628:9:628:9 | a [element 2] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:628:9:628:9 | a [element 2] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:634:9:634:9 | a [element 2] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:634:9:634:9 | a [element 2] : | +| 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:633:10:633:10 | b | -| array_flow.rb:628:9:632:7 | call to inject : | array_flow.rb:633:10:633:10 | b | +| 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:639:10:639:10 | c | -| array_flow.rb:634:9:638:7 | call to inject : | array_flow.rb:639:10:639:10 | c | +| 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:16:644:27 | call to source : | array_flow.rb:645:9:645:9 | a [element 2] : | -| array_flow.rb:644:16:644:27 | call to source : | 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: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] : | @@ -1168,12 +1489,12 @@ edges | 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:652:10:652:10 | b [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 1] : | array_flow.rb:652:10:652:10 | b [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:655:10:655:10 | b [element 4] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:655:10:655:10 | b [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] : | @@ -1194,16 +1515,20 @@ edges | 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:16:658:27 | call to source : | array_flow.rb:659:9:659:9 | c [element 2] : | -| array_flow.rb:658:16:658:27 | call to source : | 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: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:661:10:661:10 | d [element] : | -| array_flow.rb:659:9:659:47 | call to insert [element] : | array_flow.rb:661:10:661:10 | 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: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] : | @@ -1216,20 +1541,28 @@ edges | 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:16:672:27 | call to source : | array_flow.rb:673:9:673:9 | a [element 2] : | -| array_flow.rb:672:16:672:27 | call to source : | 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: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:674:10:674:10 | b [element] : | -| array_flow.rb:673:9:673:60 | call to intersection [element] : | array_flow.rb:674:10:674:10 | 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: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:16:678:25 | call to source : | array_flow.rb:679:9:679:9 | a [element 2] : | -| array_flow.rb:678:16:678:25 | call to source : | 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: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] : | @@ -1238,18 +1571,20 @@ edges | 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:684:10:684:10 | b [element] : | -| array_flow.rb:679:9:682:7 | call to keep_if [element] : | array_flow.rb:684:10:684:10 | 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: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:16:688:27 | call to source : | array_flow.rb:690:10:690:10 | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:690:10:690:10 | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:691:9:691:9 | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:691:9:691:9 | 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: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] : | @@ -1260,198 +1595,246 @@ edges | 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:692:10:692:10 | b [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:692:10:692:10 | b [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:693:10:693:10 | b [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:693:10:693:10 | 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: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:16:697:27 | call to source : | array_flow.rb:698:9:698:9 | a [element 2] : | -| array_flow.rb:697:16:697:27 | call to source : | 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: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:702:10:702:10 | b [element] : | -| array_flow.rb:698:9:701:7 | call to map [element] : | array_flow.rb:702:10:702:10 | 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: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:16:706:27 | call to source : | array_flow.rb:707:9:707:9 | a [element 2] : | -| array_flow.rb:706:16:706:27 | call to source : | 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: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:711:10:711:10 | b [element] : | -| array_flow.rb:707:9:710:7 | call to map! [element] : | array_flow.rb:711:10:711:10 | 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: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:16:715:25 | call to source : | array_flow.rb:718:9:718:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:718:9:718:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:722:9:722:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:722:9:722:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:726:9:726:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:726:9:726:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:734:9:734:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:734:9:734: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: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:719:10:719:10 | b | -| array_flow.rb:718:9:718:13 | call to max : | array_flow.rb:719:10:719:10 | b | +| 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:723:10:723:10 | c [element] : | -| array_flow.rb:722:9:722:16 | call to max [element] : | array_flow.rb:723:10:723:10 | 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: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:731:10:731:10 | d | -| array_flow.rb:726:9:730:7 | call to max : | array_flow.rb:731:10:731:10 | d | +| 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:739:10:739:10 | e [element] : | -| array_flow.rb:734:9:738:7 | call to max [element] : | array_flow.rb:739:10:739:10 | 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: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:16:743:25 | call to source : | array_flow.rb:746:9:746:9 | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:746:9:746:9 | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:753:9:753:9 | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:753:9:753: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: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:750:10:750:10 | b | -| array_flow.rb:746:9:749:7 | call to max_by : | array_flow.rb:750:10:750:10 | b | +| 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:757:10:757:10 | c [element] : | -| array_flow.rb:753:9:756:7 | call to max_by [element] : | array_flow.rb:757:10:757:10 | 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: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:16:761:25 | call to source : | array_flow.rb:764:9:764:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:764:9:764:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:768:9:768:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:768:9:768:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:772:9:772:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:772:9:772:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:780:9:780:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:780:9:780: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: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:765:10:765:10 | b | -| array_flow.rb:764:9:764:13 | call to min : | array_flow.rb:765:10:765:10 | b | +| 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:769:10:769:10 | c [element] : | -| array_flow.rb:768:9:768:16 | call to min [element] : | array_flow.rb:769:10:769:10 | 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: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:777:10:777:10 | d | -| array_flow.rb:772:9:776:7 | call to min : | array_flow.rb:777:10:777:10 | d | +| 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:785:10:785:10 | e [element] : | -| array_flow.rb:780:9:784:7 | call to min [element] : | array_flow.rb:785:10:785:10 | 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: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:16:789:25 | call to source : | array_flow.rb:792:9:792:9 | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:792:9:792:9 | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:799:9:799:9 | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:799:9:799: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: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:796:10:796:10 | b | -| array_flow.rb:792:9:795:7 | call to min_by : | array_flow.rb:796:10:796:10 | b | +| 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:803:10:803:10 | c [element] : | -| array_flow.rb:799:9:802:7 | call to min_by [element] : | array_flow.rb:803:10:803:10 | 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: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:16:807:25 | call to source : | array_flow.rb:809:9:809:9 | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:809:9:809:9 | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:813:9:813:9 | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:813:9:813: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: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:810:10:810:10 | b [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:810:10:810:10 | b [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:811:10:811:10 | b [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:811:10:811:10 | 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: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:818:10:818:10 | c [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:818:10:818:10 | c [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:819:10:819:10 | c [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:819:10:819:10 | 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: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 | @@ -1460,47 +1843,61 @@ edges | 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:16:823:25 | call to source : | array_flow.rb:824:9:824:9 | a [element 2] : | -| array_flow.rb:823:16:823:25 | call to source : | 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: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:828:10:828:10 | b [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:828:10:828:10 | b [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:829:10:829:10 | b [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:829:10:829:10 | 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: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:16:833:25 | call to source : | array_flow.rb:834:5:834:5 | a [element 2] : | -| array_flow.rb:833:16:833:25 | call to source : | 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: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:16:842:25 | call to source : | array_flow.rb:843:5:843:5 | a [element 2] : | -| array_flow.rb:842:16:842:25 | call to source : | 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: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:16:849:25 | call to source : | array_flow.rb:850:9:850:9 | a [element 2] : | +| 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:851:10:851:10 | b | -| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:856:9:856:9 | a [element 2] : | -| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:856:9:856:9 | a [element 2] : | +| 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:860:10:860:10 | b [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:860:10:860:10 | b [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:861:10:861:10 | b [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:861:10:861:10 | 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: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] : | @@ -1511,18 +1908,22 @@ edges | 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:16:865:25 | call to source : | array_flow.rb:867:9:867:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:867:9:867:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:875:9:875:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:875:9:875:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:882:9:882:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:882:9:882: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: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:873:10:873:10 | b [element 2] : | -| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | array_flow.rb:873:10:873:10 | 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: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] : | @@ -1537,14 +1938,16 @@ edges | 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:880:10:880:10 | c [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:880:10:880:10 | c [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:887:10:887:10 | c [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:887:10:887:10 | 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: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] : | @@ -1567,40 +1970,52 @@ edges | 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:13:894:24 | call to source : | array_flow.rb:895:9:895:9 | a [element 1] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:895:9:895:9 | a [element 1] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:10 | a [element 1] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:10 | a [element 1] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:895:9:895:9 | a [element 3] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:895:9:895:9 | a [element 3] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:10 | a [element 3] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:10 | a [element 3] : | +| 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:896:10:896:10 | b | -| array_flow.rb:895:9:895:13 | call to pop : | array_flow.rb:896:10:896:10 | b | +| 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:13:902:24 | call to source : | array_flow.rb:903:9:903:9 | a [element 1] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:903:9:903:9 | a [element 1] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:10 | a [element 1] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:10 | a [element 1] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:903:9:903:9 | a [element 3] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:903:9:903:9 | a [element 3] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:10 | a [element 3] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:10 | a [element 3] : | +| 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:904:10:904:10 | b [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:904:10:904:10 | b [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:905:10:905:10 | b [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:905:10:905:10 | 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: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 | ...[...] | @@ -1609,8 +2024,10 @@ edges | 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:16:913:27 | call to source : | array_flow.rb:914:5:914:5 | a [element 2] : | -| array_flow.rb:913:16:913:27 | call to source : | 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: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] : | @@ -1623,18 +2040,26 @@ edges | 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:16:924:27 | call to source : | array_flow.rb:927:9:927:9 | a [element 2] : | -| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:927:9:927:9 | a [element 2] : | -| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:927:19:927:19 | b [element 1] : | -| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:927:19:927:19 | b [element 1] : | -| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:927:22:927:22 | c [element 0] : | -| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:927:22:927:22 | c [element 0] : | +| 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:928:10:928:10 | d [element, element] : | -| 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:927:9:927:22 | call to product [element, element] : | array_flow.rb:929:10:929:10 | d [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:929:10:929:10 | 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: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] : | @@ -1647,22 +2072,28 @@ edges | 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:10:933:21 | call to source : | array_flow.rb:934:9:934:9 | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:934:9:934:9 | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:10 | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:10 | 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: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:937:10:937:10 | b [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element 0] : | array_flow.rb:937:10:937:10 | b [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:937:10:937:10 | b [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:937:10:937:10 | b [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:938:10:938:10 | b [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:938:10:938:10 | b [element] : | +| 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] : | @@ -1683,12 +2114,16 @@ edges | 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:10:944:19 | call to source : | array_flow.rb:945:16:945:16 | c [element 0] : | -| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:945:16:945:16 | c [element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [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:947:10:947:10 | d [element 2, 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: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 | ...[...] | @@ -1697,14 +2132,18 @@ edges | 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:10:951:21 | call to source : | array_flow.rb:952:9:952:9 | a [element 0] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:952:9:952:9 | a [element 0] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:957:9:957:9 | a [element 0] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:957:9:957:9 | a [element 0] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:952:9:952:9 | a [element 2] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:952:9:952:9 | a [element 2] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:957:9:957:9 | a [element 2] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:957:9:957:9 | a [element 2] : | +| 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 : | @@ -1719,20 +2158,28 @@ edges | 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:16:965:25 | call to source : | array_flow.rb:966:9:966:9 | a [element 2] : | -| array_flow.rb:965:16:965:25 | call to source : | 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: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:970:10:970:10 | b [element] : | -| array_flow.rb:966:9:969:7 | call to reject [element] : | array_flow.rb:970:10:970:10 | 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: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:16:974:25 | call to source : | array_flow.rb:975:9:975:9 | a [element 2] : | -| array_flow.rb:974:16:974:25 | call to source : | 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: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] : | @@ -1741,22 +2188,26 @@ edges | 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:980:10:980:10 | b [element] : | -| array_flow.rb:975:9:978:7 | call to reject! [element] : | array_flow.rb:980:10:980:10 | 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: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:16:984:25 | call to source : | array_flow.rb:985:9:985:9 | a [element 2] : | -| array_flow.rb:984:16:984:25 | call to source : | 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: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:990:10:990:10 | b [element 2] : | -| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | array_flow.rb:990:10:990:10 | 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: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] : | @@ -1767,14 +2218,18 @@ edges | 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:16:994:25 | call to source : | array_flow.rb:995:9:995:9 | a [element 2] : | -| array_flow.rb:994:16:994:25 | call to source : | 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: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:1000:10:1000:10 | b [element 2] : | -| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | array_flow.rb:1000:10:1000:10 | 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: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] : | @@ -1785,10 +2240,12 @@ edges | 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:1008:10:1008:10 | b [element 0] : | -| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | array_flow.rb:1008:10:1008:10 | 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: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] : | @@ -1797,24 +2254,30 @@ edges | 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:16:1012:28 | call to source : | array_flow.rb:1013:9:1013:9 | a [element 2] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1013:9:1013:9 | a [element 2] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:10 | a [element 2] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:10 | a [element 2] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1013:9:1013:9 | a [element 3] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1013:9:1013:9 | a [element 3] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:10 | a [element 3] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:10 | a [element 3] : | +| 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:1014:10:1014:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1014:10:1014:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1016:10:1016:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1016:10:1016:10 | 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: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 | ...[...] | @@ -1825,14 +2288,24 @@ edges | 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:16:1023:28 | call to source : | array_flow.rb:1024:9:1024:9 | a [element 2] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1024:9:1024:9 | a [element 2] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:10 | a [element 2] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:10 | a [element 2] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1024:9:1024:9 | a [element 3] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1024:9:1024:9 | a [element 3] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:10 | a [element 3] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:10 | a [element 3] : | +| 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] : | @@ -1847,12 +2320,8 @@ edges | 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:1025:10:1025:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1025:10:1025:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1027:10:1027:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1027:10:1027:10 | 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: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 | ...[...] | @@ -1869,66 +2338,84 @@ edges | 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:16:1034:26 | call to source : | array_flow.rb:1035:9:1035:9 | a [element 2] : | -| array_flow.rb:1034:16:1034:26 | call to source : | 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: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:1038:10:1038:10 | b [element 2] : | -| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | array_flow.rb:1038:10:1038:10 | 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: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:16:1042:26 | call to source : | array_flow.rb:1043:5:1043:5 | a [element 2] : | -| array_flow.rb:1042:16:1042:26 | call to source : | 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: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:10:1052:22 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 0] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 2] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 3] : | +| 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:1056:10:1056:10 | b [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | array_flow.rb:1056:10:1056:10 | b [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | +| 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 | ...[...] | @@ -1941,24 +2428,30 @@ edges | 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:1061:10:1061:10 | b [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | array_flow.rb:1061:10:1061:10 | b [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | +| 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 | ...[...] | @@ -1971,38 +2464,46 @@ edges | 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:1067:10:1067:10 | b [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | array_flow.rb:1067:10:1067:10 | b [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1070:10:1070:10 | b [element 3] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1070:10:1070:10 | b [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:1073:10:1073:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1073:10:1073:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1076:10:1076:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1076:10:1076:10 | 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: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 | ...[...] | @@ -2011,12 +2512,30 @@ edges | 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:10:1084:22 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 0] : | -| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 0] : | -| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 2] : | -| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 2] : | -| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 3] : | -| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 3] : | +| 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] : | @@ -2041,18 +2560,12 @@ edges | 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:1091:10:1091:10 | b [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | array_flow.rb:1091:10:1091:10 | b [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | +| 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 | ...[...] | @@ -2077,12 +2590,30 @@ edges | 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:10:1095:22 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 0] : | -| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 0] : | -| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 2] : | -| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 2] : | -| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 3] : | -| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 3] : | +| 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] : | @@ -2107,18 +2638,12 @@ edges | 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:1101:10:1101:10 | b [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | array_flow.rb:1101:10:1101:10 | b [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | +| 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 | ...[...] | @@ -2143,12 +2668,24 @@ edges | 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:10:1106:22 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 0] : | -| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 0] : | -| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 2] : | -| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 2] : | -| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 3] : | -| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 3] : | +| 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] : | @@ -2167,12 +2704,12 @@ edges | 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:1112:10:1112:10 | b [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | array_flow.rb:1112:10:1112:10 | b [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1115:10:1115:10 | b [element 3] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1115:10:1115:10 | b [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 | ...[...] | @@ -2185,12 +2722,26 @@ edges | 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:10:1117:22 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 0] : | -| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 0] : | -| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 2] : | -| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 2] : | -| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 3] : | -| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 3] : | +| 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] : | @@ -2211,14 +2762,8 @@ edges | 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:1123:10:1123:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1123:10:1123:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1126:10:1126:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1126:10:1126:10 | 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: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 | ...[...] | @@ -2235,20 +2780,28 @@ edges | 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:19:1130:29 | call to source : | array_flow.rb:1131:9:1131:9 | a [element 3] : | -| array_flow.rb:1130:19:1130:29 | call to source : | 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: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:1134:10:1134:10 | b [element] : | -| array_flow.rb:1131:9:1133:7 | call to select [element] : | array_flow.rb:1134:10:1134:10 | 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: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:16:1138:26 | call to source : | array_flow.rb:1139:9:1139:9 | a [element 2] : | -| array_flow.rb:1138:16:1138:26 | call to source : | 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: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] : | @@ -2257,52 +2810,72 @@ edges | 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:1144:10:1144:10 | b [element] : | -| array_flow.rb:1139:9:1142:7 | call to select! [element] : | array_flow.rb:1144:10:1144:10 | 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: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:10:1148:22 | call to source : | array_flow.rb:1149:9:1149:9 | a [element 0] : | -| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1149:9:1149:9 | a [element 0] : | -| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1149:9:1149:9 | a [element 2] : | -| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1149:9:1149:9 | a [element 2] : | +| 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:1150:10:1150:10 | b | -| array_flow.rb:1149:9:1149:15 | call to shift : | array_flow.rb:1150:10:1150:10 | b | +| 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:10:1155:22 | call to source : | array_flow.rb:1156:9:1156:9 | a [element 0] : | -| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1156:9:1156:9 | a [element 0] : | -| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1156:9:1156:9 | a [element 2] : | -| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1156:9:1156:9 | a [element 2] : | +| 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:1157:10:1157:10 | b [element 0] : | -| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | array_flow.rb:1157:10:1157:10 | 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: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:10:1163:22 | call to source : | array_flow.rb:1164:9:1164:9 | a [element 0] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1164:9:1164:9 | a [element 0] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1167:10:1167:10 | a [element 0] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1167:10:1167:10 | a [element 0] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1164:9:1164:9 | a [element 2] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1164:9:1164:9 | a [element 2] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1169:10:1169:10 | a [element 2] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1169:10:1169:10 | a [element 2] : | +| 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] : | @@ -2317,10 +2890,8 @@ edges | 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:1165:10:1165:10 | b [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1165:10:1165:10 | b [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1166:10:1166:10 | b [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1166:10:1166:10 | 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: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 | ...[...] | @@ -2335,18 +2906,22 @@ edges | 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:16:1173:26 | call to source : | array_flow.rb:1174:9:1174:9 | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1174:9:1174:9 | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:10 | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:10 | 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: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:1178:10:1178:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1178:10:1178:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1180:10:1180:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1180:10:1180:10 | 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: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 | ...[...] | @@ -2355,10 +2930,18 @@ edges | 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:16:1184:26 | call to source : | array_flow.rb:1185:9:1185:9 | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1185:9:1185:9 | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:10 | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:10 | 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: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] : | @@ -2369,12 +2952,8 @@ edges | 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:1189:10:1189:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1189:10:1189:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1191:10:1191:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1191:10:1191:10 | 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: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 | ...[...] | @@ -2389,52 +2968,65 @@ edges | 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:16:1195:28 | call to source : | array_flow.rb:1200:9:1200:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1200:9:1200:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1218:9:1218:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1218:9:1218:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1223:9:1223:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1223:9:1223:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1236:9:1236:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1236:9:1236:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 2] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1197:9:1197:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1197:9:1197:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1200:9:1200:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1200:9:1200:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 4] : | +| 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:1198:10:1198:10 | b | -| array_flow.rb:1197:9:1197:17 | call to slice : | array_flow.rb:1198:10:1198:10 | b | +| 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:1201:10:1201:10 | b | -| array_flow.rb:1200:9:1200:19 | call to slice : | array_flow.rb:1201:10:1201:10 | b | +| 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] : | @@ -2443,114 +3035,146 @@ edges | 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:1205:10:1205:10 | b | -| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1205:10:1205:10 | b | -| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1207:10:1207:10 | b : | -| array_flow.rb:1203:9:1203:17 | call to slice [element] : | array_flow.rb:1207:10:1207:10 | b [element] : | -| array_flow.rb:1203:9:1203:17 | call to slice [element] : | array_flow.rb:1207:10:1207:10 | b [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:1210:10:1210:10 | b [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | array_flow.rb:1210:10:1210:10 | b [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1212:10:1212:10 | b [element 2] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1212:10:1212:10 | b [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:1215:10:1215:10 | b [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1215:10:1215:10 | b [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1216:10:1216:10 | b [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1216:10:1216:10 | 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: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:1219:10:1219:10 | b [element 0] : | -| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | array_flow.rb:1219:10:1219:10 | 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: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:1224:10:1224:10 | b [element 0] : | -| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | array_flow.rb:1224:10:1224:10 | 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: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:1229:10:1229:10 | b [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1229:10:1229:10 | b [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1230:10:1230:10 | b [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1230:10:1230:10 | 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: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:1233:10:1233:10 | b [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1233:10:1233:10 | b [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1234:10:1234:10 | b [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1234:10:1234:10 | 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: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:1239:10:1239:10 | b [element 2] : | -| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | array_flow.rb:1239:10:1239:10 | 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: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:1242:10:1242:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1242:10:1242:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1244:10:1244:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1244:10:1244:10 | 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: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:16:1248:28 | call to source : | array_flow.rb:1249:9:1249:9 | a [element 2] : | -| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1249:9:1249:9 | a [element 2] : | -| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1249:9:1249:9 | a [element 4] : | -| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1249:9:1249:9 | a [element 4] : | +| 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:1250:10:1250:10 | b | -| array_flow.rb:1249:9:1249:19 | call to slice! : | array_flow.rb:1250:10:1250:10 | b | +| 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:16:1256:28 | call to source : | array_flow.rb:1257:9:1257:9 | a [element 2] : | -| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1257:9:1257:9 | a [element 2] : | -| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1257:9:1257:9 | a [element 4] : | -| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1257:9:1257:9 | a [element 4] : | +| 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] : | @@ -2571,11 +3195,10 @@ edges | 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:1263:10:1263:10 | b | -| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1263:10:1263:10 | b | -| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1265:10:1265:10 | b : | -| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | array_flow.rb:1265:10:1265:10 | b [element] : | -| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | array_flow.rb:1265:10:1265:10 | b [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 | ...[...] | @@ -2587,58 +3210,88 @@ edges | 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:16:1267:28 | call to source : | array_flow.rb:1268:9:1268:9 | a [element 2] : | -| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1268:9:1268:9 | a [element 2] : | -| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1268:9:1268:9 | a [element 4] : | -| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1268:9:1268:9 | a [element 4] : | +| 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:1269:10:1269:10 | b [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | array_flow.rb:1269:10:1269:10 | b [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1271:10:1271:10 | b [element 2] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1271:10:1271:10 | b [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:16:1278:28 | call to source : | array_flow.rb:1279:9:1279:9 | a [element 2] : | -| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1279:9:1279:9 | a [element 2] : | -| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1279:9:1279:9 | a [element 4] : | -| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1279:9:1279:9 | a [element 4] : | +| 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:1280:10:1280:10 | b [element 0] : | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | array_flow.rb:1280:10:1280:10 | 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: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:16:1289:28 | call to source : | array_flow.rb:1290:9:1290:9 | a [element 2] : | -| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1290:9:1290:9 | a [element 2] : | -| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1290:9:1290:9 | a [element 4] : | -| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1290:9:1290:9 | a [element 4] : | +| 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:1291:10:1291:10 | b [element 0] : | -| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | array_flow.rb:1291:10:1291:10 | 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: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:16:1300:28 | call to source : | array_flow.rb:1301:9:1301:9 | a [element 2] : | -| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1301:9:1301:9 | a [element 2] : | -| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1301:9:1301:9 | a [element 4] : | -| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1301:9:1301:9 | a [element 4] : | +| 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] : | @@ -2653,12 +3306,8 @@ edges | 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:1302:10:1302:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1302:10:1302:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1304:10:1304:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1304:10:1304:10 | 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: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 | ...[...] | @@ -2671,10 +3320,20 @@ edges | 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:16:1309:28 | call to source : | array_flow.rb:1310:9:1310:9 | a [element 2] : | -| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1310:9:1310:9 | a [element 2] : | -| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1310:9:1310:9 | a [element 4] : | -| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1310:9:1310:9 | a [element 4] : | +| 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] : | @@ -2689,12 +3348,8 @@ edges | 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:1311:10:1311:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1311:10:1311:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1313:10:1313:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1313:10:1313:10 | 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: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 | ...[...] | @@ -2707,10 +3362,20 @@ edges | 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:16:1318:28 | call to source : | array_flow.rb:1319:9:1319:9 | a [element 2] : | -| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1319:9:1319:9 | a [element 2] : | -| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1319:9:1319:9 | a [element 4] : | -| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1319:9:1319:9 | a [element 4] : | +| 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] : | @@ -2725,12 +3390,8 @@ edges | 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:1320:10:1320:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1320:10:1320:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1322:10:1322:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1322:10:1322:10 | 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: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 | ...[...] | @@ -2743,26 +3404,42 @@ edges | 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:16:1327:28 | call to source : | array_flow.rb:1328:9:1328:9 | a [element 2] : | -| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1328:9:1328:9 | a [element 2] : | -| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1328:9:1328:9 | a [element 4] : | -| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1328:9:1328:9 | a [element 4] : | +| 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:1331:10:1331:10 | b [element 2] : | -| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | array_flow.rb:1331:10:1331:10 | 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: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:16:1336:28 | call to source : | array_flow.rb:1337:9:1337:9 | a [element 2] : | -| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1337:9:1337:9 | a [element 2] : | -| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1337:9:1337:9 | a [element 4] : | -| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1337:9:1337:9 | a [element 4] : | +| 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] : | @@ -2777,12 +3454,8 @@ edges | 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:1338:10:1338:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1338:10:1338:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1340:10:1340:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1340:10:1340:10 | 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: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 | ...[...] | @@ -2795,20 +3468,26 @@ edges | 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:16:1347:26 | call to source : | array_flow.rb:1348:9:1348:9 | a [element 2] : | -| array_flow.rb:1347:16:1347:26 | call to source : | 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: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:16:1355:26 | call to source : | array_flow.rb:1356:9:1356:9 | a [element 2] : | -| array_flow.rb:1355:16:1355:26 | call to source : | 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: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:16:1363:26 | call to source : | array_flow.rb:1364:9:1364:9 | a [element 2] : | -| array_flow.rb:1363:16:1363:26 | call to source : | 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: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 : | @@ -2817,30 +3496,36 @@ edges | 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:16:1371:26 | call to source : | array_flow.rb:1372:9:1372:9 | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1372:9:1372:9 | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1375:9:1375:9 | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1375:9:1375: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: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:1373:10:1373:10 | b [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1373:10:1373:10 | b [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1374:10:1374:10 | b [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1374:10:1374:10 | 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: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:1380:10:1380:10 | c [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1380:10:1380:10 | c [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1381:10:1381:10 | c [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1381:10:1381:10 | 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: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 | @@ -2849,8 +3534,14 @@ edges | 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:16:1385:26 | call to source : | array_flow.rb:1386:9:1386:9 | a [element 2] : | -| array_flow.rb:1385:16:1385:26 | call to source : | 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: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] : | @@ -2859,10 +3550,8 @@ edges | 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:1387:10:1387:10 | b [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1387:10:1387:10 | b [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1388:10:1388:10 | b [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1388:10:1388:10 | 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: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 | ...[...] | @@ -2871,8 +3560,14 @@ edges | 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:16:1392:26 | call to source : | array_flow.rb:1393:9:1393:9 | a [element 2] : | -| array_flow.rb:1392:16:1392:26 | call to source : | 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: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] : | @@ -2885,10 +3580,8 @@ edges | 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:1398:10:1398:10 | b [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1398:10:1398:10 | b [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1399:10:1399:10 | b [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1399:10:1399:10 | 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: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 | @@ -2901,24 +3594,34 @@ edges | 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:16:1405:26 | call to source : | array_flow.rb:1406:9:1406:9 | a [element 2] : | -| array_flow.rb:1405:16:1405:26 | call to source : | 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: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:1410:10:1410:10 | b [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1410:10:1410:10 | b [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1411:10:1411:10 | b [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1411:10:1411:10 | 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: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:16:1415:26 | call to source : | array_flow.rb:1416:9:1416:9 | a [element 2] : | -| array_flow.rb:1415:16:1415:26 | call to source : | 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: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] : | @@ -2929,10 +3632,8 @@ edges | 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:1422:10:1422:10 | b [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1422:10:1422:10 | b [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1423:10:1423:10 | b [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1423:10:1423:10 | 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: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 | ...[...] | @@ -2943,58 +3644,74 @@ edges | 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:16:1427:26 | call to source : | array_flow.rb:1428:9:1428:9 | a [element 2] : | -| array_flow.rb:1427:16:1427:26 | call to source : | 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: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:16:1435:28 | call to source : | array_flow.rb:1436:9:1436:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1436:9:1436:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1441:9:1441:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1441:9:1441:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1454:9:1454:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1454:9:1454:9 | a [element 2] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1436:9:1436:9 | a [element 3] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1436:9:1436:9 | a [element 3] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 3] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 3] : | +| 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:1439:10:1439:10 | b [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | array_flow.rb:1439:10:1439:10 | b [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1440:10:1440:10 | b [element 3] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1440:10:1440:10 | b [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:1444:10:1444:10 | b [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1444:10:1444:10 | b [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1446:10:1446:10 | b [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1446:10:1446:10 | 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: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:1450:10:1450:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1450:10:1450:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1452:10:1452:10 | b [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1452:10:1452:10 | b [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 | ...[...] | @@ -3007,64 +3724,92 @@ edges | 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:1455:10:1455:10 | b [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | array_flow.rb:1455:10:1455:10 | b [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1455:10:1455:10 | b [element] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1455:10:1455:10 | b [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:16:1459:26 | call to source : | array_flow.rb:1460:9:1460:9 | a [element 2] : | -| array_flow.rb:1459:16:1459:26 | call to source : | 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: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:1466:10:1466:10 | b [element 2] : | -| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | array_flow.rb:1466:10:1466:10 | 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: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:19:1472:29 | call to source : | array_flow.rb:1473:9:1473:9 | a [element 3] : | -| array_flow.rb:1472:19:1472:29 | call to source : | 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: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:1474:10:1474:10 | b [element 3] : | -| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | array_flow.rb:1474:10:1474:10 | 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: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:16:1478:26 | call to source : | array_flow.rb:1479:9:1479:9 | a [element 2] : | -| array_flow.rb:1478:16:1478:26 | call to source : | 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: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:1482:10:1482:10 | b [element 2] : | -| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | array_flow.rb:1482:10:1482:10 | 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: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:14:1495:26 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | -| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | -| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | -| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | -| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | -| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 2, 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 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:1500:10:1500:10 | b [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [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 | ...[...] | @@ -3077,20 +3822,28 @@ edges | 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:16:1506:28 | call to source : | array_flow.rb:1509:9:1509:9 | a [element 2] : | -| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1509:9:1509:9 | a [element 2] : | -| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1509:17:1509:17 | b [element 1] : | -| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1509:17:1509:17 | b [element 1] : | -| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1509:20:1509:20 | c [element 1] : | -| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1509:20:1509:20 | c [element 1] : | +| 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:1510:10:1510:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1510:10:1510:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1512:10:1512:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1512:10:1512:10 | 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: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] : | @@ -3101,26 +3854,34 @@ edges | 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:19:1516:31 | call to source : | array_flow.rb:1518:9:1518:9 | a [element 3] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1518:9:1518:9 | a [element 3] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 3] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 3] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1518:9:1518:9 | a [element 4] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1518:9:1518:9 | a [element 4] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 4] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 4] : | +| 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:1519:10:1519:10 | b [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1519:10:1519:10 | b [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1520:10:1520:10 | b [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1520:10:1520:10 | 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: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 : | @@ -3129,16 +3890,24 @@ edges | 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:1526:10:1526:10 | c [element] : | -| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | array_flow.rb:1526:10:1526:10 | 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: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:16:1530:28 | call to source : | array_flow.rb:1531:9:1531:9 | a [element 2] : | -| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1531:9:1531:9 | a [element 2] : | -| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1531:9:1531:9 | a [element 3] : | -| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1531:9:1531:9 | a [element 3] : | +| 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] : | @@ -3151,10 +3920,8 @@ edges | 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:1532:10:1532:10 | b [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1532:10:1532:10 | b [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1533:10:1533:10 | b [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1533:10:1533:10 | 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: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 | ...[...] | @@ -3163,10 +3930,18 @@ edges | 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:16:1537:28 | call to source : | array_flow.rb:1538:9:1538:9 | a [element 2] : | -| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1538:9:1538:9 | a [element 2] : | -| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1538:9:1538:9 | a [element 3] : | -| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1538:9:1538:9 | a [element 3] : | +| 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] : | @@ -3183,10 +3958,8 @@ edges | 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:1542:10:1542:10 | b [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1542:10:1542:10 | b [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1543:10:1543:10 | b [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1543:10:1543:10 | 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: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 | ...[...] | @@ -3197,8 +3970,10 @@ edges | 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:16:1549:28 | call to source : | array_flow.rb:1550:5:1550:5 | a [element 2] : | -| array_flow.rb:1549:16:1549:28 | call to source : | 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: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] : | @@ -3211,72 +3986,88 @@ edges | 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:13:1560:25 | call to source : | array_flow.rb:1562:9:1562:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1562:9:1562:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 1] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 3] : | +| 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:1564:10:1564:10 | b [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | array_flow.rb:1564:10:1564:10 | b [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1566:10:1566:10 | b [element 3] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1566:10:1566:10 | b [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:1569:10:1569:10 | b [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1569:10:1569:10 | b [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1570:10:1570:10 | b [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1570:10:1570:10 | 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: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:1573:10:1573:10 | b [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1573:10:1573:10 | b [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1574:10:1574:10 | b [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1574:10:1574:10 | 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: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:1578:10:1578:10 | b [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | array_flow.rb:1578:10:1578:10 | b [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1580:10:1580:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1580:10:1580:10 | b [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 | ...[...] | @@ -3287,26 +4078,38 @@ edges | 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:16:1584:28 | call to source : | array_flow.rb:1587:9:1587:9 | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1587:9:1587:9 | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1592:5:1592:5 | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1592:5:1592:5 | a [element 2] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1587:15:1587:15 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1587:15:1587:15 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1592:11:1592:11 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1592:11:1592:11 | b [element 1] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1587:18:1587:18 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1587:18:1587:18 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1592:14:1592:14 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1592:14:1592:14 | c [element 0] : | +| 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:1589:10:1589:10 | d [element 0, element 2] : | -| 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:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [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] : | @@ -3341,18 +4144,24 @@ edges | 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:16:1600:28 | call to source : | array_flow.rb:1602:9:1602:9 | a [element 2] : | -| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1602:9:1602:9 | a [element 2] : | -| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1602:13:1602:13 | b [element 1] : | -| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1602:13:1602:13 | b [element 1] : | +| 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:1603:10:1603:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1603:10:1603:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1605:10:1605:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1605:10:1605:10 | c [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 | ...[...] | @@ -3432,6 +4241,8 @@ edges | 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 : | @@ -3444,6 +4255,8 @@ nodes | 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] : | @@ -3454,6 +4267,8 @@ nodes | 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 : | @@ -3466,6 +4281,8 @@ nodes | 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] : | @@ -3478,6 +4295,8 @@ nodes | 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 : | @@ -3490,8 +4309,12 @@ nodes | 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] : | @@ -3500,10 +4323,16 @@ nodes | 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] : | @@ -3518,8 +4347,12 @@ nodes | 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] : | @@ -3532,10 +4365,18 @@ nodes | 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] : | @@ -3554,8 +4395,12 @@ nodes | 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] : | @@ -3568,8 +4413,15 @@ nodes | 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] : | @@ -3602,14 +4454,24 @@ nodes | 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__0 [element 1] : | semmle.label | __synth__0 [element 1] : | +| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | semmle.label | __synth__0 [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] : | @@ -3622,8 +4484,12 @@ nodes | 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] : | @@ -3636,8 +4502,12 @@ nodes | 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] : | @@ -3646,10 +4516,16 @@ nodes | 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] : | @@ -3664,6 +4540,8 @@ nodes | 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] : | @@ -3742,6 +4620,8 @@ nodes | 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] : | @@ -3750,6 +4630,8 @@ nodes | 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] : | @@ -3758,8 +4640,14 @@ nodes | 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] : | @@ -3792,8 +4680,12 @@ nodes | 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:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | @@ -3812,6 +4704,8 @@ nodes | 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] : | @@ -3822,8 +4716,12 @@ nodes | 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 : | @@ -3834,6 +4732,8 @@ nodes | 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] : | @@ -3842,6 +4742,8 @@ nodes | 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] : | @@ -3850,6 +4752,10 @@ nodes | 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 : | @@ -3866,8 +4772,12 @@ nodes | 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] : | @@ -3882,8 +4792,12 @@ nodes | 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] : | @@ -3904,8 +4818,12 @@ nodes | 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] : | @@ -3920,6 +4838,8 @@ nodes | 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] : | @@ -3934,8 +4854,12 @@ nodes | 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] : | @@ -3950,8 +4874,12 @@ nodes | 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] : | @@ -3960,8 +4888,12 @@ nodes | 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] : | @@ -3976,8 +4908,12 @@ nodes | 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] : | @@ -3994,6 +4930,8 @@ nodes | 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] : | @@ -4002,6 +4940,8 @@ nodes | 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] : | @@ -4010,8 +4950,12 @@ nodes | 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] : | @@ -4020,8 +4964,12 @@ nodes | 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 : | @@ -4030,10 +4978,16 @@ nodes | 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] : | @@ -4048,10 +5002,16 @@ nodes | 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] : | @@ -4070,8 +5030,12 @@ nodes | 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] : | @@ -4098,8 +5062,12 @@ nodes | 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] : | @@ -4108,6 +5076,10 @@ nodes | 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 : | @@ -4124,8 +5096,12 @@ nodes | 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 : | @@ -4138,10 +5114,16 @@ nodes | 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] : | @@ -4152,6 +5134,10 @@ nodes | 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] : | @@ -4174,6 +5160,10 @@ nodes | 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] : | @@ -4188,6 +5178,8 @@ nodes | 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] : | @@ -4196,10 +5188,16 @@ nodes | 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] : | @@ -4214,8 +5212,12 @@ nodes | 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] : | @@ -4228,12 +5230,16 @@ nodes | 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:9:406:7 | ... = ... : | semmle.label | ... = ... : | -| array_flow.rb:404:9:406:7 | ... = ... : | semmle.label | ... = ... : | +| 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 | @@ -4244,6 +5250,8 @@ nodes | 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] : | @@ -4256,8 +5264,12 @@ nodes | 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] : | @@ -4270,8 +5282,12 @@ nodes | 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] : | @@ -4280,6 +5296,8 @@ nodes | 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] : | @@ -4290,8 +5308,12 @@ nodes | 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] : | @@ -4304,8 +5326,12 @@ nodes | 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 : | @@ -4322,8 +5348,12 @@ nodes | 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] : | @@ -4332,10 +5362,16 @@ nodes | 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] : | @@ -4350,12 +5386,16 @@ nodes | 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: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 : | @@ -4364,12 +5404,16 @@ nodes | 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: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] : | @@ -4380,6 +5424,8 @@ nodes | 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] : | @@ -4416,8 +5462,12 @@ nodes | 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] : | @@ -4430,8 +5480,12 @@ nodes | 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] : | @@ -4444,8 +5498,12 @@ nodes | 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] : | @@ -4464,8 +5522,12 @@ nodes | 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 : | @@ -4478,8 +5540,12 @@ nodes | 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] : | @@ -4492,6 +5558,8 @@ nodes | 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] : | @@ -4500,6 +5568,10 @@ nodes | 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 : | @@ -4514,6 +5586,10 @@ nodes | 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] : | @@ -4532,6 +5608,12 @@ nodes | 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] : | @@ -4556,8 +5638,12 @@ nodes | 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] : | @@ -4572,6 +5658,8 @@ nodes | 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] : | @@ -4586,8 +5674,12 @@ nodes | 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] : | @@ -4596,6 +5688,8 @@ nodes | 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] : | @@ -4604,6 +5698,10 @@ nodes | 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] : | @@ -4638,8 +5736,12 @@ nodes | 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] : | @@ -4648,6 +5750,8 @@ nodes | 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] : | @@ -4662,8 +5766,12 @@ nodes | 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] : | @@ -4672,6 +5780,8 @@ nodes | 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] : | @@ -4686,6 +5796,8 @@ nodes | 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] : | @@ -4694,6 +5806,8 @@ nodes | 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] : | @@ -4702,10 +5816,16 @@ nodes | 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] : | @@ -4724,6 +5844,8 @@ nodes | 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] : | @@ -4738,8 +5860,16 @@ nodes | 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] : | @@ -4782,8 +5912,12 @@ nodes | 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] : | @@ -4802,8 +5936,12 @@ nodes | 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] : | @@ -4816,8 +5954,12 @@ nodes | 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] : | @@ -4836,6 +5978,8 @@ nodes | 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] : | @@ -4848,6 +5992,8 @@ nodes | 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] : | @@ -4862,8 +6008,12 @@ nodes | 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] : | @@ -4878,8 +6028,12 @@ nodes | 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] : | @@ -4894,14 +6048,20 @@ nodes | 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: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] : | @@ -4910,6 +6070,8 @@ nodes | 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 : | @@ -4924,6 +6086,8 @@ nodes | 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] : | @@ -4940,8 +6104,12 @@ nodes | 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 : | @@ -4952,6 +6120,8 @@ nodes | 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] : | @@ -4964,14 +6134,20 @@ nodes | 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: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] : | @@ -4980,6 +6156,8 @@ nodes | 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 : | @@ -4994,6 +6172,8 @@ nodes | 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] : | @@ -5010,8 +6190,12 @@ nodes | 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 : | @@ -5022,6 +6206,8 @@ nodes | 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] : | @@ -5034,8 +6220,12 @@ nodes | 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] : | @@ -5048,6 +6238,8 @@ nodes | 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] : | @@ -5068,8 +6260,12 @@ nodes | 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] : | @@ -5086,6 +6282,8 @@ nodes | 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] : | @@ -5094,6 +6292,8 @@ nodes | 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] : | @@ -5102,12 +6302,18 @@ nodes | 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: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] : | @@ -5128,8 +6334,12 @@ nodes | 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] : | @@ -5152,6 +6362,8 @@ nodes | 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] : | @@ -5186,10 +6398,16 @@ nodes | 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] : | @@ -5206,10 +6424,16 @@ nodes | 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] : | @@ -5232,6 +6456,8 @@ nodes | 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] : | @@ -5250,12 +6476,20 @@ nodes | 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] : | @@ -5276,8 +6510,14 @@ nodes | 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] : | @@ -5310,8 +6550,12 @@ nodes | 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] : | @@ -5326,6 +6570,10 @@ nodes | 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 : | @@ -5350,8 +6598,12 @@ nodes | 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] : | @@ -5364,8 +6616,12 @@ nodes | 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] : | @@ -5384,8 +6640,12 @@ nodes | 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] : | @@ -5404,8 +6664,12 @@ nodes | 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] : | @@ -5424,6 +6688,8 @@ nodes | 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] : | @@ -5438,10 +6704,16 @@ nodes | 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] : | @@ -5468,10 +6740,16 @@ nodes | 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] : | @@ -5508,8 +6786,12 @@ nodes | 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] : | @@ -5522,6 +6804,8 @@ nodes | 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] : | @@ -5530,12 +6814,24 @@ nodes | 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] : | @@ -5568,6 +6864,12 @@ nodes | 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] : | @@ -5600,6 +6902,12 @@ nodes | 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] : | @@ -5624,6 +6932,8 @@ nodes | 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] : | @@ -5648,12 +6958,24 @@ nodes | 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] : | @@ -5712,12 +7034,24 @@ nodes | 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] : | @@ -5776,12 +7110,24 @@ nodes | 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] : | @@ -5824,12 +7170,20 @@ nodes | 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] : | @@ -5872,8 +7226,12 @@ nodes | 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] : | @@ -5886,8 +7244,12 @@ nodes | 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] : | @@ -5906,10 +7268,16 @@ nodes | 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] : | @@ -5924,10 +7292,16 @@ nodes | 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] : | @@ -5944,10 +7318,16 @@ nodes | 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] : | @@ -5980,8 +7360,12 @@ nodes | 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] : | @@ -6002,8 +7386,12 @@ nodes | 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] : | @@ -6036,16 +7424,24 @@ nodes | 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: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] : | @@ -6054,6 +7450,10 @@ nodes | 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] : | @@ -6069,6 +7469,10 @@ nodes | 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] : | @@ -6085,6 +7489,8 @@ nodes | 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] : | @@ -6099,6 +7505,8 @@ nodes | 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] : | @@ -6107,6 +7515,8 @@ nodes | 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] : | @@ -6115,6 +7525,8 @@ nodes | 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] : | @@ -6129,6 +7541,8 @@ nodes | 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] : | @@ -6143,6 +7557,8 @@ nodes | 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] : | @@ -6151,6 +7567,8 @@ nodes | 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] : | @@ -6169,10 +7587,16 @@ nodes | 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] : | @@ -6187,10 +7611,18 @@ nodes | 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] : | @@ -6224,10 +7656,18 @@ nodes | 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] : | @@ -6244,10 +7684,16 @@ nodes | 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] : | @@ -6264,10 +7710,16 @@ nodes | 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] : | @@ -6284,10 +7736,16 @@ nodes | 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] : | @@ -6320,10 +7778,16 @@ nodes | 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] : | @@ -6356,10 +7820,16 @@ nodes | 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] : | @@ -6392,10 +7862,16 @@ nodes | 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] : | @@ -6412,10 +7888,16 @@ nodes | 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] : | @@ -6448,6 +7930,8 @@ nodes | 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] : | @@ -6456,6 +7940,8 @@ nodes | 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] : | @@ -6464,6 +7950,8 @@ nodes | 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] : | @@ -6476,8 +7964,12 @@ nodes | 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] : | @@ -6490,6 +7982,8 @@ nodes | 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] : | @@ -6510,8 +8004,12 @@ nodes | 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] : | @@ -6534,8 +8032,12 @@ nodes | 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] : | @@ -6566,8 +8068,12 @@ nodes | 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] : | @@ -6584,8 +8090,12 @@ nodes | 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] : | @@ -6612,6 +8122,8 @@ nodes | 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] : | @@ -6620,10 +8132,18 @@ nodes | 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] : | @@ -6640,6 +8160,8 @@ nodes | 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] : | @@ -6652,6 +8174,10 @@ nodes | 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] : | @@ -6678,6 +8204,10 @@ nodes | 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] : | @@ -6692,8 +8222,12 @@ nodes | 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] : | @@ -6706,8 +8240,12 @@ nodes | 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] : | @@ -6716,8 +8254,12 @@ nodes | 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] : | @@ -6726,12 +8268,24 @@ nodes | 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] : | @@ -6762,12 +8316,20 @@ nodes | 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] : | @@ -6788,10 +8350,16 @@ nodes | 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] : | @@ -6806,6 +8374,8 @@ nodes | 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] : | @@ -6820,10 +8390,16 @@ nodes | 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] : | @@ -6848,10 +8424,16 @@ nodes | 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] : | @@ -6880,6 +8462,8 @@ nodes | 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] : | @@ -6898,10 +8482,18 @@ nodes | 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] : | @@ -6916,6 +8508,8 @@ nodes | 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] : | @@ -6930,6 +8524,8 @@ nodes | 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] : | @@ -6944,6 +8540,10 @@ nodes | 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] : | @@ -6970,12 +8570,24 @@ nodes | 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] : | @@ -7030,10 +8642,16 @@ nodes | 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] : | 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 63405c9785e..db759c1f86a 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected @@ -1,19 +1,27 @@ failures edges -| semantics.rb:2:9:2:18 | call to source : | semantics.rb:3:9:3:9 | a : | -| semantics.rb:2:9:2:18 | call to source : | semantics.rb:3:9:3:9 | a : | +| 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:4:10:4:10 | x | -| semantics.rb:3:9:3:14 | call to s1 : | semantics.rb:4:10:4:10 | x | -| semantics.rb:8:9:8:18 | call to source : | semantics.rb:9:10:9:10 | a : | -| semantics.rb:8:9:8:18 | call to source : | semantics.rb:9:10:9:10 | a : | +| 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:9:14:18 | call to source : | semantics.rb:15:8:15:8 | a : | -| semantics.rb:14:9:14:18 | call to source : | semantics.rb:15:8:15:8 | a : | +| 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 | @@ -22,8 +30,10 @@ edges | 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:9:28:18 | call to source : | semantics.rb:29:8:29:8 | a : | -| semantics.rb:28:9:28:18 | call to source : | semantics.rb:29:8:29:8 | a : | +| 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 : | @@ -32,8 +42,10 @@ edges | 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:9:40:18 | call to source : | semantics.rb:41:8:41:8 | a : | -| semantics.rb:40:9:40:18 | call to source : | semantics.rb:41:8:41:8 | a : | +| 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 | @@ -50,16 +62,18 @@ edges | 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:9:60:18 | call to source : | semantics.rb:61:14:61:14 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:61:14:61:14 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:62:17:62:17 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:62:17:62:17 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:63:19:63:19 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:63:19:63:19 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:64:27:64:27 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:64:27:64:27 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:66:14:66:15 | &... : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:66:14:66:15 | &... : | +| 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 | @@ -70,8 +84,10 @@ edges | 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:9:80:18 | call to source : | semantics.rb:81:5:81:5 | a : | -| semantics.rb:80:9:80:18 | call to source : | semantics.rb:81:5:81:5 | a : | +| 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 : | @@ -84,18 +100,22 @@ edges | 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:9:89:18 | call to source : | semantics.rb:91:19:91:19 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:91:19:91:19 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:92:27:92:27 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:92:27:92:27 | a : | +| 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:9:97:18 | call to source : | semantics.rb:98:5:98:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:98:5:98:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:99:5:99:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:99:5:99: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: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 | @@ -108,20 +128,27 @@ edges | 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:9:107:18 | call to source : | semantics.rb:109:14:109:16 | ** ... : | -| semantics.rb:107:9:107:18 | call to source : | semantics.rb:110:28:110:30 | ** ... : | +| 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:9:114:18 | call to source : | semantics.rb:116:14:116:14 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:116:14:116:14 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:119:17:119:17 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:119:17:119:17 | a : | -| semantics.rb:115:9:115:18 | call to source : | semantics.rb:121:17:121:17 | b : | -| semantics.rb:115:9:115:18 | call to source : | semantics.rb:121:17:121:17 | b : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:117:16:117:16 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:117:16:117:16 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:121:22:121:22 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:121:22:121:22 | h [element :a] : | +| 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] : | @@ -134,34 +161,46 @@ edges | 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:9:125:18 | call to source : | semantics.rb:126:9:126:9 | a : | -| semantics.rb:125:9:125:18 | call to source : | semantics.rb:126:9:126:9 | 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:9:141:18 | call to source : | semantics.rb:145:5:145:5 | [post] h [element] : | -| semantics.rb:141:9:141:18 | call to source : | 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: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:9:151:18 | call to source : | semantics.rb:152:13:152:13 | a : | -| semantics.rb:151:9:151:18 | call to source : | 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:152:9:152:14 | call to s20 [element] : | semantics.rb:153:10:153:10 | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:154:10:154:10 | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:154:10:154:10 | x [element] : | +| 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:9:158:18 | call to source : | semantics.rb:162:5:162:5 | [post] h [element 0] : | -| semantics.rb:158:9:158:18 | call to source : | semantics.rb:162:5:162:5 | [post] h [element 0] : | -| semantics.rb:159:9:159:18 | call to source : | semantics.rb:163:5:163:5 | [post] h [element] : | -| semantics.rb:159:9:159:18 | call to source : | semantics.rb:163:5:163:5 | [post] h [element] : | +| 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] : | @@ -170,20 +209,26 @@ edges | 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:9:169:18 | call to source : | semantics.rb:170:13:170:13 | a : | -| semantics.rb:169:9:169:18 | call to source : | 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:170:9:170:14 | call to s22 [element] : | semantics.rb:171:10:171:10 | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:172:10:172:10 | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:172:10:172:10 | x [element] : | +| 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:9:176:18 | call to source : | semantics.rb:179:5:179:5 | [post] h [element 0] : | -| semantics.rb:176:9:176:18 | call to source : | 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: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] : | @@ -192,20 +237,26 @@ edges | 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:9:185:18 | call to source : | semantics.rb:186:13:186:13 | a : | -| semantics.rb:185:9:185:18 | call to source : | 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:186:9:186:14 | call to s24 [element 0] : | semantics.rb:187:10:187:10 | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | +| 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:9:193:18 | call to source : | semantics.rb:196:5:196:5 | [post] h [element 0] : | -| semantics.rb:193:9:193:18 | call to source : | 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: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] : | @@ -214,24 +265,34 @@ edges | 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:9:202:18 | call to source : | semantics.rb:203:13:203:13 | a : | -| semantics.rb:202:9:202:18 | call to source : | 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:203:9:203:14 | call to s26 [element 0] : | semantics.rb:204:10:204:10 | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | +| 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:9:211:18 | call to source : | semantics.rb:217:5:217:5 | [post] h [element 1] : | -| semantics.rb:211:9:211:18 | call to source : | semantics.rb:217:5:217:5 | [post] h [element 1] : | -| semantics.rb:212:9:212:18 | call to source : | semantics.rb:218:5:218:5 | [post] h [element 2] : | -| semantics.rb:212:9:212:18 | call to source : | semantics.rb:218:5:218:5 | [post] h [element 2] : | -| semantics.rb:213:9:213:18 | call to source : | semantics.rb:219:5:219:5 | [post] h [element] : | -| semantics.rb:213:9:213:18 | call to source : | semantics.rb:219:5:219:5 | [post] h [element] : | +| 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] : | @@ -248,10 +309,38 @@ edges | 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:235:9:235:18 | call to source : | semantics.rb:240:5:240:5 | [post] h [element 1] : | -| semantics.rb:235:9:235:18 | call to source : | semantics.rb:240:5:240:5 | [post] h [element 1] : | -| semantics.rb:236:9:236:18 | call to source : | semantics.rb:241:5:241:5 | [post] h [element 2] : | -| semantics.rb:236:9:236:18 | call to source : | semantics.rb:241:5:241:5 | [post] h [element 2] : | +| 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] : | @@ -264,16 +353,20 @@ edges | 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:9:248:18 | call to source : | semantics.rb:249:13:249:13 | a : | -| semantics.rb:248:9:248:18 | call to source : | 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:249:9:249:14 | call to s30 [element] : | semantics.rb:250:10:250:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:251:10:251:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:251:10:251:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:252:10:252:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:252:10:252:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:253:10:253:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:253:10:253:10 | x [element] : | +| 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 | ...[...] | @@ -372,30 +465,36 @@ edges | 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:9:289:24 | call to s35 [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:292:10:292:10 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:292:10:292: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: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:9:296:24 | call to s36 [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:300:10:300:10 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:300:10:300: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: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:9:304:24 | call to s37 [element true] : | semantics.rb:306:10:306:10 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:306:10:306:10 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:308:10:308:10 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:308:10:308: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: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 | ...[...] | @@ -408,10 +507,12 @@ edges | 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:9:319:24 | call to s39 [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:322:10:322:10 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:322:10:322: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: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 | ...[...] | @@ -424,8 +525,10 @@ edges | 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:9:333:24 | call to s41 [@foo] : | semantics.rb:334:10:334:10 | x [@foo] : | -| semantics.rb:333:9:333:24 | call to s41 [@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: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 | @@ -438,16 +541,20 @@ edges | 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:9:342:14 | call to s42 [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:344:10:344:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:344:10:344:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:345:10:345:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:345:10:345:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:346:10:346:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:346:10:346:10 | x [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] : | @@ -466,10 +573,12 @@ edges | 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:9:353:14 | call to s43 [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:357:10:357:10 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:357:10:357: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: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 | ...[...] | @@ -596,10 +705,12 @@ edges | 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:9:397:14 | call to s46 [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:401:10:401:10 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:401:10:401: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: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 | ...[...] | @@ -634,8 +745,10 @@ edges | 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:9:412:14 | call to s47 [element :bar] : | semantics.rb:415:10:415:10 | x [element :bar] : | -| semantics.rb:412:9:412:14 | call to s47 [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: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 | ...[...] | @@ -668,8 +781,10 @@ edges | 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:9:426:14 | call to s48 [element :bar] : | semantics.rb:429:10:429:10 | x [element :bar] : | -| semantics.rb:426:9:426:14 | call to s48 [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: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 | ...[...] | @@ -704,12 +819,16 @@ edges | 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:9:440:14 | call to s49 [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:442:10:442:10 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:442:10:442:10 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:443:10:443:10 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:443:10:443:10 | x [element] : | +| 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] : | @@ -862,10 +981,12 @@ edges | 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:499:10:499:10 | x [element :bar] : | -| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semantics.rb:499:10:499:10 | 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: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 | @@ -898,21 +1019,29 @@ edges | 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:515:10:515:10 | x [element :bar] : | -| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semantics.rb:515:10:515:10 | 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: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: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 : | @@ -921,6 +1050,8 @@ nodes | 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 : | @@ -937,6 +1068,8 @@ nodes | 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 : | @@ -949,6 +1082,8 @@ nodes | 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 : | @@ -977,6 +1112,8 @@ nodes | 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:61:10:61:15 | call to s10 | semmle.label | call to s10 | @@ -999,6 +1136,8 @@ nodes | 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 : | @@ -1015,6 +1154,8 @@ nodes | 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:91:10:91:20 | call to s13 | semmle.label | call to s13 | @@ -1025,6 +1166,8 @@ nodes | 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 : | @@ -1043,15 +1186,22 @@ nodes | 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:109:10:109:17 | call to s15 | semmle.label | call to s15 | | 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:117:10:117:17 | call to s16 | semmle.label | call to s16 | @@ -1072,6 +1222,8 @@ nodes | 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 : | @@ -1080,6 +1232,8 @@ nodes | 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] : | @@ -1088,8 +1242,12 @@ nodes | 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 : | @@ -1102,8 +1260,12 @@ nodes | 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] : | @@ -1116,8 +1278,12 @@ nodes | 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 : | @@ -1130,6 +1296,8 @@ nodes | 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] : | @@ -1142,8 +1310,12 @@ nodes | 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 : | @@ -1156,6 +1328,8 @@ nodes | 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] : | @@ -1168,8 +1342,12 @@ nodes | 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 : | @@ -1182,10 +1360,16 @@ nodes | 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] : | @@ -1206,8 +1390,38 @@ nodes | 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: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: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: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] : | @@ -1224,8 +1438,12 @@ nodes | 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 : | @@ -1340,6 +1558,8 @@ nodes | 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 : | @@ -1352,6 +1572,8 @@ nodes | 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 : | @@ -1364,6 +1586,8 @@ nodes | 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 : | @@ -1384,6 +1608,8 @@ nodes | 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 : | @@ -1404,6 +1630,8 @@ nodes | 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 : | @@ -1420,6 +1648,10 @@ nodes | 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] : | @@ -1448,6 +1680,8 @@ nodes | 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] : | @@ -1572,6 +1806,8 @@ nodes | 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] : | @@ -1612,6 +1848,8 @@ nodes | 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] : | @@ -1648,6 +1886,8 @@ nodes | 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] : | @@ -1684,6 +1924,10 @@ nodes | 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] : | @@ -1848,6 +2092,8 @@ nodes | 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] : | @@ -1888,6 +2134,8 @@ nodes | 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] : | diff --git a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb index 4424893a9b5..5ec554aed48 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb @@ -224,10 +224,10 @@ end def m28(i) a = source "a" x = s28(a) - sink x[0] - sink x[1] # $ MISSING: hasValueFlow=a - sink x[2] # $ MISSING: hasValueFlow=a - sink x[i] # $ MISSING: hasValueFlow=a + sink x[0] # $ SPURIOUS: hasValueFlow=a + sink x[1] # $ hasValueFlow=a + sink x[2] # $ hasValueFlow=a + sink x[i] # $ hasValueFlow=a end def m29(i) diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index a6dd85ee0a1..ef1eb189de9 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -207,8 +207,10 @@ edges | 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:9:116:26 | call to new [@field] : | instance_variables.rb:117:6:117:10 | foo15 [@field] : | -| instance_variables.rb:116:9:116:26 | call to new [@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: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] : | @@ -227,8 +229,10 @@ edges | 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:7:121:24 | call to new : | instance_variables.rb:122:6:122:8 | bar | -| instance_variables.rb:121:7:121:24 | call to new : | 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: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 : | @@ -424,6 +428,8 @@ nodes | 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 : | @@ -442,6 +448,8 @@ nodes | 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:122:6:122:8 | bar | semmle.label | bar | 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 2dc14a20525..57c6d4c0627 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,10 +1,15 @@ failures edges -| hash_flow.rb:11:15:11:24 | call to taint : | hash_flow.rb:22:10:22:13 | hash [element :a] : | -| hash_flow.rb:13:12:13:21 | call to taint : | hash_flow.rb:24:10:24:13 | hash [element :c] : | -| hash_flow.rb:15:14:15:23 | call to taint : | hash_flow.rb:26:10:26:13 | hash [element e] : | -| hash_flow.rb:17:16:17:25 | call to taint : | hash_flow.rb:28:10:28:13 | hash [element g] : | -| hash_flow.rb:19:14:19:23 | call to taint : | hash_flow.rb:30:10:30:13 | hash [element 0] : | +| 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 | ...[...] | @@ -37,161 +42,214 @@ edges | 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:13:55:37 | ...[...] [element :a] : | hash_flow.rb:56:10:56:14 | hash1 [element :a] : | +| 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:13:59:22 | call to taint : | 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: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:13:64:45 | ...[...] [element] : | hash_flow.rb:65:10:65:14 | hash3 [element] : | -| hash_flow.rb:64:13:64:45 | ...[...] [element] : | hash_flow.rb:66:10:66:14 | hash3 [element] : | +| 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:13:68:39 | ...[...] [element :a] : | hash_flow.rb:69:10:69:14 | hash4 [element :a] : | +| 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:13:72:45 | ...[...] [element a] : | hash_flow.rb:73:10:73:14 | hash5 [element a] : | +| 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:13:76:47 | ...[...] [element a] : | hash_flow.rb:77:10:77:14 | hash6 [element a] : | +| 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:13:84:42 | call to [] [element :a] : | hash_flow.rb:85:10:85:14 | hash1 [element :a] : | +| 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:93:15:93:24 | call to taint : | 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: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:21:105:30 | call to taint : | hash_flow.rb:106:10:106:10 | b | +| 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:115:10:115:10 | b | +| 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:121:10:121:10 | c | +| 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:128:15:128:24 | call to taint : | hash_flow.rb:131:5:131:8 | hash [element :a] : | -| hash_flow.rb:128:15:128:24 | call to taint : | hash_flow.rb:134:5:134:8 | hash [element :a] : | +| 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:144:15:144:25 | call to taint : | hash_flow.rb:147:9:147:12 | hash [element :a] : | -| hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:151:9:151:12 | hash [element :a] : | +| 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:149:10:149:10 | b [element 1] : | -| hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | hash_flow.rb:150:10:150:10 | b [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:152:10:152:10 | c [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:170:15:170:25 | call to taint : | hash_flow.rb:173:9:173:12 | hash [element :a] : | +| 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:174:10:174:10 | a [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:182:15:182:25 | call to taint : | hash_flow.rb:185:9:185:12 | hash [element :a] : | +| 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:186:10:186:10 | a | -| hash_flow.rb:194:15:194:25 | call to taint : | hash_flow.rb:197:9:197:12 | hash [element :a] : | +| 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:201:10:201:10 | a [element :a] : | +| 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:210:15:210:25 | call to taint : | hash_flow.rb:217:10:217:13 | hash [element :a] : | -| hash_flow.rb:213:19:213:29 | call to taint : | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | +| 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:227:15:227:25 | call to taint : | hash_flow.rb:230:9:230:12 | hash [element :a] : | +| 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:234:10:234:10 | x [element :a] : | +| 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:242:15:242:25 | call to taint : | hash_flow.rb:245:9:245:12 | hash [element :a] : | +| 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:248:10:248:10 | x [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:256:15:256:25 | call to taint : | hash_flow.rb:259:9:259:12 | hash [element :a] : | +| 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:263:10:263:10 | x [element :a] : | +| 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:271:15:271:25 | call to taint : | hash_flow.rb:274:9:274:12 | hash [element :a] : | +| 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:277:10:277:10 | x [element :a] : | +| 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:287:15:287:25 | call to taint : | hash_flow.rb:290:9:290:12 | hash [element :c] : | +| 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:293:10:293:10 | x [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:301:15:301:25 | call to taint : | hash_flow.rb:305:9:305:12 | hash [element :a] : | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:309:9:309:12 | hash [element :a] : | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:311:9:311:12 | hash [element :a] : | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:315:9:315:12 | hash [element :a] : | -| hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:305:9:305:12 | hash [element :c] : | -| hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:315:9:315:12 | hash [element :c] : | +| 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:308:10:308:10 | b | +| 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:310:10:310:10 | b | +| 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:312:10:312:10 | b | +| 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:9:313:35 | call to fetch : | hash_flow.rb:314:10:314:10 | b | +| 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:316:10:316:10 | b | +| 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:323:15:323:25 | call to taint : | hash_flow.rb:327:9:327:12 | hash [element :a] : | -| hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:332:9:332:12 | hash [element :a] : | -| hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:334:9:334:12 | hash [element :a] : | -| hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:327:9:327:12 | hash [element :c] : | -| hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:334:9:334:12 | hash [element :c] : | +| 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:331:10:331:10 | b [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:333:10:333:10 | b [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:335:10:335:10 | b [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:342:15:342:25 | call to taint : | hash_flow.rb:346:9:346:12 | hash [element :a] : | -| hash_flow.rb:344:15:344:25 | call to taint : | hash_flow.rb:346:9:346:12 | hash [element :c] : | +| 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:351:11:351:11 | b [element :a] : | +| 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:358:15:358:25 | call to taint : | hash_flow.rb:362:5:362:8 | hash [element :a] : | -| hash_flow.rb:360:15:360:25 | call to taint : | hash_flow.rb:362:5:362:8 | hash [element :c] : | +| 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 : | @@ -199,40 +257,54 @@ edges | 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:374:15:374:25 | call to taint : | hash_flow.rb:378:9:378:12 | hash [element :a] : | -| hash_flow.rb:376:15:376:25 | call to taint : | hash_flow.rb:378:9:378:12 | hash [element :c] : | +| 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:379:11:379:11 | b [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:386:15:386:25 | call to taint : | hash_flow.rb:390:9:390:12 | hash [element :a] : | -| hash_flow.rb:388:15:388:25 | call to taint : | hash_flow.rb:390:9:390:12 | hash [element :c] : | +| 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:396:11:396:11 | b [element :a] : | +| 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:403:15:403:25 | call to taint : | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | -| hash_flow.rb:405:15:405:25 | call to taint : | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | -| hash_flow.rb:408:15:408:25 | call to taint : | hash_flow.rb:412:24:412:28 | hash2 [element :d] : | -| hash_flow.rb:410:15:410:25 | call to taint : | hash_flow.rb:412:24:412:28 | hash2 [element :f] : | +| 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:417:11:417:14 | hash [element :a] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :c] : | hash_flow.rb:419:11:419:14 | hash [element :c] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :d] : | hash_flow.rb:420:11:420:14 | hash [element :d] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :f] : | hash_flow.rb:422:11:422:14 | hash [element :f] : | +| 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 : | @@ -249,10 +321,18 @@ edges | 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:429:15:429:25 | call to taint : | hash_flow.rb:438:12:438:16 | hash1 [element :a] : | -| hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:438:12:438:16 | hash1 [element :c] : | -| hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:438:25:438:29 | hash2 [element :d] : | -| hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:438:25:438:29 | hash2 [element :f] : | +| 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] : | @@ -265,10 +345,10 @@ edges | 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:443:11:443:14 | hash [element :a] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :c] : | hash_flow.rb:445:11:445:14 | hash [element :c] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :d] : | hash_flow.rb:446:11:446:14 | hash [element :d] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :f] : | hash_flow.rb:448:11:448:14 | hash [element :f] : | +| 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 : | @@ -295,27 +375,35 @@ edges | 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:462:15:462:25 | call to taint : | hash_flow.rb:465:9:465:12 | hash [element :a] : | +| 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:467:10:467:10 | b [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:474:15:474:25 | call to taint : | hash_flow.rb:477:9:477:12 | hash [element :a] : | +| 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:482:10:482:10 | b [element :a] : | +| 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:489:15:489:25 | call to taint : | hash_flow.rb:492:9:492:12 | hash [element :a] : | +| 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:497:10:497:10 | b [element :a] : | +| 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:505:15:505:25 | call to taint : | hash_flow.rb:512:19:512:22 | hash [element :a] : | -| hash_flow.rb:507:15:507:25 | call to taint : | hash_flow.rb:512:19:512:22 | hash [element :c] : | +| 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] : | @@ -324,17 +412,22 @@ edges | 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:520:15:520:25 | call to taint : | hash_flow.rb:524:9:524:12 | hash [element :a] : | -| hash_flow.rb:522:15:522:25 | call to taint : | hash_flow.rb:524:9:524:12 | hash [element :c] : | +| 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:529:11:529:11 | b [element :a] : | +| 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:536:15:536:25 | call to taint : | hash_flow.rb:540:5:540:8 | hash [element :a] : | -| hash_flow.rb:538:15:538:25 | call to taint : | hash_flow.rb:540:5:540:8 | hash [element :c] : | +| 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 : | @@ -342,74 +435,95 @@ edges | 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:552:15:552:25 | call to taint : | hash_flow.rb:556:9:556:12 | hash [element :a] : | -| hash_flow.rb:554:15:554:25 | call to taint : | hash_flow.rb:556:9:556:12 | hash [element :c] : | +| 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:559:11:559:11 | b [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:566:15:566:25 | call to taint : | hash_flow.rb:570:9:570:12 | hash [element :a] : | -| hash_flow.rb:566:15:566:25 | call to taint : | hash_flow.rb:575:9:575:12 | hash [element :a] : | -| hash_flow.rb:568:15:568:25 | call to taint : | hash_flow.rb:575:9:575:12 | hash [element :c] : | +| 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:571:11:571:11 | b [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:576:11:576:11 | c [element :a] : | -| hash_flow.rb:575:9:575:25 | call to slice [element :c] : | hash_flow.rb:578:11:578:11 | c [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:585:15:585:25 | call to taint : | hash_flow.rb:589:9:589:12 | hash [element :a] : | -| hash_flow.rb:587:15:587:25 | call to taint : | hash_flow.rb:589:9:589:12 | hash [element :c] : | +| 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:591:11:591:11 | 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:598:15:598:25 | call to taint : | hash_flow.rb:602:9:602:12 | hash [element :a] : | -| hash_flow.rb:598:15:598:25 | call to taint : | hash_flow.rb:607:9:607:12 | hash [element :a] : | -| hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:602:9:602:12 | hash [element :c] : | -| hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:607:9:607:12 | hash [element :c] : | +| 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:603:11:603:11 | a [element :a] : | -| hash_flow.rb:602:9:602:17 | call to to_h [element :c] : | hash_flow.rb:605:11:605:11 | a [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:612:11:612:11 | b [element] : | +| 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:619:15:619:25 | call to taint : | hash_flow.rb:623:9:623:12 | hash [element :a] : | -| hash_flow.rb:621:15:621:25 | call to taint : | hash_flow.rb:623:9:623:12 | hash [element :c] : | +| 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:624:11:624:11 | a [element] : | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | hash_flow.rb:625:11:625:11 | a [element] : | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | hash_flow.rb:626:11:626:11 | a [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:633:15:633:25 | call to taint : | hash_flow.rb:639:5:639:8 | hash [element :a] : | -| hash_flow.rb:635:15:635:25 | call to taint : | hash_flow.rb:639:5:639:8 | hash [element :c] : | +| 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] : | @@ -427,20 +541,25 @@ edges | 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:649:15:649:25 | call to taint : | hash_flow.rb:653:9:653:12 | hash [element :a] : | -| hash_flow.rb:649:15:649:25 | call to taint : | hash_flow.rb:657:11:657:14 | hash [element :a] : | -| hash_flow.rb:651:15:651:25 | call to taint : | hash_flow.rb:653:9:653:12 | hash [element :c] : | +| 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:658:11:658:11 | b [element] : | +| 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:665:15:665:25 | call to taint : | hash_flow.rb:669:5:669:8 | hash [element :a] : | -| hash_flow.rb:667:15:667:25 | call to taint : | hash_flow.rb:669:5:669:8 | hash [element :c] : | +| 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 : | @@ -448,10 +567,18 @@ edges | 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:680:15:680:25 | call to taint : | hash_flow.rb:689:12:689:16 | hash1 [element :a] : | -| hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:689:12:689:16 | hash1 [element :c] : | -| hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:689:25:689:29 | hash2 [element :d] : | -| hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:689:25:689:29 | hash2 [element :f] : | +| 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] : | @@ -464,10 +591,10 @@ edges | 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:694:11:694:14 | hash [element :a] : | -| hash_flow.rb:689:12:693:7 | call to update [element :c] : | hash_flow.rb:696:11:696:14 | hash [element :c] : | -| hash_flow.rb:689:12:693:7 | call to update [element :d] : | hash_flow.rb:697:11:697:14 | hash [element :d] : | -| hash_flow.rb:689:12:693:7 | call to update [element :f] : | hash_flow.rb:699:11:699:14 | hash [element :f] : | +| 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 : | @@ -494,34 +621,50 @@ edges | 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:713:15:713:25 | call to taint : | hash_flow.rb:717:9:717:12 | hash [element :a] : | -| hash_flow.rb:715:15:715:25 | call to taint : | hash_flow.rb:717:9:717:12 | hash [element :c] : | +| 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:718:11:718:11 | a [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:725:15:725:25 | call to taint : | hash_flow.rb:729:9:729:12 | hash [element :a] : | -| hash_flow.rb:725:15:725:25 | call to taint : | hash_flow.rb:731:9:731:12 | hash [element :a] : | -| hash_flow.rb:727:15:727:25 | call to taint : | hash_flow.rb:731:9:731:12 | hash [element :c] : | +| 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:730:10:730:10 | b [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:732:10:732:10 | b [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:739:15:739:25 | call to taint : | hash_flow.rb:748:16:748:20 | hash1 [element :a] : | -| hash_flow.rb:741:15:741:25 | call to taint : | hash_flow.rb:748:16:748:20 | hash1 [element :c] : | -| hash_flow.rb:744:15:744:25 | call to taint : | hash_flow.rb:748:44:748:48 | hash2 [element :d] : | -| hash_flow.rb:746:15:746:25 | call to taint : | hash_flow.rb:748:44:748:48 | hash2 [element :f] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :a] : | hash_flow.rb:749:10:749:13 | hash [element :a] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :c] : | hash_flow.rb:751:10:751:13 | hash [element :c] : | +| 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:755:10:755:13 | hash [element :g] : | -| hash_flow.rb:748:42:748:48 | ** ... [element :d] : | hash_flow.rb:752:10:752:13 | hash [element :d] : | -| hash_flow.rb:748:42:748:48 | ** ... [element :f] : | hash_flow.rb:754:10:754:13 | hash [element :f] : | +| 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 | ...[...] | @@ -529,33 +672,45 @@ edges | 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:763:15:763:25 | call to taint : | hash_flow.rb:769:10:769:13 | hash [element :a] : | -| hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:771:10:771:13 | hash [element :c] : | -| hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:774:9:774:12 | hash [element :c] : | -| hash_flow.rb:766:15:766:25 | call to taint : | hash_flow.rb:772:10:772:13 | hash [element :d] : | +| 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:778:10:778:10 | x [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:791:15:791:25 | call to taint : | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | -| hash_flow.rb:793:15:793:25 | call to taint : | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | -| hash_flow.rb:796:15:796:25 | call to taint : | hash_flow.rb:800:29:800:33 | hash2 [element :d] : | -| hash_flow.rb:798:15:798:25 | call to taint : | hash_flow.rb:800:29:800:33 | hash2 [element :f] : | +| 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:805:11:805:14 | hash [element :a] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] : | hash_flow.rb:807:11:807:14 | hash [element :c] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] : | hash_flow.rb:808:11:808:14 | hash [element :d] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] : | hash_flow.rb:810:11:810:14 | hash [element :f] : | +| 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 : | @@ -572,10 +727,18 @@ edges | 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:817:15:817:25 | call to taint : | hash_flow.rb:826:12:826:16 | hash1 [element :a] : | -| hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:826:12:826:16 | hash1 [element :c] : | -| hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:826:30:826:34 | hash2 [element :d] : | -| hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:826:30:826:34 | hash2 [element :f] : | +| 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] : | @@ -588,10 +751,10 @@ edges | 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:831:11:831:14 | hash [element :a] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] : | hash_flow.rb:833:11:833:14 | hash [element :c] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] : | hash_flow.rb:834:11:834:14 | hash [element :d] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] : | hash_flow.rb:836:11:836:14 | hash [element :f] : | +| 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 : | @@ -618,20 +781,28 @@ edges | 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:850:12:850:22 | call to taint : | hash_flow.rb:860:13:860:17 | hash1 [element :a] : | -| hash_flow.rb:850:12:850:22 | call to taint : | hash_flow.rb:869:13:869:17 | hash1 [element :a] : | -| hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:860:13:860:17 | hash1 [element :c] : | -| hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:869:13:869:17 | hash1 [element :c] : | -| hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:860:33:860:37 | hash2 [element :d] : | -| hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:869:33:869:37 | hash2 [element :d] : | -| hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:860:33:860:37 | hash2 [element :f] : | -| hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:869:33:869:37 | hash2 [element :f] : | +| 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:861:11:861:15 | hash3 [element :a] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] : | hash_flow.rb:863:11:863:15 | hash3 [element :c] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] : | hash_flow.rb:864:11:864:15 | hash3 [element :d] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] : | hash_flow.rb:866:11:866:15 | hash3 [element :f] : | +| 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 | ...[...] : | @@ -642,12 +813,16 @@ edges | 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:870:11:870:15 | hash4 [element :a] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] : | hash_flow.rb:872:11:872:15 | hash4 [element :c] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] : | hash_flow.rb:873:11:873:15 | hash4 [element :d] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] : | hash_flow.rb:875:11:875:15 | hash4 [element :f] : | +| 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 | ...[...] : | @@ -658,10 +833,18 @@ edges | 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:882:12:882:22 | call to taint : | hash_flow.rb:892:12:892:16 | hash1 [element :a] : | -| hash_flow.rb:884:12:884:22 | call to taint : | hash_flow.rb:892:12:892:16 | hash1 [element :c] : | -| hash_flow.rb:887:12:887:22 | call to taint : | hash_flow.rb:892:33:892:37 | hash2 [element :d] : | -| hash_flow.rb:889:12:889:22 | call to taint : | hash_flow.rb:892:33:892:37 | hash2 [element :f] : | +| 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] : | @@ -670,10 +853,10 @@ edges | 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:893:11:893:14 | hash [element :a] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] : | hash_flow.rb:895:11:895:14 | hash [element :c] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] : | hash_flow.rb:896:11:896:14 | hash [element :d] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] : | hash_flow.rb:898:11:898:14 | hash [element :f] : | +| 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] : | @@ -694,10 +877,18 @@ edges | 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:912:12:912:22 | call to taint : | hash_flow.rb:922:12:922:16 | hash1 [element :a] : | -| hash_flow.rb:914:12:914:22 | call to taint : | hash_flow.rb:922:12:922:16 | hash1 [element :c] : | -| hash_flow.rb:917:12:917:22 | call to taint : | hash_flow.rb:922:33:922:37 | hash2 [element :d] : | -| hash_flow.rb:919:12:919:22 | call to taint : | hash_flow.rb:922:33:922:37 | hash2 [element :f] : | +| 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] : | @@ -706,10 +897,10 @@ edges | 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:923:11:923:14 | hash [element :a] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] : | hash_flow.rb:925:11:925:14 | hash [element :c] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] : | hash_flow.rb:926:11:926:14 | hash [element :d] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] : | hash_flow.rb:928:11:928:14 | hash [element :f] : | +| 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] : | @@ -730,10 +921,18 @@ edges | 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:942:12:942:22 | call to taint : | hash_flow.rb:952:12:952:16 | hash1 [element :a] : | -| hash_flow.rb:944:12:944:22 | call to taint : | hash_flow.rb:952:12:952:16 | hash1 [element :c] : | -| hash_flow.rb:947:12:947:22 | call to taint : | hash_flow.rb:952:33:952:37 | hash2 [element :d] : | -| hash_flow.rb:949:12:949:22 | call to taint : | hash_flow.rb:952:33:952:37 | hash2 [element :f] : | +| 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] : | @@ -742,10 +941,10 @@ edges | 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:953:11:953:14 | hash [element :a] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] : | hash_flow.rb:955:11:955:14 | hash [element :c] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] : | hash_flow.rb:956:11:956:14 | hash [element :d] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] : | hash_flow.rb:958:11:958:14 | hash [element :f] : | +| 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] : | @@ -767,6 +966,11 @@ edges | 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 : | @@ -812,50 +1016,64 @@ nodes | 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: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: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: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: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: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: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: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: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: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: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: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: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 : | @@ -864,6 +1082,7 @@ nodes | 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 : | @@ -871,27 +1090,36 @@ nodes | 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: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: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: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: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: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] : | @@ -901,45 +1129,60 @@ nodes | 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: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: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: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: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: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: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: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: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: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: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: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 : | @@ -947,23 +1190,30 @@ nodes | 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: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: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: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: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] : | @@ -973,17 +1223,22 @@ nodes | 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: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: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] : | @@ -992,6 +1247,8 @@ nodes | 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] : | @@ -1002,16 +1259,22 @@ nodes | 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: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] : | @@ -1024,10 +1287,18 @@ nodes | 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] : | @@ -1052,10 +1323,18 @@ nodes | 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] : | @@ -1096,19 +1375,25 @@ nodes | 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: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: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: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] : | @@ -1118,6 +1403,8 @@ nodes | 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: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] : | @@ -1130,8 +1417,11 @@ nodes | 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] : | @@ -1140,6 +1430,8 @@ nodes | 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] : | @@ -1150,8 +1442,11 @@ nodes | 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] : | @@ -1162,13 +1457,18 @@ nodes | 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: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] : | @@ -1179,8 +1479,11 @@ nodes | 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] : | @@ -1188,8 +1491,12 @@ nodes | 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] : | @@ -1200,6 +1507,7 @@ nodes | 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] : | @@ -1209,8 +1517,11 @@ nodes | 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] : | @@ -1223,6 +1534,8 @@ nodes | 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] : | @@ -1240,8 +1553,11 @@ nodes | 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] : | @@ -1254,6 +1570,8 @@ nodes | 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] : | @@ -1265,10 +1583,18 @@ nodes | 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] : | @@ -1309,29 +1635,45 @@ nodes | 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: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: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: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] : | @@ -1351,6 +1693,9 @@ nodes | 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: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 : | @@ -1360,6 +1705,7 @@ nodes | 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: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] : | @@ -1367,10 +1713,18 @@ nodes | 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: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] : | @@ -1395,10 +1749,18 @@ nodes | 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] : | @@ -1439,10 +1801,18 @@ nodes | 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] : | @@ -1463,6 +1833,10 @@ nodes | 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] : | @@ -1483,10 +1857,18 @@ nodes | 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] : | @@ -1523,10 +1905,18 @@ nodes | 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] : | @@ -1563,10 +1953,18 @@ nodes | 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] : | diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index 2e1948ff2d7..60f62362f75 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -1,107 +1,107 @@ | UseUseExplosion.rb:18:5:22:7 | self (m) | UseUseExplosion.rb:20:13:20:17 | self | | UseUseExplosion.rb:18:5:22:7 | self in m | UseUseExplosion.rb:18:5:22:7 | self (m) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2111:20:2111 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2127:20:2127 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2143:20:2143 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2159:20:2159 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2175:20:2175 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2191:20:2191 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2207:20:2207 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2223:20:2223 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2239:20:2239 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2255:20:2255 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2271:20:2271 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2287:20:2287 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2303:20:2303 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2319:20:2319 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2335:20:2335 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2351:20:2351 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2367:20:2367 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2383:20:2383 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2399:20:2399 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2415:20:2415 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2431:20:2431 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2447:20:2447 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2463:20:2463 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2479:20:2479 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2495:20:2495 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2511:20:2511 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2527:20:2527 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2543:20:2543 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2559:20:2559 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2575:20:2575 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2591:20:2591 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2607:20:2607 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2623:20:2623 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2639:20:2639 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2655:20:2655 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2671:20:2671 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2687:20:2687 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2703:20:2703 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2719:20:2719 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2735:20:2735 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2751:20:2751 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2767:20:2767 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2783:20:2783 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2799:20:2799 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2815:20:2815 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2831:20:2831 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2847:20:2847 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2863:20:2863 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2879:20:2879 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2895:20:2895 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2911:20:2911 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2927:20:2927 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2943:20:2943 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2959:20:2959 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2975:20:2975 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2991:20:2991 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3007:20:3007 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3023:20:3023 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3039:20:3039 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3055:20:3055 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3071:20:3071 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3087:20:3087 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3103:20:3103 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3119:20:3119 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3135:20:3135 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3151:20:3151 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3167:20:3167 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3183:20:3183 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3199:20:3199 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3215:20:3215 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3231:20:3231 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3247:20:3247 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3263:20:3263 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3279:20:3279 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3295:20:3295 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3311:20:3311 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3327:20:3327 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3343:20:3343 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3359:20:3359 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3375:20:3375 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3391:20:3391 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3407:20:3407 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3423:20:3423 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3439:20:3439 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3455:20:3455 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3471:20:3471 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3487:20:3487 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3503:20:3503 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3519:20:3519 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3535:20:3535 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3551:20:3551 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3567:20:3567 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3583:20:3583 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3599:20:3599 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3615:20:3615 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3631:20:3631 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3647:20:3647 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3663:20:3663 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3679:20:3679 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3695:20:3695 | x | -| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2111:20:2111 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2127:20:2127 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2143:20:2143 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2159:20:2159 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2175:20:2175 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2191:20:2191 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2207:20:2207 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2223:20:2223 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2239:20:2239 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2255:20:2255 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2271:20:2271 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2287:20:2287 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2303:20:2303 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2319:20:2319 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2335:20:2335 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2351:20:2351 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2367:20:2367 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2383:20:2383 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2399:20:2399 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2415:20:2415 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2431:20:2431 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2447:20:2447 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2463:20:2463 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2479:20:2479 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2495:20:2495 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2511:20:2511 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2527:20:2527 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2543:20:2543 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2559:20:2559 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2575:20:2575 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2591:20:2591 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2607:20:2607 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2623:20:2623 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2639:20:2639 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2655:20:2655 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2671:20:2671 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2687:20:2687 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2703:20:2703 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2719:20:2719 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2735:20:2735 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2751:20:2751 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2767:20:2767 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2783:20:2783 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2799:20:2799 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2815:20:2815 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2831:20:2831 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2847:20:2847 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2863:20:2863 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2879:20:2879 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2895:20:2895 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2911:20:2911 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2927:20:2927 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2943:20:2943 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2959:20:2959 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2975:20:2975 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2991:20:2991 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3007:20:3007 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3023:20:3023 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3039:20:3039 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3055:20:3055 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3071:20:3071 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3087:20:3087 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3103:20:3103 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3119:20:3119 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3135:20:3135 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3151:20:3151 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3167:20:3167 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3183:20:3183 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3199:20:3199 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3215:20:3215 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3231:20:3231 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3247:20:3247 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3263:20:3263 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3279:20:3279 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3295:20:3295 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3311:20:3311 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3327:20:3327 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3343:20:3343 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3359:20:3359 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3375:20:3375 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3391:20:3391 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3407:20:3407 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3423:20:3423 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3439:20:3439 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3455:20:3455 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3471:20:3471 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3487:20:3487 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3503:20:3503 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3519:20:3519 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3535:20:3535 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3551:20:3551 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3567:20:3567 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3583:20:3583 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3599:20:3599 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3615:20:3615 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3631:20:3631 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3647:20:3647 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3663:20:3663 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3679:20:3679 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3695:20:3695 | x | +| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:9 | x | | UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | UseUseExplosion.rb:21:2111:21:2111 | x | @@ -2402,8 +2402,8 @@ | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a | -| local_dataflow.rb:2:3:2:7 | ... = ... | local_dataflow.rb:3:13:3:13 | b | -| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | +| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b | +| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:3 | b | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:3:10:3:10 | a | | local_dataflow.rb:3:7:3:14 | ( ... ) | local_dataflow.rb:3:3:3:14 | ... = ... | @@ -2421,39 +2421,39 @@ | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | | local_dataflow.rb:6:10:6:11 | ... + ... | local_dataflow.rb:6:8:6:13 | ... = ... | -| local_dataflow.rb:9:1:9:15 | ... = ... | local_dataflow.rb:10:14:10:18 | array | +| local_dataflow.rb:9:1:9:5 | array | local_dataflow.rb:10:14:10:18 | array | +| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:5 | array | | local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:10:5:13:3 | ... = ... | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:5:13:3 | self | local_dataflow.rb:11:1:11:2 | self | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | -| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | +| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:5:13:3 | call to each | local_dataflow.rb:10:1:13:3 | ... = ... | +| local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:14:10:18 | [post] array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | -| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | +| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:10:15:14 | [post] array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:16:9:16:10 | 10 | local_dataflow.rb:16:3:16:10 | break | -| local_dataflow.rb:19:1:21:3 | ... = ... | local_dataflow.rb:20:6:20:6 | x | -| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | +| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:5:19:5 | x | +| local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | | local_dataflow.rb:24:8:24:8 | 5 | local_dataflow.rb:24:2:24:8 | break | | local_dataflow.rb:28:5:28:26 | M | local_dataflow.rb:28:1:28:26 | ... = ... | | local_dataflow.rb:28:15:28:22 | "module" | local_dataflow.rb:28:5:28:26 | M | | local_dataflow.rb:30:5:30:24 | C | local_dataflow.rb:30:1:30:24 | ... = ... | | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | -| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | @@ -2498,9 +2498,9 @@ | local_dataflow.rb:73:7:73:7 | x | local_dataflow.rb:72:7:73:7 | then ... | | local_dataflow.rb:74:3:75:6 | else ... | local_dataflow.rb:69:7:76:5 | case ... | | local_dataflow.rb:75:6:75:6 | x | local_dataflow.rb:74:3:75:6 | else ... | -| local_dataflow.rb:78:3:88:5 | ... = ... | local_dataflow.rb:89:8:89:8 | z | +| local_dataflow.rb:78:3:78:3 | z | local_dataflow.rb:89:8:89:8 | z | | local_dataflow.rb:78:7:88:5 | SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | -| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | +| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:78:3 | z | | local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:79:20:79:26 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:80:24:80:30 | self | @@ -2544,18 +2544,18 @@ | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | -| local_dataflow.rb:93:3:93:28 | ... = ... | 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 | [post] self | local_dataflow.rb:93:20:93:28 | self | | local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:93:7:93:15 | self | local_dataflow.rb:93:20:93:28 | self | -| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | +| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:3 | a | | local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | | local_dataflow.rb:93:7:93:28 | SSA phi read(self) | local_dataflow.rb:94:3:94:9 | self | | local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:94:3:94:9 | [post] self | local_dataflow.rb:95:8:95:16 | self | | local_dataflow.rb:94:3:94:9 | self | local_dataflow.rb:95:8:95:16 | self | -| local_dataflow.rb:95:3:95:30 | ... = ... | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | +| local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:3 | b | | local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | | local_dataflow.rb:95:8:95:16 | [post] self | local_dataflow.rb:95:21:95:29 | self | | local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | @@ -2565,18 +2565,18 @@ | local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | | local_dataflow.rb:96:3:96:9 | [post] self | local_dataflow.rb:98:7:98:15 | self | | local_dataflow.rb:96:3:96:9 | self | local_dataflow.rb:98:7:98:15 | self | -| local_dataflow.rb:98:3:98:28 | ... = ... | 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 | [post] self | local_dataflow.rb:98:20:98:28 | self | | local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:98:7:98:15 | self | local_dataflow.rb:98:20:98:28 | self | -| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | +| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:3 | a | | local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | | local_dataflow.rb:98:7:98:28 | SSA phi read(self) | local_dataflow.rb:99:3:99:9 | self | | local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:99:3:99:9 | [post] self | local_dataflow.rb:100:8:100:16 | self | | local_dataflow.rb:99:3:99:9 | self | local_dataflow.rb:100:8:100:16 | self | -| local_dataflow.rb:100:3:100:31 | ... = ... | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | +| local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:3 | b | | local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | | local_dataflow.rb:100:8:100:16 | [post] self | local_dataflow.rb:100:22:100:30 | self | | local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | @@ -2586,27 +2586,27 @@ | local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | | local_dataflow.rb:101:3:101:9 | [post] self | local_dataflow.rb:103:7:103:15 | self | | local_dataflow.rb:101:3:101:9 | self | local_dataflow.rb:103:7:103:15 | self | -| local_dataflow.rb:103:3:103:15 | ... = ... | 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 | [post] self | local_dataflow.rb:104:9:104:17 | self | -| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:15 | ... = ... | +| 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:15 | ... = ... | | local_dataflow.rb:103:7:103:15 | self | local_dataflow.rb:104:9:104:17 | self | | local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:104:5:104:7 | ... \|\| ... | -| local_dataflow.rb:104:3:104:17 | ... = ... | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | +| local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:3 | a | | local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | | local_dataflow.rb:104:5:104:7 | SSA phi read(self) | local_dataflow.rb:105:3:105:9 | self | | local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:5:104:7 | ... \|\| ... | | local_dataflow.rb:105:3:105:9 | [post] self | local_dataflow.rb:106:7:106:15 | self | | local_dataflow.rb:105:3:105:9 | self | local_dataflow.rb:106:7:106:15 | self | -| local_dataflow.rb:106:3:106:15 | ... = ... | 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 | [post] self | local_dataflow.rb:107:9:107:17 | self | -| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:15 | ... = ... | +| 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:15 | ... = ... | | local_dataflow.rb:106:7:106:15 | self | local_dataflow.rb:107:9:107:17 | self | | local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:107:5:107:7 | ... && ... | -| local_dataflow.rb:107:3:107:17 | ... = ... | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | +| local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | | local_dataflow.rb:107:5:107:7 | SSA phi read(self) | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | @@ -2650,8 +2650,8 @@ | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | -| local_dataflow.rb:131:3:131:8 | ... = ... | local_dataflow.rb:132:10:132:10 | x | -| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | +| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | diff --git a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected index 762fc9a70f1..b824d6d37a1 100644 --- a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected +++ b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected @@ -1,38 +1,63 @@ failures edges -| 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 : | local_dataflow.rb:80:29:80:29 | a | -| 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 : | local_dataflow.rb:83:12:83:12 | d | -| 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 : | local_dataflow.rb:85:27:85:27 | f | -| 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 : | local_dataflow.rb:87:25:87:25 | x | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:89:8:89:8 | z | -| 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 : | 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 : | local_dataflow.rb:94:8:94:8 | a | -| 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 : | 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 : | local_dataflow.rb:96:8:96:8 | b | -| 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 : | 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 : | local_dataflow.rb:99:8:99:8 | a | -| 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 : | 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 : | local_dataflow.rb:101:8:101:8 | b | -| 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 : | 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 : | local_dataflow.rb:105:8:105:8 | a | -| 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 : | 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 : | local_dataflow.rb:108:8:108:8 | b | +| 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 : | @@ -56,48 +81,73 @@ edges | 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:79:25:79:25 | b | semmle.label | b | +| 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: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:27:85:27 | f | semmle.label | f | +| 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: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: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: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: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: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: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:108:8:108:8 | b | semmle.label | b | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index da8b1b82747..890bef5720e 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -1,107 +1,107 @@ | UseUseExplosion.rb:18:5:22:7 | self (m) | UseUseExplosion.rb:20:13:20:17 | self | | UseUseExplosion.rb:18:5:22:7 | self in m | UseUseExplosion.rb:18:5:22:7 | self (m) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2111:20:2111 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2127:20:2127 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2143:20:2143 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2159:20:2159 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2175:20:2175 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2191:20:2191 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2207:20:2207 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2223:20:2223 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2239:20:2239 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2255:20:2255 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2271:20:2271 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2287:20:2287 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2303:20:2303 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2319:20:2319 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2335:20:2335 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2351:20:2351 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2367:20:2367 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2383:20:2383 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2399:20:2399 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2415:20:2415 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2431:20:2431 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2447:20:2447 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2463:20:2463 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2479:20:2479 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2495:20:2495 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2511:20:2511 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2527:20:2527 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2543:20:2543 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2559:20:2559 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2575:20:2575 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2591:20:2591 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2607:20:2607 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2623:20:2623 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2639:20:2639 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2655:20:2655 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2671:20:2671 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2687:20:2687 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2703:20:2703 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2719:20:2719 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2735:20:2735 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2751:20:2751 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2767:20:2767 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2783:20:2783 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2799:20:2799 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2815:20:2815 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2831:20:2831 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2847:20:2847 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2863:20:2863 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2879:20:2879 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2895:20:2895 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2911:20:2911 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2927:20:2927 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2943:20:2943 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2959:20:2959 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2975:20:2975 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2991:20:2991 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3007:20:3007 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3023:20:3023 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3039:20:3039 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3055:20:3055 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3071:20:3071 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3087:20:3087 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3103:20:3103 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3119:20:3119 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3135:20:3135 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3151:20:3151 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3167:20:3167 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3183:20:3183 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3199:20:3199 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3215:20:3215 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3231:20:3231 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3247:20:3247 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3263:20:3263 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3279:20:3279 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3295:20:3295 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3311:20:3311 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3327:20:3327 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3343:20:3343 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3359:20:3359 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3375:20:3375 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3391:20:3391 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3407:20:3407 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3423:20:3423 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3439:20:3439 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3455:20:3455 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3471:20:3471 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3487:20:3487 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3503:20:3503 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3519:20:3519 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3535:20:3535 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3551:20:3551 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3567:20:3567 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3583:20:3583 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3599:20:3599 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3615:20:3615 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3631:20:3631 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3647:20:3647 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3663:20:3663 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3679:20:3679 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3695:20:3695 | x | -| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2111:20:2111 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2127:20:2127 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2143:20:2143 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2159:20:2159 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2175:20:2175 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2191:20:2191 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2207:20:2207 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2223:20:2223 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2239:20:2239 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2255:20:2255 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2271:20:2271 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2287:20:2287 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2303:20:2303 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2319:20:2319 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2335:20:2335 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2351:20:2351 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2367:20:2367 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2383:20:2383 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2399:20:2399 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2415:20:2415 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2431:20:2431 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2447:20:2447 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2463:20:2463 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2479:20:2479 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2495:20:2495 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2511:20:2511 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2527:20:2527 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2543:20:2543 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2559:20:2559 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2575:20:2575 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2591:20:2591 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2607:20:2607 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2623:20:2623 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2639:20:2639 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2655:20:2655 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2671:20:2671 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2687:20:2687 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2703:20:2703 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2719:20:2719 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2735:20:2735 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2751:20:2751 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2767:20:2767 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2783:20:2783 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2799:20:2799 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2815:20:2815 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2831:20:2831 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2847:20:2847 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2863:20:2863 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2879:20:2879 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2895:20:2895 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2911:20:2911 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2927:20:2927 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2943:20:2943 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2959:20:2959 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2975:20:2975 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2991:20:2991 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3007:20:3007 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3023:20:3023 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3039:20:3039 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3055:20:3055 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3071:20:3071 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3087:20:3087 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3103:20:3103 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3119:20:3119 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3135:20:3135 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3151:20:3151 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3167:20:3167 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3183:20:3183 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3199:20:3199 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3215:20:3215 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3231:20:3231 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3247:20:3247 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3263:20:3263 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3279:20:3279 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3295:20:3295 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3311:20:3311 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3327:20:3327 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3343:20:3343 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3359:20:3359 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3375:20:3375 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3391:20:3391 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3407:20:3407 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3423:20:3423 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3439:20:3439 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3455:20:3455 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3471:20:3471 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3487:20:3487 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3503:20:3503 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3519:20:3519 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3535:20:3535 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3551:20:3551 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3567:20:3567 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3583:20:3583 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3599:20:3599 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3615:20:3615 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3631:20:3631 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3647:20:3647 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3663:20:3663 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3679:20:3679 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3695:20:3695 | x | +| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:9 | x | | UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | UseUseExplosion.rb:21:2111:21:2111 | x | @@ -2833,8 +2833,8 @@ | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a | -| local_dataflow.rb:2:3:2:7 | ... = ... | local_dataflow.rb:3:13:3:13 | b | -| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | +| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b | +| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:3 | b | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:3:10:3:10 | a | | local_dataflow.rb:3:7:3:14 | ( ... ) | local_dataflow.rb:3:3:3:14 | ... = ... | @@ -2854,33 +2854,33 @@ | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | | local_dataflow.rb:6:10:6:11 | ... + ... | local_dataflow.rb:6:8:6:13 | ... = ... | | local_dataflow.rb:6:13:6:13 | b | local_dataflow.rb:6:10:6:11 | ... + ... | -| local_dataflow.rb:9:1:9:15 | ... = ... | local_dataflow.rb:10:14:10:18 | array | +| local_dataflow.rb:9:1:9:5 | array | local_dataflow.rb:10:14:10:18 | array | | local_dataflow.rb:9:9:9:15 | Array | local_dataflow.rb:9:9:9:15 | call to [] | +| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:5 | array | | local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:10:5:13:3 | ... = ... | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:5:13:3 | self | local_dataflow.rb:11:1:11:2 | self | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | -| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | +| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:5:13:3 | call to each | local_dataflow.rb:10:1:13:3 | ... = ... | +| local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:14:10:18 | [post] array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | -| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | +| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:10:15:14 | [post] array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:16:9:16:10 | 10 | local_dataflow.rb:16:3:16:10 | break | -| local_dataflow.rb:19:1:21:3 | ... = ... | local_dataflow.rb:20:6:20:6 | x | -| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | +| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:5:19:5 | x | +| local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:20:10:20:10 | 1 | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | @@ -2889,7 +2889,7 @@ | local_dataflow.rb:28:15:28:22 | "module" | local_dataflow.rb:28:5:28:26 | M | | local_dataflow.rb:30:5:30:24 | C | local_dataflow.rb:30:1:30:24 | ... = ... | | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | -| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | @@ -2943,9 +2943,9 @@ | local_dataflow.rb:73:7:73:7 | x | local_dataflow.rb:72:7:73:7 | then ... | | local_dataflow.rb:74:3:75:6 | else ... | local_dataflow.rb:69:7:76:5 | case ... | | local_dataflow.rb:75:6:75:6 | x | local_dataflow.rb:74:3:75:6 | else ... | -| local_dataflow.rb:78:3:88:5 | ... = ... | local_dataflow.rb:89:8:89:8 | z | +| local_dataflow.rb:78:3:78:3 | z | local_dataflow.rb:89:8:89:8 | z | | local_dataflow.rb:78:7:88:5 | SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | -| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | +| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:78:3 | z | | local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:79:20:79:26 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:80:24:80:30 | self | @@ -3000,18 +3000,18 @@ | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | -| local_dataflow.rb:93:3:93:28 | ... = ... | 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 | [post] self | local_dataflow.rb:93:20:93:28 | self | | local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:93:7:93:15 | self | local_dataflow.rb:93:20:93:28 | self | -| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | +| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:3 | a | | local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | | local_dataflow.rb:93:7:93:28 | SSA phi read(self) | local_dataflow.rb:94:3:94:9 | self | | local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:94:3:94:9 | [post] self | local_dataflow.rb:95:8:95:16 | self | | local_dataflow.rb:94:3:94:9 | self | local_dataflow.rb:95:8:95:16 | self | -| local_dataflow.rb:95:3:95:30 | ... = ... | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | +| local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:3 | b | | local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | | local_dataflow.rb:95:8:95:16 | [post] self | local_dataflow.rb:95:21:95:29 | self | | local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | @@ -3021,18 +3021,18 @@ | local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | | local_dataflow.rb:96:3:96:9 | [post] self | local_dataflow.rb:98:7:98:15 | self | | local_dataflow.rb:96:3:96:9 | self | local_dataflow.rb:98:7:98:15 | self | -| local_dataflow.rb:98:3:98:28 | ... = ... | 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 | [post] self | local_dataflow.rb:98:20:98:28 | self | | local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:98:7:98:15 | self | local_dataflow.rb:98:20:98:28 | self | -| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | +| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:3 | a | | local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | | local_dataflow.rb:98:7:98:28 | SSA phi read(self) | local_dataflow.rb:99:3:99:9 | self | | local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:99:3:99:9 | [post] self | local_dataflow.rb:100:8:100:16 | self | | local_dataflow.rb:99:3:99:9 | self | local_dataflow.rb:100:8:100:16 | self | -| local_dataflow.rb:100:3:100:31 | ... = ... | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | +| local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:3 | b | | local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | | local_dataflow.rb:100:8:100:16 | [post] self | local_dataflow.rb:100:22:100:30 | self | | local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | @@ -3042,27 +3042,27 @@ | local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | | local_dataflow.rb:101:3:101:9 | [post] self | local_dataflow.rb:103:7:103:15 | self | | local_dataflow.rb:101:3:101:9 | self | local_dataflow.rb:103:7:103:15 | self | -| local_dataflow.rb:103:3:103:15 | ... = ... | 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 | [post] self | local_dataflow.rb:104:9:104:17 | self | -| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:15 | ... = ... | +| 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:15 | ... = ... | | local_dataflow.rb:103:7:103:15 | self | local_dataflow.rb:104:9:104:17 | self | | local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:104:5:104:7 | ... \|\| ... | -| local_dataflow.rb:104:3:104:17 | ... = ... | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | +| local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:3 | a | | local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | | local_dataflow.rb:104:5:104:7 | SSA phi read(self) | local_dataflow.rb:105:3:105:9 | self | | local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:5:104:7 | ... \|\| ... | | local_dataflow.rb:105:3:105:9 | [post] self | local_dataflow.rb:106:7:106:15 | self | | local_dataflow.rb:105:3:105:9 | self | local_dataflow.rb:106:7:106:15 | self | -| local_dataflow.rb:106:3:106:15 | ... = ... | 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 | [post] self | local_dataflow.rb:107:9:107:17 | self | -| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:15 | ... = ... | +| 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:15 | ... = ... | | local_dataflow.rb:106:7:106:15 | self | local_dataflow.rb:107:9:107:17 | self | | local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:107:5:107:7 | ... && ... | -| local_dataflow.rb:107:3:107:17 | ... = ... | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | +| local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | | local_dataflow.rb:107:5:107:7 | SSA phi read(self) | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | @@ -3106,8 +3106,8 @@ | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | -| local_dataflow.rb:131:3:131:8 | ... = ... | local_dataflow.rb:132:10:132:10 | x | -| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | +| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | 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 12db100a968..3b459c4a3e6 100644 --- a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected @@ -22,17 +22,21 @@ edges | 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:14:34:22 | call to taint : | params_flow.rb:35:25:35:28 | args [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:16:37:24 | call to taint : | params_flow.rb:38:10:38:13 | args [element :p1] : | -| params_flow.rb:37:34:37:42 | call to taint : | params_flow.rb:38:10:38:13 | args [element :p2] : | +| 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:16:40:24 | call to taint : | params_flow.rb:41:26:41:29 | args [element :p1] : | +| 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] : | @@ -40,7 +44,8 @@ edges | 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:8:62:16 | call to taint : | params_flow.rb:66:13:66:16 | args : | +| 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] : | @@ -75,16 +80,20 @@ nodes | 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] : | @@ -94,6 +103,7 @@ nodes | 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] : | 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 a13e860bd04..b248ef21157 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,216 +1,290 @@ failures edges -| pathname_flow.rb:4:10:4:33 | call to new : | pathname_flow.rb:5:10:5:11 | pn | +| 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:7:9:30 | call to new : | pathname_flow.rb:11:8:11:12 | ... + ... | +| 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:7:10:30 | call to new : | pathname_flow.rb:11:8:11:12 | ... + ... | +| 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:8:15:31 | call to new : | pathname_flow.rb:16:8:16:9 | pn : | +| 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:7:20:30 | call to new : | pathname_flow.rb:21:3:21:3 | a : | +| 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:7:27:30 | call to new : | pathname_flow.rb:28:8:28:8 | a : | +| 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:7:32:30 | call to new : | pathname_flow.rb:35:8:35:8 | a : | +| 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:7:34:30 | call to new : | pathname_flow.rb:35:18:35:18 | c : | +| 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:7:39:30 | call to new : | pathname_flow.rb:40:8:40:8 | a : | +| 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:7:44:30 | call to new : | pathname_flow.rb:45:8:45:8 | a : | +| 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:7:49:30 | call to new : | pathname_flow.rb:50:8:50:8 | a : | +| 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:7:54:30 | call to new : | pathname_flow.rb:55:8:55:8 | a : | +| 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:7:59:30 | call to new : | pathname_flow.rb:60:8:60:8 | a : | +| 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:7:64:30 | call to new : | pathname_flow.rb:66:8:66:8 | b | +| 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:70:7:70:30 | call to new : | pathname_flow.rb:72:8:72:8 | b | +| 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:76:7:76:30 | call to new : | pathname_flow.rb:77:7:77:7 | a : | +| 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:78:8:78:8 | b | -| pathname_flow.rb:82:7:82:30 | call to new : | pathname_flow.rb:83:7:83:7 | a : | +| 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:84:8:84:8 | b | -| pathname_flow.rb:88:7:88:30 | call to new : | pathname_flow.rb:89:7:89:7 | a : | +| 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:90:8:90:8 | b | -| pathname_flow.rb:94:7:94:30 | call to new : | pathname_flow.rb:95:7:95:7 | a : | +| 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:96:8:96:8 | b | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:104:8:104:8 | b : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:107:8:107:8 | c : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:109:7:109:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:112:7:112:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:115:7:115:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:118:7:118:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:121:7:121:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:124:7:124:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:127:7:127:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:130:7:130:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:133:7:133:7 | a : | +| 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:110:8:110:8 | d : | +| 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:113:8:113:8 | e : | +| 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:116:8:116:8 | f : | +| 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:119:8:119:8 | g : | +| 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:122:8:122:8 | h : | +| 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:125:8:125:8 | i : | +| 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:128:8:128:8 | j : | +| 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:131:8:131:8 | k : | +| 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:134:8:134:8 | l : | +| 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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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 : | 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 122a1d8eb1f..651a6affec7 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,126 +2,161 @@ 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:9:2:18 | call to source : | string_flow.rb:3:21:3:21 | a : | -| string_flow.rb:2:9:2:18 | call to source : | 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: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:9:7:18 | call to source : | string_flow.rb:9:29:9:29 | a : | -| string_flow.rb:8:9:8:16 | call to source : | string_flow.rb:10:29:10:29 | b : | +| 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:9:14:18 | call to source : | string_flow.rb:15:10:15:17 | ... % ... | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:15:17:15:17 | a : | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:16:10:16:29 | ... % ... | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:16:28:16:28 | a : | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:17:10:17:10 | a : | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:17:10:17:18 | ... % ... | +| 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:9:21:18 | call to source : | string_flow.rb:23:10:23:10 | b | -| string_flow.rb:27:9:27:18 | call to source : | string_flow.rb:29:10:29:10 | b | -| string_flow.rb:33:9:33:18 | call to source : | string_flow.rb:35:10:35:10 | b | -| string_flow.rb:33:9:33:18 | call to source : | string_flow.rb:37:10:37:10 | c | -| string_flow.rb:41:9:41:18 | call to source : | string_flow.rb:42:10:42:10 | a : | +| 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:9:46:18 | call to source : | string_flow.rb:47:10:47:10 | a : | -| string_flow.rb:46:9:46:18 | call to source : | string_flow.rb:48:10:48:10 | a : | -| string_flow.rb:46:9:46:18 | call to source : | string_flow.rb:49:10:49:10 | a : | +| 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:9:53:18 | call to source : | string_flow.rb:54:10:54:10 | a : | -| string_flow.rb:53:9:53:18 | call to source : | string_flow.rb:55:10:55:10 | a : | +| 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:9:59:18 | call to source : | string_flow.rb:60:10:60:10 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:61:27:61:27 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:62:10:62:10 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:63:26:63:26 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:64:10:64:10 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:65:26:65:26 | a : | +| 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:9:69:18 | call to source : | string_flow.rb:70:10:70:10 | a : | -| string_flow.rb:69:9:69:18 | call to source : | string_flow.rb:71:10:71:10 | a : | +| 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:9:75:18 | call to source : | string_flow.rb:76:10:76:10 | a : | -| string_flow.rb:75:9:75:18 | call to source : | string_flow.rb:77:10:77:10 | a : | +| 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:9:83:18 | call to source : | string_flow.rb:84:5:84:5 | a : | -| string_flow.rb:83:9:83:18 | call to source : | 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: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:9:108:18 | call to source : | string_flow.rb:109:10:109:10 | 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:9:115:18 | call to source : | string_flow.rb:116:10:116:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:117:10:117:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:118:10:118:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:119:10:119:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:120:10:120:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:121:10:121:10 | a : | +| 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:9:125:18 | call to source : | string_flow.rb:126:9:126:9 | a : | +| 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:127:10:127:10 | b | -| string_flow.rb:126:9:126:14 | call to dump : | string_flow.rb:128:10:128:10 | b : | +| 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:9:132:18 | call to source : | string_flow.rb:133:9:133:9 | a : | -| string_flow.rb:132:9:132:18 | call to source : | string_flow.rb:135:9:135:9 | a : | +| 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:134:10:134:10 | b | +| 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:136:10:136:10 | c [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:9:140:18 | call to source : | string_flow.rb:141:9:141:9 | a : | -| string_flow.rb:140:9:140:18 | call to source : | string_flow.rb:143:9:143:9 | a : | +| 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:142:10:142:10 | b | +| 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:144:10:144:10 | c [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:9:148:18 | call to source : | string_flow.rb:149:10:149:10 | a : | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:150:10:150:10 | a : | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:151:10:151:10 | a : | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:152:10:152:10 | a : | +| 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:9:156:18 | call to source : | string_flow.rb:157:10:157:10 | a : | +| 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:9:161:18 | call to source : | string_flow.rb:162:10:162:10 | a : | +| 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:9:166:18 | call to source : | string_flow.rb:168:10:168:10 | a : | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:169:10:169:10 | a : | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:170:10:170:10 | a : | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:171:10:171:10 | a : | -| string_flow.rb:167:9:167:18 | call to source : | string_flow.rb:168:22:168:22 | c : | -| string_flow.rb:167:9:167:18 | call to source : | string_flow.rb:169:23:169:23 | c : | +| 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! | @@ -130,12 +165,14 @@ edges | 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:9:175:18 | call to source : | string_flow.rb:177:10:177:10 | a : | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:178:10:178:10 | a : | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:179:10:179:10 | a : | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:180:10:180:10 | a : | -| string_flow.rb:176:9:176:18 | call to source : | string_flow.rb:177:21:177:21 | c : | -| string_flow.rb:176:9:176:18 | call to source : | string_flow.rb:178:22:178:22 | c : | +| 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! | @@ -144,70 +181,84 @@ edges | 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:9:191:18 | call to source : | string_flow.rb:192:10:192:10 | a : | +| 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:9:196:18 | call to source : | string_flow.rb:197:10:197:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:198:10:198:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:199:10:199:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:200:10:200:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:201:10:201:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:202:10:202:10 | a : | +| 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:9:206:18 | call to source : | string_flow.rb:207:10:207:10 | a : | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:208:10:208:10 | a : | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:209:10:209:10 | a : | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:210:10:210:10 | a : | +| 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:9:214:18 | call to source : | string_flow.rb:215:9:215:9 | a : | +| 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:216:10:216:10 | b [element 0] : | -| string_flow.rb:215:9:215:24 | call to partition [element 1] : | string_flow.rb:217:10:217:10 | b [element 1] : | -| string_flow.rb:215:9:215:24 | call to partition [element 2] : | string_flow.rb:218:10:218:10 | b [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:9:223:18 | call to source : | string_flow.rb:225:10:225:10 | a : | -| string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:225:10:225:10 | a : | -| string_flow.rb:224:9:224:18 | call to source : | string_flow.rb:225:20:225:20 | b : | +| 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:9:231:18 | call to source : | string_flow.rb:232:10:232:10 | a : | +| 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:9:236:18 | call to source : | string_flow.rb:237:9:237:9 | a : | -| string_flow.rb:236:9:236:18 | call to source : | string_flow.rb:238:9:238:9 | a : | -| string_flow.rb:236:9:236:18 | call to source : | string_flow.rb:240:9:240:9 | a : | +| 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:239:10:239:10 | b | +| 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:241:10:241:10 | b [element] : | -| string_flow.rb:240:9:240:19 | call to scan [element] : | string_flow.rb:242:10:242:10 | b [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:18 | ... = ... : | string_flow.rb:250:26:250:26 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:246:5:246:18 | ... = ... : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:247:10:247:10 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:248:20:248:20 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:249:5:249:5 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:252:10:252:10 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:253:21:253:21 | a : | +| 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 : | @@ -215,23 +266,29 @@ edges | 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:18 | ... = ... : | string_flow.rb:258:27:258:27 | a : | -| string_flow.rb:255:9:255:18 | call to source : | string_flow.rb:255:5:255:18 | ... = ... : | -| string_flow.rb:255:9:255:18 | call to source : | string_flow.rb:256:5:256:5 | a : | +| 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:9:262:18 | call to source : | string_flow.rb:263:10:263:10 | a : | +| 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:9:267:18 | call to source : | string_flow.rb:268:9:268:9 | a : | +| 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:269:10:269:10 | b [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:9:273:18 | call to source : | string_flow.rb:274:9:274:9 | a : | -| string_flow.rb:273:9:273:18 | call to source : | string_flow.rb:277:9:277:9 | a : | +| 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:275:10:275:10 | b : | +| 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] : | @@ -242,45 +299,53 @@ edges | 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:278:10:278:10 | b : | +| 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:281:10:281:10 | b : | +| 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:284:10:284:10 | b : | -| string_flow.rb:283:9:283:14 | ...[...] [element 0] : | string_flow.rb:284:10:284:10 | b [element 0] : | -| string_flow.rb:283:9:283:14 | ...[...] [element 1] : | string_flow.rb:284:10:284:10 | b [element 1] : | -| string_flow.rb:283:9:283:14 | ...[...] [element] : | string_flow.rb:284:10:284:10 | b [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:9:288:18 | call to source : | string_flow.rb:289:10:289:10 | a : | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:290:10:290:10 | a : | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:291:10:291:10 | a : | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:292:10:292:10 | a : | +| 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:9:296:18 | call to source : | string_flow.rb:297:10:297:10 | a : | -| string_flow.rb:296:9:296:18 | call to source : | string_flow.rb:298:10:298:10 | a : | +| 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:9:302:18 | call to source : | string_flow.rb:303:10:303:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:304:22:304:22 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:305:10:305:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:306:23:306:23 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:307:10:307:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:308:24:308:24 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:309:10:309:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:310:25:310:25 | a : | +| 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! | @@ -289,9 +354,10 @@ edges | 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:9:314:18 | call to source : | string_flow.rb:315:5:315:5 | a : | -| string_flow.rb:314:9:314:18 | call to source : | string_flow.rb:316:5:316:5 | a : | -| string_flow.rb:314:9:314:18 | call to source : | string_flow.rb:317:14:317:14 | a : | +| 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 : | @@ -299,18 +365,23 @@ edges | 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: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: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: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:15:10:15:17 | ... % ... | semmle.label | ... % ... | | string_flow.rb:15:17:15:17 | a : | semmle.label | a : | @@ -318,16 +389,25 @@ nodes | 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: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: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:35:10:35:10 | b | semmle.label | b | +| 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: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:47:10:47:23 | call to byteslice | semmle.label | call to byteslice | @@ -335,11 +415,13 @@ nodes | 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: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: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: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:60:10:60:21 | call to center | semmle.label | call to center | @@ -353,16 +435,20 @@ nodes | 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: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: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: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: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 : | @@ -371,6 +457,7 @@ nodes | 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 : | @@ -379,6 +466,7 @@ nodes | 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: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:116:10:116:19 | call to downcase | semmle.label | call to downcase | @@ -392,33 +480,42 @@ nodes | 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: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: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: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: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: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: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: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:149:10:149:26 | call to encode | semmle.label | call to encode | @@ -428,13 +525,17 @@ nodes | 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: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: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: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:168:10:168:23 | call to gsub | semmle.label | call to gsub | @@ -448,7 +549,9 @@ nodes | 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:177:10:177:22 | call to sub | semmle.label | call to sub | @@ -462,9 +565,11 @@ nodes | 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: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:197:10:197:16 | call to strip | semmle.label | call to strip | @@ -478,6 +583,7 @@ nodes | 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: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:207:10:207:15 | call to next | semmle.label | call to next | @@ -487,7 +593,11 @@ nodes | 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: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] : | @@ -498,8 +608,11 @@ nodes | 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: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 : | @@ -509,25 +622,29 @@ nodes | 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: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: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: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: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:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:246:5:246:18 | ... = ... : | 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:247:10:247:21 | call to scrub | semmle.label | call to scrub | @@ -542,26 +659,32 @@ nodes | 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:18 | ... = ... : | semmle.label | ... = ... : | +| 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: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: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: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] : | @@ -570,10 +693,15 @@ nodes | 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: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] : | @@ -587,6 +715,7 @@ nodes | 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:289:10:289:18 | call to squeeze | semmle.label | call to squeeze | @@ -596,11 +725,13 @@ nodes | 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: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: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: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:303:10:303:23 | call to tr | semmle.label | call to tr | @@ -618,6 +749,7 @@ nodes | 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 : | diff --git a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected index f916520c8ce..a69c52963cb 100644 --- a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected +++ b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected @@ -1,53 +1,57 @@ failures edges -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:2:6:2:12 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:2:6:2:12 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:4:24:4:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:4:24:4:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:16:36:16:42 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:16:36:16:42 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:20:25:20:31 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:26:31:26:37 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:30:24:30:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:31:27:31:33 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:34:16:34:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:34:16:34:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:35:16:35:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:35:16:35:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:36:21:36:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:36:21:36:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:37:36:37:42 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:37:36:37:42 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:51:24:51:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:56:22:56:28 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:57:17:57:23 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:59:27:59:33 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:63:32:63:38 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:65:23:65:29 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:122:16:122:22 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:128:14:128:20 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:131:16:131:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:131:16:131:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:132:21:132:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:132:21:132:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:135:26:135:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:135:26:135:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:137:23:137:29 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:137:23:137:29 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:140:19:140:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:140:19:140:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:141:19:141:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:141:19:141:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:145:26:145:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:145:26:145:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:147:16:147:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:147:16:147:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:150:39:150:45 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:150:39:150:45 | tainted | +| 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:12:7:3 | call to apply_block : | summaries.rb:9:6:9:13 | tainted2 | -| summaries.rb:4:12:7:3 | call to apply_block : | summaries.rb:9:6:9:13 | tainted2 | +| 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 : | @@ -56,27 +60,33 @@ edges | 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:12:16:43 | call to apply_lambda : | summaries.rb:18:6:18:13 | tainted3 | -| summaries.rb:16:12:16:43 | call to apply_lambda : | summaries.rb:18:6:18:13 | tainted3 | +| 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:12:20:32 | call to firstArg : | summaries.rb:21:6:21:13 | tainted4 | +| 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:12:26:38 | call to secondArg : | summaries.rb:27:6:27:13 | tainted5 | +| 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:7:40:17 | call to source : | summaries.rb:41:24:41:24 | t : | -| summaries.rb:40:7:40:17 | call to source : | summaries.rb:42:24:42:24 | t : | -| summaries.rb:40:7:40:17 | call to source : | summaries.rb:44:8:44:8 | t : | +| 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:15:53:31 | call to source : | summaries.rb:54:21:54:24 | args [element :foo] : | +| 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 | @@ -87,20 +97,24 @@ edges | 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:15:79:29 | call to source : | summaries.rb:82:6:82:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:82:6:82:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:83:6:83:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:83:6:83:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:85:6:85:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:85:6:85:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:87:5:87:5 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:87:5:87:5 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:91:5:91:5 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:91:5:91:5 | a [element 1] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:86:6:86:6 | a [element 2] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:86:6:86:6 | a [element 2] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:95:1:95:1 | a [element 2] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:95:1:95:1 | a [element 2] : | +| 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] : | @@ -131,18 +145,22 @@ edges | 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:89:6:89:6 | b [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | summaries.rb:89:6:89:6 | b [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:88:6:88:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:88:6:88:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:89:6:89:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:89:6:89:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:90:6:90:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:90:6:90:6 | b [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 | ...[...] | @@ -151,10 +169,12 @@ edges | 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:93:6:93:6 | c [element 1] : | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | summaries.rb:93:6:93:6 | 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: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] : | @@ -219,12 +239,16 @@ edges | 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: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 : | @@ -239,15 +263,19 @@ nodes | 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: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: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:27:6:27:13 | tainted5 | semmle.label | tainted5 | @@ -263,6 +291,7 @@ 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:41:8:41:25 | call to matchedByName | semmle.label | call to matchedByName | | summaries.rb:41:24:41:24 | t : | semmle.label | t : | @@ -274,6 +303,7 @@ nodes | 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:54:6:54:25 | call to namedArg | semmle.label | call to namedArg | | summaries.rb:54:19:54:24 | ** ... [element :foo] : | semmle.label | ** ... [element :foo] : | @@ -293,6 +323,10 @@ nodes | 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 : | @@ -327,6 +361,10 @@ nodes | 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] : | @@ -349,6 +387,8 @@ nodes | 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] : | diff --git a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected index 0c35a350c41..bc7b35eb941 100644 --- a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected @@ -446,7 +446,7 @@ trackEnd | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:7:5:9:7 | self (field) | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:7:5:9:7 | self in field | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:8:9:8:14 | self | -| type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:5:13:23 | ... = ... | +| type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:5:13:7 | var | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:5:13:23 | ... = ... | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:11:13:23 | call to new | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:14:5:14:7 | var | @@ -467,7 +467,7 @@ trackEnd | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:23 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | "hello" | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | ... = ... | -| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | ... = ... | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:14:17:14:23 | __synth__0 | type_tracker.rb:14:17:14:23 | __synth__0 | | type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:12:1:16:3 | return return in m | @@ -606,8 +606,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:5:39:18 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:40:5:40:12 | ...[...] | @@ -618,8 +618,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:5:43:19 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:44:5:44:13 | ...[...] | @@ -630,8 +630,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:5:47:19 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:5:51:13 | __synth__0 | @@ -640,8 +640,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:5:51:19 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:52:5:52:13 | ...[...] | @@ -664,7 +664,7 @@ trackEnd | type_tracker.rb:34:26:34:26 | z | type_tracker.rb:52:12:52:12 | z | | type_tracker.rb:35:5:35:7 | tmp | type_tracker.rb:35:5:35:7 | tmp | | type_tracker.rb:35:11:35:15 | Array | type_tracker.rb:35:11:35:15 | Array | -| type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:5:35:15 | ... = ... | +| type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:5:35:7 | tmp | | type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:5:35:15 | ... = ... | | type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:11:35:15 | call to [] | | type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:36:5:36:7 | tmp | @@ -672,7 +672,7 @@ trackEnd | type_tracker.rb:36:9:36:9 | 0 | type_tracker.rb:36:9:36:9 | 0 | | type_tracker.rb:38:5:38:9 | array | type_tracker.rb:38:5:38:9 | array | | type_tracker.rb:38:13:38:25 | Array | type_tracker.rb:38:13:38:25 | Array | -| type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:5:38:25 | ... = ... | +| type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:5:38:9 | array | | type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:5:38:25 | ... = ... | | type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:13:38:25 | call to [] | | type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:39:5:39:9 | array | @@ -692,7 +692,7 @@ trackEnd | type_tracker.rb:40:11:40:11 | 0 | type_tracker.rb:40:11:40:11 | 0 | | type_tracker.rb:42:5:42:10 | array2 | type_tracker.rb:42:5:42:10 | array2 | | type_tracker.rb:42:14:42:26 | Array | type_tracker.rb:42:14:42:26 | Array | -| type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:5:42:26 | ... = ... | +| type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:5:42:10 | array2 | | type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:5:42:26 | ... = ... | | type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:14:42:26 | call to [] | | type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:43:5:43:10 | array2 | @@ -717,7 +717,7 @@ trackEnd | type_tracker.rb:44:5:44:13 | ...[...] | type_tracker.rb:44:5:44:13 | ...[...] | | type_tracker.rb:46:5:46:10 | array3 | type_tracker.rb:46:5:46:10 | array3 | | type_tracker.rb:46:14:46:26 | Array | type_tracker.rb:46:14:46:26 | Array | -| type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:5:46:26 | ... = ... | +| type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:5:46:10 | array3 | | type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:5:46:26 | ... = ... | | type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:14:46:26 | call to [] | | type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:47:5:47:10 | array3 | @@ -738,7 +738,7 @@ trackEnd | type_tracker.rb:48:12:48:12 | 1 | type_tracker.rb:48:12:48:12 | 1 | | type_tracker.rb:50:5:50:10 | array4 | type_tracker.rb:50:5:50:10 | array4 | | type_tracker.rb:50:14:50:26 | Array | type_tracker.rb:50:14:50:26 | Array | -| type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:5:50:26 | ... = ... | +| type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:5:50:10 | array4 | | type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:5:50:26 | ... = ... | | type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:14:50:26 | call to [] | | type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:51:5:51:10 | array4 | diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index 918bd5c19ea..0374a54c0c1 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -20,10 +20,10 @@ activeRecordInstances | ActiveRecord.rb:76:5:76:66 | call to create | | ActiveRecord.rb:80:5:80:68 | call to create | | ActiveRecord.rb:84:5:84:16 | call to create | -| associations.rb:19:1:19:20 | ... = ... | +| associations.rb:19:1:19:7 | author1 | | associations.rb:19:1:19:20 | ... = ... | | associations.rb:19:11:19:20 | call to new | -| associations.rb:21:1:21:28 | ... = ... | +| associations.rb:21:1:21:5 | post1 | | associations.rb:21:1:21:28 | ... = ... | | associations.rb:21:9:21:15 | author1 | | associations.rb:21:9:21:21 | call to posts | @@ -32,11 +32,11 @@ activeRecordInstances | associations.rb:23:12:23:16 | post1 | | associations.rb:23:12:23:25 | call to comments | | associations.rb:23:12:23:32 | call to create | -| associations.rb:25:1:25:22 | ... = ... | +| associations.rb:25:1:25:7 | author2 | | associations.rb:25:1:25:22 | ... = ... | | associations.rb:25:11:25:15 | post1 | | associations.rb:25:11:25:22 | call to author | -| associations.rb:27:1:27:28 | ... = ... | +| associations.rb:27:1:27:5 | post2 | | associations.rb:27:1:27:28 | ... = ... | | associations.rb:27:9:27:15 | author2 | | associations.rb:27:9:27:21 | call to posts | @@ -50,7 +50,7 @@ activeRecordInstances | associations.rb:31:1:31:12 | call to author= | | associations.rb:31:1:31:22 | ... | | associations.rb:31:16:31:22 | ... = ... | -| associations.rb:31:16:31:22 | ... = ... | +| associations.rb:31:16:31:22 | __synth__0 | | associations.rb:31:16:31:22 | author2 | | associations.rb:35:1:35:5 | post2 | | associations.rb:35:1:35:14 | call to comments | diff --git a/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected b/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected index 3cb31c4c12c..a55946c1852 100644 --- a/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected +++ b/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected @@ -11,11 +11,11 @@ modelClassMethodCalls | active_resource.rb:24:10:24:26 | call to find | | active_resource.rb:30:3:30:11 | call to site= | modelInstances -| active_resource.rb:5:1:5:33 | ... = ... | +| active_resource.rb:5:1:5:5 | alice | | active_resource.rb:5:1:5:33 | ... = ... | | active_resource.rb:5:9:5:33 | call to new | | active_resource.rb:6:1:6:5 | alice | -| active_resource.rb:8:1:8:22 | ... = ... | +| active_resource.rb:8:1:8:5 | alice | | active_resource.rb:8:1:8:22 | ... = ... | | active_resource.rb:8:9:8:22 | call to find | | active_resource.rb:9:1:9:5 | alice | @@ -25,10 +25,10 @@ modelInstances | active_resource.rb:17:1:17:5 | alice | | active_resource.rb:18:1:18:22 | call to get | | active_resource.rb:19:1:19:5 | alice | -| active_resource.rb:24:1:24:26 | ... = ... | +| active_resource.rb:24:1:24:6 | people | | active_resource.rb:24:1:24:26 | ... = ... | | active_resource.rb:24:10:24:26 | call to find | -| active_resource.rb:26:1:26:20 | ... = ... | +| active_resource.rb:26:1:26:5 | alice | | active_resource.rb:26:1:26:20 | ... = ... | | active_resource.rb:26:9:26:14 | people | | active_resource.rb:26:9:26:20 | call to first | @@ -46,7 +46,7 @@ modelInstanceMethodCalls collections | active_resource.rb:23:1:23:19 | ... = ... | | active_resource.rb:23:10:23:19 | call to all | -| active_resource.rb:24:1:24:26 | ... = ... | +| active_resource.rb:24:1:24:6 | people | | active_resource.rb:24:1:24:26 | ... = ... | | active_resource.rb:24:10:24:26 | call to find | | active_resource.rb:26:9:26:14 | people | diff --git a/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected b/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected index 8c788bda20d..cd2c9c57cc7 100644 --- a/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected +++ b/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected @@ -1,12 +1,12 @@ attachmentInstances -| active_storage.rb:11:1:11:25 | ... = ... | +| active_storage.rb:11:1:11:11 | user_avatar | | active_storage.rb:11:1:11:25 | ... = ... | | active_storage.rb:11:15:11:25 | call to avatar | | active_storage.rb:13:1:13:11 | user_avatar | | active_storage.rb:14:1:14:11 | user_avatar | | active_storage.rb:15:1:15:11 | user_avatar | | active_storage.rb:17:1:17:11 | call to avatar | -| active_storage.rb:19:1:19:42 | ... = ... | +| active_storage.rb:19:1:19:10 | attachment | | active_storage.rb:19:1:19:42 | ... = ... | | active_storage.rb:19:14:19:42 | call to new | | active_storage.rb:23:11:23:20 | attachment | 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 b84d576ad19..e10e038a7cc 100644 --- a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected +++ b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected @@ -1,122 +1,178 @@ failures | hash_extensions.rb:126:10:126:19 | call to sole | Unexpected result: hasValueFlow=b | edges -| active_support.rb:10:9:10:18 | call to source : | active_support.rb:11:10:11:10 | x : | +| 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:9:15:18 | call to source : | active_support.rb:16:10:16:10 | x : | +| 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:9:20:18 | call to source : | active_support.rb:21:10:21:10 | x : | +| 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:9:25:18 | call to source : | active_support.rb:26:10:26:10 | x : | +| 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:9:30:18 | call to source : | active_support.rb:31:10:31:10 | x : | +| 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:9:35:18 | call to source : | active_support.rb:36:10:36:10 | x : | +| 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:9:40:18 | call to source : | active_support.rb:41:10:41:10 | x : | +| 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:9:45:18 | call to source : | active_support.rb:46:10:46:10 | x : | +| 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:9:50:18 | call to source : | active_support.rb:51:10:51:10 | x : | +| 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:9:55:18 | call to source : | active_support.rb:56:10:56:10 | x : | +| 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:9:60:18 | call to source : | active_support.rb:61:10:61:10 | x : | +| 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:9:65:18 | call to source : | active_support.rb:66:10:66:10 | x : | +| 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:9:70:18 | call to source : | active_support.rb:71:10:71:10 | x : | +| 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:9:75:18 | call to source : | active_support.rb:76:10:76:10 | x : | +| 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:9:80:18 | call to source : | active_support.rb:81:10:81:10 | x : | +| 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:9:85:18 | call to source : | active_support.rb:86:10:86:10 | x : | +| 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:9:90:18 | call to source : | active_support.rb:91:10:91:10 | x : | +| 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:9:95:18 | call to source : | active_support.rb:96:10:96:10 | x : | +| 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:9:100:18 | call to source : | active_support.rb:101:10:101:10 | x : | +| 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:9:105:18 | call to source : | active_support.rb:106:10:106:10 | x : | +| 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:9:110:18 | call to source : | active_support.rb:111:10:111:10 | x : | +| 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:9:115:18 | call to source : | active_support.rb:116:10:116:10 | x : | +| 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:9:120:18 | call to source : | active_support.rb:121:10:121:10 | x : | +| 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:9:125:18 | call to source : | active_support.rb:126:10:126:10 | x : | +| 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:9:130:18 | call to source : | active_support.rb:131:10:131:10 | x : | +| 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:9:135:18 | call to source : | active_support.rb:136:10:136:10 | x : | +| 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:9:140:18 | call to source : | active_support.rb:141:10:141:10 | x : | +| 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:9:145:18 | call to source : | active_support.rb:146:10:146:10 | x : | +| 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:9:150:18 | call to source : | active_support.rb:151:10:151:10 | x : | +| 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:9:155:18 | call to source : | active_support.rb:156:10:156:10 | x : | +| 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:9:160:18 | call to source : | active_support.rb:161:10:161:10 | x : | +| 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:9:165:18 | call to source : | active_support.rb:166:10:166:10 | x : | +| 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:9:170:18 | call to source : | active_support.rb:171:10:171:10 | x : | +| 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:9:175:18 | call to source : | active_support.rb:176:10:176:10 | x : | +| 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:10:180:17 | call to source : | active_support.rb:181:9:181:9 | x [element 0] : | -| active_support.rb:180:10:180:17 | call to source : | 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: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:182:10:182:10 | y [element] : | -| active_support.rb:181:9:181:23 | call to compact_blank [element] : | active_support.rb:182:10:182:10 | 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: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:10:186:18 | call to source : | active_support.rb:187:9:187:9 | x [element 0] : | -| active_support.rb:186:10:186:18 | call to source : | 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: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:188:10:188:10 | y [element] : | -| active_support.rb:187:9:187:21 | call to excluding [element] : | active_support.rb:188:10:188:10 | 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: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:10:192:18 | call to source : | active_support.rb:193:9:193:9 | x [element 0] : | -| active_support.rb:192:10:192:18 | call to source : | 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: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:194:10:194:10 | y [element] : | -| active_support.rb:193:9:193:19 | call to without [element] : | active_support.rb:194:10:194:10 | 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: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:10:198:18 | call to source : | active_support.rb:199:9:199:9 | x [element 0] : | -| active_support.rb:198:10:198:18 | call to source : | 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: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:200:10:200:10 | y [element] : | -| active_support.rb:199:9:199:37 | call to in_order_of [element] : | active_support.rb:200:10:200:10 | 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: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:10:204:18 | call to source : | active_support.rb:205:9:205:9 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:205:9:205:9 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:206:10:206:10 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:206:10:206:10 | 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: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:208:10:208:10 | b [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element 0] : | active_support.rb:208:10:208:10 | b [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:208:10:208:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:208:10:208:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:209:10:209:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:209:10:209:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:210:10:210:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:210:10:210:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:211:10:211:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:211:10:211:10 | b [element] : | +| 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] : | @@ -133,130 +189,202 @@ edges | 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:7:215:16 | call to source : | active_support.rb:216:34:216:34 | x : | -| active_support.rb:216:7:216:35 | call to new : | active_support.rb:217:8:217:8 | y | +| 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:7:222:16 | call to source : | active_support.rb:223:21:223:21 | b : | -| active_support.rb:223:7:223:22 | call to safe_concat : | active_support.rb:224:8:224:8 | y | +| 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:7:229:16 | call to source : | active_support.rb:230:17:230:17 | b : | +| 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:7:235:16 | call to source : | active_support.rb:237:34:237:34 | a : | -| active_support.rb:237:7:237:35 | call to new : | active_support.rb:238:7:238:7 | 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:239:8:239:8 | y | -| active_support.rb:243:7:243:16 | call to source : | active_support.rb:245:34:245:34 | a : | -| active_support.rb:245:7:245:35 | call to new : | active_support.rb:246:7:246:7 | x : | +| 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:247:8:247:8 | y | -| active_support.rb:251:7:251:16 | call to source : | active_support.rb:253:34:253:34 | a : | -| active_support.rb:253:7:253:35 | call to new : | active_support.rb:254:7:254:7 | x : | +| 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:255:8:255:8 | y | -| active_support.rb:259:7:259:16 | call to source : | active_support.rb:260:34:260:34 | a : | -| active_support.rb:260:7:260:35 | call to new : | active_support.rb:261:7:261:7 | x : | +| 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:262:8:262:8 | y | -| active_support.rb:266:7:266:16 | call to source : | active_support.rb:267:34:267:34 | a : | -| active_support.rb:267:7:267:35 | call to new : | active_support.rb:268:7:268:7 | x : | +| 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:269:8:269:8 | y | -| active_support.rb:273:7:273:16 | call to source : | active_support.rb:274:20:274:20 | a : | -| active_support.rb:274:7:274:21 | call to new : | active_support.rb:275:7:275:7 | x : | +| 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:276:8:276:8 | y | -| active_support.rb:275:7:275:17 | call to existence : | active_support.rb:277:7:277:7 | y : | +| 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:278:8:278:8 | z | -| active_support.rb:282:7:282:16 | call to source : | active_support.rb:283:8:283:8 | x : | -| active_support.rb:282:7:282:16 | call to source : | active_support.rb:283:8:283:8 | x : | +| 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:7:285:16 | call to source : | active_support.rb:286:8:286:8 | y : | -| active_support.rb:285:7:285:16 | call to source : | 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: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:7:290:16 | call to source : | active_support.rb:291:8:291:8 | x : | -| active_support.rb:290:7:290:16 | call to source : | 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: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:7:303:16 | call to source : | active_support.rb:304:19:304:19 | a : | -| active_support.rb:304:7:304:19 | call to json_escape : | active_support.rb:305:8:305:8 | b | +| 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:9:309:18 | call to source : | active_support.rb:310:37:310:37 | x : | +| 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:9:314:18 | call to source : | active_support.rb:315:37:315:37 | x : | +| 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:9:319:18 | call to source : | active_support.rb:320:35:320:35 | x : | +| 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:9:324:18 | call to source : | active_support.rb:325:35:325:35 | x : | +| 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:9:329:18 | call to source : | active_support.rb:330:10:330:10 | x : | -| active_support.rb:329:9:329:18 | call to source : | active_support.rb:331:10:331:10 | x : | -| active_support.rb:330:10:330:10 | x : | active_support.rb:332:10:332:10 | y [element 0] : | +| 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:14:2:24 | call to source : | hash_extensions.rb:3:9:3:9 | h [element :a] : | -| hash_extensions.rb:2:14:2:24 | call to source : | 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: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:4:10:4:10 | x [element] : | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | hash_extensions.rb:4:10:4:10 | 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: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:14:10:24 | call to source : | hash_extensions.rb:11:9:11:9 | h [element :a] : | -| hash_extensions.rb:10:14:10:24 | call to source : | 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: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:12:10:12:10 | x [element] : | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | hash_extensions.rb:12:10:12:10 | 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: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:14:18:24 | call to source : | hash_extensions.rb:19:9:19:9 | h [element :a] : | -| hash_extensions.rb:18:14:18:24 | call to source : | 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: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:20:10:20:10 | x [element] : | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | hash_extensions.rb:20:10:20:10 | 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: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:14:26:24 | call to source : | hash_extensions.rb:27:9:27:9 | h [element :a] : | -| hash_extensions.rb:26:14:26:24 | call to source : | 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: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:28:10:28:10 | x [element] : | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | hash_extensions.rb:28:10:28:10 | 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: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:14:34:24 | call to source : | hash_extensions.rb:35:9:35:9 | h [element :a] : | -| hash_extensions.rb:34:14:34:24 | call to source : | 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: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:36:10:36:10 | x [element] : | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | hash_extensions.rb:36:10:36:10 | 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: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:14:42:24 | call to source : | hash_extensions.rb:43:9:43:9 | h [element :a] : | -| hash_extensions.rb:42:14:42:24 | call to source : | 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: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:44:10:44:10 | x [element] : | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | hash_extensions.rb:44:10:44:10 | 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: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:14:50:23 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :a] : | -| hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :a] : | -| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :b] : | -| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :b] : | -| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :d] : | -| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :d] : | +| 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] : | @@ -265,22 +393,32 @@ edges | 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:58:10:58:10 | x [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | hash_extensions.rb:58:10:58:10 | x [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | +| 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:15:67:25 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 0] : | -| hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 0] : | -| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 1] : | -| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 1] : | -| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 2] : | -| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 2] : | +| 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 : | @@ -293,32 +431,38 @@ edges | 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:73:10:73:10 | h [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:73:10:73:10 | h [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:74:10:74:10 | h [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:74:10:74:10 | 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: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:15:80:25 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 0] : | -| hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 0] : | -| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 1] : | -| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 1] : | -| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 2] : | -| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 2] : | +| 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:86:10:86:10 | h [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:86:10:86:10 | h [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:87:10:87:10 | h [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:87:10:87:10 | 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: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] : | @@ -327,28 +471,34 @@ edges | 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:9:89:38 | call to index_with [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [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:92:10:92: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: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:21:98:31 | call to source : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | +| 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 | @@ -369,26 +519,34 @@ edges | 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:21:110:31 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | +| 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] : | @@ -427,119 +585,161 @@ edges | 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:15:122:25 | call to source : | hash_extensions.rb:125:10:125:15 | single [element 0] : | -| hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:125:10:125:15 | single [element 0] : | -| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:126:10:126:14 | multi [element 0] : | -| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:126:10:126:14 | multi [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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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] : | @@ -548,8 +748,12 @@ nodes | 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] : | @@ -558,8 +762,12 @@ nodes | 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] : | @@ -568,8 +776,12 @@ nodes | 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] : | @@ -578,8 +790,14 @@ nodes | 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] : | @@ -612,99 +830,141 @@ nodes | 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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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: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] : | @@ -713,8 +973,12 @@ nodes | 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] : | @@ -723,8 +987,12 @@ nodes | 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] : | @@ -733,8 +1001,12 @@ nodes | 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] : | @@ -743,8 +1015,12 @@ nodes | 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] : | @@ -753,8 +1029,12 @@ nodes | 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] : | @@ -763,12 +1043,22 @@ nodes | 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] : | @@ -793,12 +1083,20 @@ nodes | 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] : | @@ -819,12 +1117,20 @@ nodes | 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] : | @@ -847,6 +1153,8 @@ nodes | 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 : | @@ -859,6 +1167,10 @@ nodes | 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 : | @@ -895,6 +1207,14 @@ nodes | 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 : | @@ -951,8 +1271,12 @@ nodes | 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] : | diff --git a/ruby/ql/test/library-tests/frameworks/files/Files.expected b/ruby/ql/test/library-tests/frameworks/files/Files.expected index bebb93ef371..b75acc54c5b 100644 --- a/ruby/ql/test/library-tests/frameworks/files/Files.expected +++ b/ruby/ql/test/library-tests/frameworks/files/Files.expected @@ -1,8 +1,8 @@ fileInstances -| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:1:2:8 | foo_file | | Files.rb:2:1:2:36 | ... = ... | | Files.rb:2:12:2:36 | call to new | -| Files.rb:3:1:3:21 | ... = ... | +| Files.rb:3:1:3:10 | foo_file_2 | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:14:3:21 | foo_file | | Files.rb:4:1:4:8 | foo_file | @@ -18,17 +18,17 @@ fileInstances | Files.rb:40:1:40:8 | foo_file | | Files.rb:41:1:41:26 | call to open | ioInstances -| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:1:2:8 | foo_file | | Files.rb:2:1:2:36 | ... = ... | | Files.rb:2:12:2:36 | call to new | -| Files.rb:3:1:3:21 | ... = ... | +| Files.rb:3:1:3:10 | foo_file_2 | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:14:3:21 | foo_file | | Files.rb:4:1:4:8 | foo_file | | Files.rb:7:13:7:22 | foo_file_2 | | Files.rb:10:6:10:13 | foo_file | | Files.rb:11:6:11:13 | foo_file | -| Files.rb:17:1:17:50 | ... = ... | +| Files.rb:17:1:17:4 | rand | | Files.rb:17:1:17:50 | ... = ... | | Files.rb:17:8:17:50 | call to new | | Files.rb:18:1:18:13 | ... = ... | @@ -44,7 +44,7 @@ ioInstances | Files.rb:37:14:37:33 | call to open | | Files.rb:40:1:40:8 | foo_file | | Files.rb:41:1:41:26 | call to open | -| Files.rb:44:1:44:45 | ... = ... | +| Files.rb:44:1:44:7 | io_file | | Files.rb:44:1:44:45 | ... = ... | | Files.rb:44:11:44:45 | call to open | | Files.rb:48:1:48:7 | io_file | diff --git a/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected b/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected index c69247ae5f8..d082076be69 100644 --- a/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected +++ b/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected @@ -1,21 +1,21 @@ pathnameInstances -| Pathname.rb:2:1:2:33 | ... = ... | +| Pathname.rb:2:1:2:8 | foo_path | | Pathname.rb:2:1:2:33 | ... = ... | | Pathname.rb:2:12:2:33 | call to new | | Pathname.rb:3:1:3:20 | ... = ... | | Pathname.rb:3:13:3:20 | foo_path | | Pathname.rb:4:1:4:8 | foo_path | -| Pathname.rb:6:1:6:29 | ... = ... | +| Pathname.rb:6:1:6:8 | bar_path | | Pathname.rb:6:1:6:29 | ... = ... | | Pathname.rb:6:12:6:29 | call to new | -| Pathname.rb:9:1:9:21 | ... = ... | +| Pathname.rb:9:1:9:4 | pwd1 | | Pathname.rb:9:1:9:21 | ... = ... | | Pathname.rb:9:8:9:21 | call to getwd | | Pathname.rb:10:1:10:21 | ... = ... | | Pathname.rb:10:7:10:10 | pwd1 | | Pathname.rb:10:7:10:21 | ... + ... | | Pathname.rb:10:14:10:21 | foo_path | -| Pathname.rb:11:1:11:21 | ... = ... | +| Pathname.rb:11:1:11:3 | p01 | | Pathname.rb:11:1:11:21 | ... = ... | | Pathname.rb:11:7:11:10 | pwd1 | | Pathname.rb:11:7:11:21 | ... / ... | @@ -38,7 +38,7 @@ pathnameInstances | Pathname.rb:17:1:17:59 | ... = ... | | Pathname.rb:17:7:17:33 | call to new | | Pathname.rb:17:7:17:59 | call to relative_path_from | -| Pathname.rb:18:1:18:33 | ... = ... | +| Pathname.rb:18:1:18:3 | p08 | | Pathname.rb:18:1:18:33 | ... = ... | | Pathname.rb:18:7:18:10 | pwd1 | | Pathname.rb:18:7:18:33 | call to sub | @@ -75,23 +75,23 @@ fileSystemAccesses | Pathname.rb:35:1:35:23 | call to write | Pathname.rb:35:1:35:8 | foo_path | | Pathname.rb:39:12:39:34 | call to open | Pathname.rb:39:12:39:19 | foo_path | fileNameSources -| Pathname.rb:2:1:2:33 | ... = ... | +| Pathname.rb:2:1:2:8 | foo_path | | Pathname.rb:2:1:2:33 | ... = ... | | Pathname.rb:2:12:2:33 | call to new | | Pathname.rb:3:1:3:20 | ... = ... | | Pathname.rb:3:13:3:20 | foo_path | | Pathname.rb:4:1:4:8 | foo_path | -| Pathname.rb:6:1:6:29 | ... = ... | +| Pathname.rb:6:1:6:8 | bar_path | | Pathname.rb:6:1:6:29 | ... = ... | | Pathname.rb:6:12:6:29 | call to new | -| Pathname.rb:9:1:9:21 | ... = ... | +| Pathname.rb:9:1:9:4 | pwd1 | | Pathname.rb:9:1:9:21 | ... = ... | | Pathname.rb:9:8:9:21 | call to getwd | | Pathname.rb:10:1:10:21 | ... = ... | | Pathname.rb:10:7:10:10 | pwd1 | | Pathname.rb:10:7:10:21 | ... + ... | | Pathname.rb:10:14:10:21 | foo_path | -| Pathname.rb:11:1:11:21 | ... = ... | +| Pathname.rb:11:1:11:3 | p01 | | Pathname.rb:11:1:11:21 | ... = ... | | Pathname.rb:11:7:11:10 | pwd1 | | Pathname.rb:11:7:11:21 | ... / ... | @@ -114,7 +114,7 @@ fileNameSources | Pathname.rb:17:1:17:59 | ... = ... | | Pathname.rb:17:7:17:33 | call to new | | Pathname.rb:17:7:17:59 | call to relative_path_from | -| Pathname.rb:18:1:18:33 | ... = ... | +| Pathname.rb:18:1:18:3 | p08 | | Pathname.rb:18:1:18:33 | ... = ... | | Pathname.rb:18:7:18:10 | pwd1 | | Pathname.rb:18:7:18:33 | call to sub | diff --git a/ruby/ql/test/library-tests/variables/ssa.expected b/ruby/ql/test/library-tests/variables/ssa.expected index 2f6d07b9915..a285f5f8cc4 100644 --- a/ruby/ql/test/library-tests/variables/ssa.expected +++ b/ruby/ql/test/library-tests/variables/ssa.expected @@ -22,29 +22,29 @@ definition | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | | parameters.rb:1:1:62:1 | self (parameters.rb) | parameters.rb:1:1:62:1 | self | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | @@ -64,23 +64,23 @@ definition | parameters.rb:35:1:38:3 | | parameters.rb:35:16:35:16 | b | | parameters.rb:35:1:38:3 | self (multi) | parameters.rb:35:1:38:3 | self | | parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | -| parameters.rb:35:16:35:20 | ... = ... | parameters.rb:35:16:35:16 | b | +| parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | | parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | | parameters.rb:40:1:43:3 | | parameters.rb:40:15:40:15 | e | | parameters.rb:40:1:43:3 | self (multi2) | parameters.rb:40:1:43:3 | self | | parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | -| parameters.rb:40:15:40:19 | ... = ... | parameters.rb:40:15:40:15 | e | +| parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | | parameters.rb:45:1:47:3 | self (dup_underscore) | parameters.rb:45:1:47:3 | self | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | | parameters.rb:49:1:51:3 | self (tuples) | parameters.rb:49:1:51:3 | self | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | -| parameters.rb:53:1:53:6 | ... = ... | parameters.rb:53:1:53:1 | x | +| parameters.rb:53:1:53:1 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | | parameters.rb:54:9:57:3 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | -| parameters.rb:54:19:54:23 | ... = ... | parameters.rb:53:1:53:1 | x | +| parameters.rb:54:19:54:19 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | @@ -88,80 +88,80 @@ definition | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | | scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:9:1:18:3 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | | scopes.rb:26:1:26:12 | self (A) | scopes.rb:26:1:26:12 | self | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | | scopes.rb:28:1:30:3 | self (B) | scopes.rb:28:1:30:3 | self | -| scopes.rb:29:3:29:7 | ... = ... | scopes.rb:29:3:29:3 | x | -| scopes.rb:32:3:32:7 | ... = ... | scopes.rb:32:3:32:3 | x | +| scopes.rb:29:3:29:3 | x | scopes.rb:29:3:29:3 | x | +| scopes.rb:32:3:32:3 | x | scopes.rb:32:3:32:3 | x | | scopes.rb:34:1:36:3 | self (C) | scopes.rb:34:1:36:3 | self | -| scopes.rb:35:3:35:7 | ... = ... | scopes.rb:35:3:35:3 | x | +| scopes.rb:35:3:35:3 | x | scopes.rb:35:3:35:3 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | -| scopes.rb:43:2:43:13 | ... = ... | scopes.rb:43:2:43:4 | foo | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | +| scopes.rb:43:2:43:4 | foo | scopes.rb:43:2:43:4 | foo | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | -| ssa.rb:21:5:21:10 | ... = ... | ssa.rb:18:8:18:8 | x | +| ssa.rb:21:5:21:5 | x | ssa.rb:18:8:18:8 | x | | ssa.rb:25:1:30:3 | | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:32:1:36:3 | self (m3) | ssa.rb:32:1:36:3 | self | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | | ssa.rb:44:1:47:3 | | ssa.rb:45:3:45:3 | x | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | -| ssa.rb:45:3:45:7 | ... = ... | ssa.rb:45:3:45:3 | x | +| ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:3 | x | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | | ssa.rb:49:1:51:3 | | ssa.rb:49:14:49:14 | y | | ssa.rb:49:1:51:3 | self (m6) | ssa.rb:49:1:51:3 | self | -| ssa.rb:49:14:49:19 | ... = ... | ssa.rb:49:14:49:14 | y | +| ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:14 | y | | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | -| ssa.rb:65:3:65:15 | ... = ... | ssa.rb:65:3:65:10 | captured | +| ssa.rb:65:3:65:10 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:66:11:70:5 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:66:11:70:5 | self | ssa.rb:64:1:72:3 | self | | ssa.rb:66:15:66:15 | a | ssa.rb:66:15:66:15 | a | -| ssa.rb:69:5:69:17 | ... = ... | ssa.rb:65:3:65:10 | captured | +| ssa.rb:69:5:69:12 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:74:1:79:3 | self (m10) | ssa.rb:74:1:79:3 | self | -| ssa.rb:75:3:75:14 | ... = ... | ssa.rb:75:3:75:10 | captured | +| ssa.rb:75:3:75:10 | captured | ssa.rb:75:3:75:10 | captured | | ssa.rb:76:7:78:5 | captured | ssa.rb:75:3:75:10 | captured | | ssa.rb:76:7:78:5 | self | ssa.rb:74:1:79:3 | self | | ssa.rb:81:1:88:3 | self (m11) | ssa.rb:81:1:88:3 | self | -| ssa.rb:82:3:82:14 | ... = ... | ssa.rb:82:3:82:10 | captured | +| ssa.rb:82:3:82:10 | captured | ssa.rb:82:3:82:10 | captured | | ssa.rb:83:7:87:5 | self | ssa.rb:81:1:88:3 | self | | ssa.rb:84:10:86:8 | captured | ssa.rb:82:3:82:10 | captured | | ssa.rb:84:10:86:8 | self | ssa.rb:81:1:88:3 | self | @@ -170,7 +170,7 @@ definition | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | read | class_variables.rb:1:1:29:4 | self (class_variables.rb) | class_variables.rb:1:1:29:4 | self | class_variables.rb:3:1:3:5 | self | | class_variables.rb:5:1:7:3 | self (print) | class_variables.rb:5:1:7:3 | self | class_variables.rb:6:2:6:6 | self | @@ -199,20 +199,20 @@ read | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | instance_variables.rb:39:6:39:7 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | nested_scopes.rb:2:3:2:17 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | nested_scopes.rb:38:3:38:8 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | nested_scopes.rb:36:5:36:10 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:27:11:27:14 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:30:16:30:19 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:34:7:34:12 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | nested_scopes.rb:25:9:25:14 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:14:11:14:16 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:16:13:16:13 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:34:18:34 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:18:29:18:34 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | @@ -220,12 +220,12 @@ read | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:16:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:4:4:4:9 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:3:9:3:9 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:9:5:9:33 | self | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:11:5:11:49 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | @@ -269,8 +269,8 @@ read | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:4:3:9 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:9:3:9 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:5:4:5:9 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:11:4:11:4 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:10:4:10:9 | self | @@ -279,24 +279,24 @@ read | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:15:4:15:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:16:4:16:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:17:4:17:9 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:7:5:7:10 | self | @@ -305,29 +305,29 @@ read | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:12:5:12:14 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:15:3:15:8 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | ssa.rb:27:5:27:13 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:29:8:29:11 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | ssa.rb:34:5:34:10 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | ssa.rb:34:10:34:10 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:3:39:9 | self | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:8:39:9 | self | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:41:3:41:13 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | ssa.rb:46:3:46:8 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | @@ -335,10 +335,10 @@ read | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | ssa.rb:55:3:55:8 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | ssa.rb:61:3:61:8 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | ssa.rb:71:3:71:15 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | ssa.rb:66:3:66:3 | a | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:71:8:71:15 | captured | @@ -362,10 +362,10 @@ read | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | ssa.rb:94:10:94:11 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | ssa.rb:98:7:98:8 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | ssa.rb:100:10:100:11 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | firstRead | class_variables.rb:1:1:29:4 | self (class_variables.rb) | class_variables.rb:1:1:29:4 | self | class_variables.rb:3:1:3:5 | self | | class_variables.rb:5:1:7:3 | self (print) | class_variables.rb:5:1:7:3 | self | class_variables.rb:6:2:6:6 | self | @@ -387,28 +387,28 @@ firstRead | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | instance_variables.rb:39:6:39:7 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | nested_scopes.rb:2:3:2:17 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | nested_scopes.rb:38:3:38:8 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | nested_scopes.rb:36:5:36:10 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:27:11:27:14 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | nested_scopes.rb:25:9:25:14 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:14:11:14:16 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:16:13:16:13 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:34:18:34 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:18:29:18:34 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:3:9:3:9 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:9:5:9:33 | self | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:11:5:11:49 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | @@ -447,39 +447,39 @@ firstRead | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | parameters.rb:60:21:60:21 | c | | scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | scopes.rb:8:1:8:6 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:4:3:9 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:10:4:10:9 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | ssa.rb:27:5:27:13 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:29:8:29:11 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | ssa.rb:34:5:34:10 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | ssa.rb:34:10:34:10 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:3:39:9 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | ssa.rb:46:3:46:8 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | @@ -487,10 +487,10 @@ firstRead | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | ssa.rb:55:3:55:8 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | ssa.rb:61:3:61:8 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | ssa.rb:71:3:71:15 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | ssa.rb:66:3:66:3 | a | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:71:8:71:15 | captured | @@ -512,10 +512,10 @@ firstRead | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | ssa.rb:94:10:94:11 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | ssa.rb:98:7:98:8 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | ssa.rb:100:10:100:11 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | lastRead | class_variables.rb:1:1:29:4 | self (class_variables.rb) | class_variables.rb:1:1:29:4 | self | class_variables.rb:3:1:3:5 | self | | class_variables.rb:5:1:7:3 | self (print) | class_variables.rb:5:1:7:3 | self | class_variables.rb:6:2:6:6 | self | @@ -537,28 +537,28 @@ lastRead | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | instance_variables.rb:39:6:39:7 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | nested_scopes.rb:2:3:2:17 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | nested_scopes.rb:38:3:38:8 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | nested_scopes.rb:36:5:36:10 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:34:7:34:12 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | nested_scopes.rb:25:9:25:14 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:14:11:14:16 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:16:13:16:13 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:34:18:34 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:18:29:18:34 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:16:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:4:4:4:9 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:3:9:3:9 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:9:5:9:33 | self | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:11:5:11:49 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | @@ -597,40 +597,40 @@ lastRead | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | parameters.rb:60:21:60:21 | c | | scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | scopes.rb:8:1:8:6 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:5:4:5:9 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:11:4:11:4 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:17:4:17:9 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:15:3:15:8 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | ssa.rb:27:5:27:13 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:29:8:29:11 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | ssa.rb:34:5:34:10 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | ssa.rb:34:10:34:10 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:41:3:41:13 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | ssa.rb:46:3:46:8 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | @@ -638,10 +638,10 @@ lastRead | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | ssa.rb:55:3:55:8 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | ssa.rb:61:3:61:8 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | ssa.rb:71:3:71:15 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | ssa.rb:66:3:66:3 | a | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:71:8:71:15 | captured | @@ -663,10 +663,10 @@ lastRead | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | ssa.rb:94:10:94:11 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | ssa.rb:98:7:98:8 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | ssa.rb:100:10:100:11 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | adjacentReads | class_variables.rb:26:1:29:3 | self (N) | class_variables.rb:26:1:29:3 | self | class_variables.rb:27:3:27:11 | self | class_variables.rb:28:3:28:7 | self | | instance_variables.rb:1:1:44:4 | self (instance_variables.rb) | instance_variables.rb:1:1:44:4 | self | instance_variables.rb:1:1:1:4 | self | instance_variables.rb:11:1:11:9 | self | @@ -677,7 +677,7 @@ adjacentReads | instance_variables.rb:37:3:43:5 | self (x) | instance_variables.rb:37:3:43:5 | self | instance_variables.rb:42:4:42:7 | self | instance_variables.rb:42:6:42:7 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:27:11:27:14 | self | nested_scopes.rb:30:16:30:19 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:30:16:30:19 | self | nested_scopes.rb:34:7:34:12 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | nested_scopes.rb:15:11:15:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | nested_scopes.rb:15:11:15:11 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | nested_scopes.rb:28:16:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:30:16:30:19 | self | nested_scopes.rb:32:11:32:16 | self | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | parameters.rb:4:4:4:9 | self | @@ -693,13 +693,13 @@ adjacentReads | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:14:4:14:9 | self | scopes.rb:15:4:15:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:15:4:15:9 | self | scopes.rb:16:4:16:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:16:4:16:9 | self | scopes.rb:17:4:17:9 | self | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | scopes.rb:31:10:31:10 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | scopes.rb:34:14:34:14 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | scopes.rb:37:5:37:5 | x | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | scopes.rb:31:10:31:10 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | scopes.rb:34:14:34:14 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | scopes.rb:37:5:37:5 | x | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | ssa.rb:4:3:4:12 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | ssa.rb:7:5:7:10 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | ssa.rb:11:5:11:10 | self | @@ -707,9 +707,9 @@ adjacentReads | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:8:5:8:14 | self | ssa.rb:15:3:15:8 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:11:5:11:10 | self | ssa.rb:12:5:12:14 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:12:5:12:14 | self | ssa.rb:15:3:15:8 | self | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | ssa.rb:4:8:4:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | ssa.rb:8:10:8:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | ssa.rb:12:10:12:10 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | ssa.rb:4:8:4:8 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | ssa.rb:8:10:8:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | ssa.rb:20:10:20:10 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x | @@ -721,25 +721,25 @@ adjacentReads | ssa.rb:90:1:103:3 | self (m12) | ssa.rb:90:1:103:3 | self | ssa.rb:93:5:93:10 | self | ssa.rb:101:5:101:10 | self | | ssa.rb:90:1:103:3 | self (m12) | ssa.rb:90:1:103:3 | self | ssa.rb:95:5:95:10 | self | ssa.rb:99:5:99:10 | self | | ssa.rb:90:1:103:3 | self (m12) | ssa.rb:90:1:103:3 | self | ssa.rb:95:5:95:10 | self | ssa.rb:101:5:101:10 | self | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:101:10:101:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:101:10:101:10 | x | phi | parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | | -| parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:20 | ... = ... | +| parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | | -| parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:19 | ... = ... | +| parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | | parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | x | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:23 | ... = ... | -| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:9 | ... = ... | -| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:9 | ... = ... | +| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:19 | x | +| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:5 | i | +| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:5 | i | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:10 | ... = ... | +| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:44:1:47:3 | | -| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:7 | ... = ... | +| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:3 | x | | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | | -| ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:19 | ... = ... | +| ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:14 | y | phiReadNode | parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:1:1:16:3 | self | @@ -763,7 +763,7 @@ phiReadInput | ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:19:9:19:9 | SSA phi read(self) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self (m12) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:94:3:95:10 | SSA phi read(self) | -| ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:7 | ... = ... | +| ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:94:3:95:10 | SSA phi read(x) | | ssa.rb:94:3:95:10 | SSA phi read(self) | ssa.rb:90:1:103:3 | self (m12) | -| ssa.rb:94:3:95:10 | SSA phi read(x) | ssa.rb:91:3:91:7 | ... = ... | +| ssa.rb:94:3:95:10 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | diff --git a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected index 7f7e0a5bbe4..a3e20d71b20 100644 --- a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected +++ b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected @@ -1,30 +1,36 @@ 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:11:11:11:14 | name : | -| ErbInjection.rb:5:12:5:24 | ...[...] : | ErbInjection.rb:15:24:15:31 | bad_text | -| ErbInjection.rb:8:16:11:14 | ... % ... : | ErbInjection.rb:15:24:15:31 | bad_text | +| 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:8:5:11:14 | ... = ... : | -| SlimInjection.rb:5:12:5:24 | ...[...] : | SlimInjection.rb:11:11:11:14 | name : | -| SlimInjection.rb:5:12:5:24 | ...[...] : | SlimInjection.rb:17:5:20:7 | ... = ... : | -| SlimInjection.rb:8:5:11:14 | ... = ... : | SlimInjection.rb:14:25:14:32 | bad_text | -| SlimInjection.rb:8:16:11:14 | ... % ... : | SlimInjection.rb:8:5:11:14 | ... = ... : | +| 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:20:7 | ... = ... : | SlimInjection.rb:23:25:23:33 | bad2_text | +| 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: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:11:14 | ... = ... : | 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:20:7 | ... = ... : | semmle.label | ... = ... : | +| 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 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 4b7ace007ed..ca200083a96 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,5 +1,6 @@ edges -| zip_slip.rb:8:15:8:54 | call to new : | zip_slip.rb:9:5:9:11 | tarfile : | +| 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 : | @@ -10,15 +11,20 @@ edges | 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:12:90:54 | call to open : | zip_slip.rb:91:11:91:14 | gzip : | +| 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:100:21:100:30 | entry_path | -| zip_slip.rb:123:12:123:34 | call to new : | zip_slip.rb:124:7:124:8 | gz : | +| 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:126:21:126:30 | entry_path | +| 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 : | @@ -34,15 +40,19 @@ nodes | 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: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:126:21:126:30 | entry_path | semmle.label | entry_path | subpaths #select 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 b7dff706a1f..b43c529946f 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,22 +1,32 @@ 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:12:8:12:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method : | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method : | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method : | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol : | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | +| 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: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: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: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: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:52:10:52:23 | ... == ... | semmle.label | ... == ... | | ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env : | semmle.label | call to env : | 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 5e05271252e..7d5598d1d49 100644 --- a/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected @@ -6,48 +6,62 @@ edges | 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:28:52:67 | call to join : | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | +| 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:5:26:5:29 | path | -| tainted_path.rb:10:12:10:43 | call to absolute_path : | tainted_path.rb:11:26:11:29 | path | +| 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:15:16:41 | call to dirname : | tainted_path.rb:17:26:17:29 | 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:12:22:41 | call to expand_path : | tainted_path.rb:23:26:23:29 | path | +| 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:12:28:34 | call to path : | tainted_path.rb:29:26:29:29 | 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:12:34:41 | call to realdirpath : | tainted_path.rb:35:26:35:29 | 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:12:40:38 | call to realpath : | tainted_path.rb:41:26:41:29 | path | +| 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:12:47:63 | call to join : | tainted_path.rb:48:26:48:29 | path | +| 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:12:59:53 | call to new : | tainted_path.rb:60:26:60:29 | path | +| 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:12:71:53 | call to new : | tainted_path.rb:72:15:72:18 | path | +| 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:12:77:53 | call to new : | tainted_path.rb:78:19:78:22 | path | -| tainted_path.rb:77:12:77:53 | call to new : | tainted_path.rb:79:14:79:17 | path | +| 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:12:84:53 | call to new : | tainted_path.rb:85:10:85:13 | path | -| tainted_path.rb:84:12:84:53 | call to new : | tainted_path.rb:86:25:86:28 | path | +| 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:12:90:53 | call to new : | tainted_path.rb:92:11:92:14 | path | +| 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 @@ -58,6 +72,7 @@ nodes | 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 | @@ -65,55 +80,68 @@ nodes | ArchiveApiPathTraversal.rb:68:20:68:23 | file | semmle.label | file | | 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: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: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: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: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: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: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: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: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: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: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: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: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 | ...[...] : | 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 dda603763e2..de8b527312e 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,25 +1,30 @@ 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:7:10:7:15 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:8:16:8:18 | cmd | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:10:14:10:16 | cmd | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:11:17:11:22 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:13:9:13:14 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:29:19:29:24 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:33:24:33:36 | "echo #{...}" | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:34:39:34:51 | "grep #{...}" | +| 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:50:24:50:36 | "echo #{...}" | +| 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:59:14:59:16 | cmd | +| 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:104:16:104:28 | "cat #{...}" | +| 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:7:10:7:15 | #{...} | semmle.label | #{...} | @@ -30,9 +35,11 @@ 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: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:59:14:59:16 | cmd | semmle.label | cmd | @@ -44,6 +51,7 @@ nodes | 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:104:16:104:28 | "cat #{...}" | semmle.label | "cat #{...}" | 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 1a7088fcbe8..b64fd8c416f 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,17 +1,19 @@ 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:4:10:4:13 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:5:13:5:16 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:6:14:6:17 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:7:16:7:19 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:8:17:8:20 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:9:16:9:19 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:10:18:10:21 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:11:14:11:17 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:13:23:13:26 | file : | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:26:10:26:13 | file | +| 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:4:10:4:13 | file | semmle.label | file | 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 55e0ea7f42b..40062a572a1 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected @@ -8,9 +8,10 @@ edges | 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:19:22:19:23 | dt : | -| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | +| 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 | ... = ... | @@ -20,8 +21,9 @@ edges | 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:31:5:31:7 | str | +| 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 | ...[...] | @@ -41,6 +43,7 @@ nodes | 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 : | @@ -48,6 +51,7 @@ nodes | 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:31:5:31:7 | str | semmle.label | str | 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 3edc843ea2f..01a48d43371 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected @@ -1,6 +1,7 @@ edges -| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | -| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | +| 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 | @@ -18,6 +19,7 @@ edges | 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 : | 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 cac3c53820c..a41722107d6 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -28,16 +28,21 @@ edges | 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:10:102:15 | call to params : | ActiveRecordInjection.rb:103:11:103:12 | ps : | +| 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:108:20:108:32 | ... + ... | +| 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:17:166:32 | call to permitted_params : | ActiveRecordInjection.rb:167:47:167:55 | my_params : | +| 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:168:37:168:41 | query | +| 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 : | @@ -47,8 +52,9 @@ edges | 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:6:20:6:61 | "SELECT * FROM users WHERE nam..." | +| 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 : | @@ -96,16 +102,21 @@ nodes | 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: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: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: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:168:37:168:41 | query | semmle.label | query | @@ -118,6 +129,7 @@ nodes | 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 | ...[...] : | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." | 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 53a181121c2..0c7a63915ed 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,26 +1,30 @@ 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:8:10:8:13 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:8:10:8:13 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:20:20:20:23 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:20:20:20:23 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:23:21:23:24 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:23:21:23:24 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:29:15:29:18 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:32:19:32:22 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:38:24:38:27 | code : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:38:24:38:27 | code : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:41:40:41:43 | code | +| 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:80:16:80:19 | code | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:86:10:86:37 | ... + ... | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:90:10:90:13 | code | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:90:10:90:13 | code | +| 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] : | @@ -36,6 +40,8 @@ edges | 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 | ...[...] : | @@ -55,6 +61,8 @@ nodes | 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 | ...[...] : | 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 1b55dd3c999..f57dd6a3e88 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 @@ -4,7 +4,8 @@ edges | 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:12:33:12 | x : | impl/unsafeCode.rb:34:10:34:12 | arr | +| 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 | @@ -13,10 +14,12 @@ edges | 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:11:60:18 | call to Array [element 0] : | impl/unsafeCode.rb:61:10:61:12 | arr | +| 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:64:10:64:13 | arr2 | +| 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 : | @@ -28,6 +31,7 @@ nodes | 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:34:10:34:12 | arr | semmle.label | arr | | impl/unsafeCode.rb:37:15:37:15 | x : | semmle.label | x : | @@ -41,9 +45,11 @@ nodes | 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: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 : | 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 b0da6305e8a..7f461d5efe1 100644 --- a/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected @@ -1,28 +1,30 @@ 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:16:19:16:29 | unsanitized | -| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | -| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | -| app/controllers/users_controller.rb:23:5:23:44 | ... = ... : | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | +| 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:44 | ... = ... : | -| app/controllers/users_controller.rb:23:20:23:44 | call to sub : | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | -| app/controllers/users_controller.rb:33:5:33:31 | ... = ... : | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | -| app/controllers/users_controller.rb:33:5:33:31 | ... = ... : | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | +| 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: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: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:44 | ... = ... : | 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: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: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 | 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 c428efe29cd..5341242ac8f 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,42 +1,49 @@ 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:10:5:10:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:11:5:11:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:12:5:12:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:13:5:13:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:14:5:14:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:15:5:15:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:16:5:16:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:17:5:17:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:18:5:18:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:19:5:19:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:20:5:20:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:21:5:21:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:22:5:22:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:23:17:23:20 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:24:18:24:21 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:42:10:42:13 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:47:10:47:13 | name | +| 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:28:5:28:5 | a | +| 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:30:5:30:5 | b | +| 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:32:5:32:5 | c | +| 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:56:38:56:41 | name : | -| PolynomialReDoS.rb:54:12:54:24 | ...[...] : | PolynomialReDoS.rb:58:37:58:40 | name : | +| 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:73:32:73:35 | name : | +| 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 | 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:10:5:10:8 | name | semmle.label | name | @@ -54,17 +61,21 @@ 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: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: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: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 : | @@ -73,6 +84,7 @@ nodes | PolynomialReDoS.rb:62:5:62:9 | 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 : | 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 80c434f8002..8318c0a8ec8 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,27 +1,37 @@ 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:5:13:5:21 | /#{...}/ | +| 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:11:13:11:27 | /foo#{...}bar/ | +| 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:17:24:17:27 | name | +| 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:23:24:23:33 | ... + ... | +| 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:55:28:55:37 | ... + ... | +| 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: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: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: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: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:55:28:55:37 | ... + ... | semmle.label | ... + ... | 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 0dba484c65a..532c7752905 100644 --- a/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected +++ b/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected @@ -1,7 +1,9 @@ edges -| StackTraceExposure.rb:11:10:11:17 | call to caller : | StackTraceExposure.rb:12:18:12:19 | 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:12:18:12:19 | bt | semmle.label | bt | | StackTraceExposure.rb:18:18:18:28 | call to backtrace | semmle.label | call to backtrace | 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 2931f4869c4..90968a06b2b 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected @@ -1,34 +1,45 @@ edges -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:6:20:6:27 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:8:21:8:28 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:10:21:10:28 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:12:21:12:28 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:14:23:14:30 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:16:20:16:27 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:19:33:19:40 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:21:44:21:51 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:23:33:23:40 | password | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:26:18:26:34 | "pw: #{...}" | -| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:28:26:28:33 | password | -| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : | logging.rb:38:20:38:23 | hsh1 [element :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:1:34:4 | [post] hsh2 [element :password] : | logging.rb:42:20:42:23 | hsh3 [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:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:68:35:68:65 | password_masked_ineffective_sub : | -| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | -| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | -| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | +| 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:74:20:74:50 | password_masked_ineffective_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:76:20:76:51 | password_masked_ineffective_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:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | logging.rb:88:5:88:16 | password_arg : | +| 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:6:20:6:27 | password | semmle.label | password | | logging.rb:8:21:8:28 | password | semmle.label | password | @@ -41,21 +52,29 @@ 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: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:34 | ...[...] | semmle.label | ...[...] | | 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:74:20:74:50 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | @@ -64,6 +83,7 @@ nodes | 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: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 : | subpaths 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 39f771ed08d..9f8f849b10a 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected @@ -1,51 +1,71 @@ edges -| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | 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:7:41:7:52 | new_password | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | 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: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 : | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:15:87:15:98 | 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:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | 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 : | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:21:83:21:94 | 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:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | 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:30:28:30:39 | new_password | -| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : | app/controllers/users_controller.rb:37:39:37:50 | new_password | -| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : | app/controllers/users_controller.rb:44:21:44:32 | new_password | -| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | 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:64:35:64:61 | "password: #{...}" | -| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : | app/models/user.rb:5:27:5:38 | new_password | -| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : | app/models/user.rb:11:22:11:33 | new_password | -| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : | app/models/user.rb:17:21:17:32 | 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: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: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: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: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: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: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: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: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: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: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:17:21:17:32 | new_password | semmle.label | new_password | subpaths 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 72c25575a21..38499665118 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,7 +1,9 @@ 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:14:22:14:30 | json_data | +| 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:14:22:14:30 | json_data | semmle.label | json_data | 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 fe4addd5d4d..13fe16295d9 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,53 +1,71 @@ edges -| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | UnsafeDeserialization.rb:11:27:11:41 | serialized_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:23:16:50 | call to decode64 : | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | +| 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:23:24:23:32 | json_data | +| 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:29:27:29:35 | json_data | +| 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:41:24:41:32 | yaml_data | +| 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:53:22:53:30 | json_data | -| UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | UnsafeDeserialization.rb:54:22:54:30 | json_data | +| 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:69:23:69:31 | json_data | +| 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:82:34:82:36 | xml | +| 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:88:25:88:33 | yaml_data | +| 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: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: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: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: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: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: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: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: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:88:25:88:33 | yaml_data | semmle.label | yaml_data | 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 a52134aa7db..cf3cc204cbd 100644 --- a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected +++ b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected @@ -1,22 +1,26 @@ 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:27:5:72 | "707574732822636f646520696e6a6..." : | tst.rb:7:8:7:30 | totally_harmless_string : | +| 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:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | tst.rb:17:6:17:32 | another_questionable_string : | +| 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: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: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:17:6:17:38 | call to strip | semmle.label | call to strip | diff --git a/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected b/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected index 005e2497be8..5fd00e43faf 100644 --- a/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected +++ b/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected @@ -1,7 +1,8 @@ edges | app/controllers/users_controller.rb:4:11:4:16 | call to params : | app/controllers/users_controller.rb:4:11:4:27 | ...[...] | +| app/controllers/users_controller.rb:9:5:9:12 | password : | app/controllers/users_controller.rb:10:42:10:49 | password | | app/controllers/users_controller.rb:9:16:9:21 | call to params : | app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | -| app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | app/controllers/users_controller.rb:10:42:10:49 | password | +| app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | app/controllers/users_controller.rb:9:5:9:12 | password : | | app/controllers/users_controller.rb:14:5:14:13 | [post] self [@password] : | app/controllers/users_controller.rb:15:42:15:50 | self [@password] : | | app/controllers/users_controller.rb:14:17:14:22 | call to params : | app/controllers/users_controller.rb:14:17:14:28 | ...[...] : | | app/controllers/users_controller.rb:14:17:14:28 | ...[...] : | app/controllers/users_controller.rb:14:5:14:13 | [post] self [@password] : | @@ -9,6 +10,7 @@ edges nodes | app/controllers/users_controller.rb:4:11:4:16 | call to params : | semmle.label | call to params : | | app/controllers/users_controller.rb:4:11:4:27 | ...[...] | semmle.label | ...[...] | +| app/controllers/users_controller.rb:9:5:9:12 | password : | semmle.label | password : | | app/controllers/users_controller.rb:9:16:9:21 | call to params : | semmle.label | call to params : | | app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | semmle.label | ...[...] : | | app/controllers/users_controller.rb:10:42:10:49 | password | semmle.label | password | 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 30f57223c4b..6e0473c62c8 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,10 +1,12 @@ 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:18:30:18:36 | content | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:19:19:19:25 | content | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:20:27:20:33 | content | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:21:34:21:40 | content | +| 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:18:30:18:36 | content | semmle.label | content | 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 442e5a9cfd4..638a3f3f805 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,30 +1,33 @@ 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:4:34:4:40 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:5:32:5:38 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:6:30:6:36 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:7:32:7:38 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:8:30:8:36 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:9:28:9:34 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:11:26:11:32 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:12:24:12:30 | content | +| 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:5:26:5:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:6:26:6:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:7:26:7:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:8:26:8:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:9:26:9:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:11:26:11:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:12:26:12:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:15:26:15:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:16:26:16:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:18:26:18:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:19:26:19:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:22:26:22:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:25:26:25:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:27:26:27:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:28:26:28:32 | content | +| 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:4:34:4:40 | content | semmle.label | content | @@ -35,6 +38,7 @@ 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:5:26:5:32 | content | semmle.label | content | 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 a7669549247..5df273f589f 100644 --- a/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected +++ b/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected @@ -1,17 +1,25 @@ edges -| FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:53:19:53:22 | perm | -| FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:56:19:56:23 | perm2 | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : | 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:53:19:53:22 | perm | semmle.label | perm | +| 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: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" | 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 51e45945d0f..4d358671e34 100644 --- a/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected +++ b/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected @@ -3,8 +3,11 @@ edges | 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:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | HardcodedCredentials.rb:23:19:23:20 | pw : | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : | HardcodedCredentials.rb:23:19:23:20 | pw : | +| 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 | @@ -19,8 +22,11 @@ nodes | 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..." : | 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 912900936a1..32b778130ef 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,16 +1,20 @@ 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:6:8:6:12 | check | +| 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:27:8:27:8 | p | +| 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: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: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:10:25:22 | ...[...] | semmle.label | ...[...] | | ConditionalBypass.rb:25:10:25:22 | ...[...] : | semmle.label | ...[...] : | 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 77e26750686..3562b7a8c98 100644 --- a/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected +++ b/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected @@ -1,10 +1,14 @@ failures edges -| 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" : | 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: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:33:15:33:17 | url | semmle.label | url | 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 ba8d776656b..1f26bdc2221 100644 --- a/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected +++ b/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected @@ -1,10 +1,14 @@ edges -| http_to_file_access.rb:3:8:3:52 | call to body : | http_to_file_access.rb:5:12:5:15 | resp | +| 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:11:18:11:23 | script | +| 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: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:11:18:11:23 | script | semmle.label | script | 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 1ac18b48554..906d4666020 100644 --- a/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected +++ b/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected @@ -1,9 +1,11 @@ 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:11:31:11:62 | "#{...}/logins" | +| 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:11:31:11:62 | "#{...}/logins" | semmle.label | "#{...}/logins" | 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 20ec5943541..265142d1ccd 100644 --- a/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected +++ b/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected @@ -1,8 +1,10 @@ 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:5:31:5:34 | path | +| 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:5:31:5:34 | path | semmle.label | path | diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index cf315546ed9..771960678f5 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/regex/change-notes/released/0.0.9.md b/shared/regex/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/regex/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index f688e4a8e28..245e2e6b546 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 0.0.9-dev +version: 0.0.10-dev groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index b051605d8b6..68bd110c267 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.13 + +No user-facing changes. + ## 0.0.12 No user-facing changes. diff --git a/shared/ssa/change-notes/released/0.0.13.md b/shared/ssa/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..f679eaf0313 --- /dev/null +++ b/shared/ssa/change-notes/released/0.0.13.md @@ -0,0 +1,3 @@ +## 0.0.13 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 997fb8da83c..044e54e4f7e 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.12 +lastReleaseVersion: 0.0.13 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index da55082c66b..573e0fdb8dc 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/ssa -version: 0.0.13-dev +version: 0.0.14-dev groups: shared library: true diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index c2a0dedaa8e..282cc1b4857 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/0.0.6.md b/shared/tutorial/change-notes/released/0.0.6.md new file mode 100644 index 00000000000..ccbce856079 --- /dev/null +++ b/shared/tutorial/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index bb45a1ab018..cf398ce02aa 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index b1958a441e0..529717d22d8 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.6-dev +version: 0.0.7-dev groups: shared library: true diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 8d859f9b9e6..9e7951e8ea8 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/0.0.6.md b/shared/typetracking/change-notes/released/0.0.6.md new file mode 100644 index 00000000000..ccbce856079 --- /dev/null +++ b/shared/typetracking/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index bb45a1ab018..cf398ce02aa 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index c1d91c841cb..59d5f4d66e1 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 0.0.6-dev +version: 0.0.7-dev groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 803a23bed1a..5c1e2e83225 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.13 + +No user-facing changes. + ## 0.0.12 No user-facing changes. diff --git a/shared/typos/change-notes/released/0.0.13.md b/shared/typos/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..f679eaf0313 --- /dev/null +++ b/shared/typos/change-notes/released/0.0.13.md @@ -0,0 +1,3 @@ +## 0.0.13 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 997fb8da83c..044e54e4f7e 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.12 +lastReleaseVersion: 0.0.13 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index e913e54cb72..ec9b54559f6 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/typos -version: 0.0.13-dev +version: 0.0.14-dev groups: shared library: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 152fb894277..3d405b525ea 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/util/change-notes/released/0.0.6.md b/shared/util/change-notes/released/0.0.6.md new file mode 100644 index 00000000000..ccbce856079 --- /dev/null +++ b/shared/util/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index bb45a1ab018..cf398ce02aa 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 27ebf28723d..9fe13ca503a 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 0.0.6-dev +version: 0.0.7-dev groups: shared library: true dependencies: diff --git a/swift/extractor/main.cpp b/swift/extractor/main.cpp index 8220f8a1164..bb4f1d775c2 100644 --- a/swift/extractor/main.cpp +++ b/swift/extractor/main.cpp @@ -1,5 +1,3 @@ -#include -#include #include #include #include @@ -18,7 +16,6 @@ #include "swift/extractor/invocation/SwiftInvocationExtractor.h" #include "swift/extractor/trap/TrapDomain.h" #include "swift/extractor/infra/file/Path.h" -#include using namespace std::string_literals; diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll index 617362ab4f0..865d7b4d6ce 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,15 +182,15 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ -module Make implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements GlobalFlowSig { + import Global +} + /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements GlobalFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll index c47b0308855..39dbf8dc075 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; @@ -3633,7 +3629,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3639,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3652,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4582,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4602,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..872ac8d4cb8 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,9 +33,9 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::GlobalFlowSig { + import Global +} + /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { + import GlobalWithState +} diff --git a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll index 6c2b446a422..75189283435 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll @@ -28,8 +28,13 @@ class TypeDecl extends Generated::TypeDecl { cached string getFullName() { not this.getEnclosingDecl() instanceof TypeDecl and + not this.getEnclosingDecl() instanceof ExtensionDecl and result = this.getName() or result = this.getEnclosingDecl().(TypeDecl).getFullName() + "." + this.getName() + or + result = + this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl().getFullName() + "." + + this.getName() } } diff --git a/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql b/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql index d7fd2e187de..48e53f50ab0 100644 --- a/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql +++ b/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql @@ -33,7 +33,7 @@ class ConstantPasswordSink extends Expr { ConstantPasswordSink() { // `password` arg in `init` is a sink exists(ClassOrStructDecl c, ConstructorDecl f, CallExpr call | - c.getFullName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and + c.getName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel("password").getExpr() = this @@ -41,7 +41,7 @@ class ConstantPasswordSink extends Expr { or // RNCryptor (labelled arguments) exists(ClassOrStructDecl c, MethodDecl f, CallExpr call | - c.getFullName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and + c.getName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel(["password", "withPassword", "forPassword"]).getExpr() = this diff --git a/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql b/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql index 71f379a77ad..e510acffe3a 100644 --- a/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql +++ b/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql @@ -34,7 +34,7 @@ class ConstantSaltSink extends Expr { ConstantSaltSink() { // `salt` arg in `init` is a sink exists(ClassOrStructDecl c, ConstructorDecl f, CallExpr call | - c.getFullName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and + c.getName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel("salt").getExpr() = this @@ -42,7 +42,7 @@ class ConstantSaltSink extends Expr { or // RNCryptor exists(ClassOrStructDecl c, MethodDecl f, CallExpr call | - c.getFullName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and + c.getName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel(["salt", "encryptionSalt", "hmacSalt", "HMACSalt"]).getExpr() = this diff --git a/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql b/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql index d8cb049ea50..310b038d3f3 100644 --- a/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql +++ b/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql @@ -34,7 +34,7 @@ class InsufficientHashIterationsSink extends Expr { InsufficientHashIterationsSink() { // `iterations` arg in `init` is a sink exists(ClassOrStructDecl c, ConstructorDecl f, CallExpr call | - c.getFullName() = ["PBKDF1", "PBKDF2"] and + c.getName() = ["PBKDF1", "PBKDF2"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel("iterations").getExpr() = this diff --git a/swift/ql/src/queries/Summary/SummaryStats.ql b/swift/ql/src/queries/Summary/SummaryStats.ql index 10dcc0c5199..444c4da2ca2 100644 --- a/swift/ql/src/queries/Summary/SummaryStats.ql +++ b/swift/ql/src/queries/Summary/SummaryStats.ql @@ -21,12 +21,12 @@ module TaintReachConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node node) { any() } } -module TaintReachFlow = TaintTracking::Make; +module TaintReachFlow = TaintTracking::Global; /** * Gets the total number of dataflow nodes that taint reaches (from any source). */ -int taintedNodesCount() { result = count(DataFlow::Node n | TaintReachFlow::hasFlowTo(n)) } +int taintedNodesCount() { result = count(DataFlow::Node n | TaintReachFlow::flowTo(n)) } /** * Gets the proportion of dataflow nodes that taint reaches (from any source), diff --git a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected index 649de8dd622..49d4c192730 100644 --- a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected +++ b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected @@ -1,8 +1,9 @@ | abstractfunctiondecl.swift:2:1:2:15 | func1() | getName:func1(), hasName:func1() | -| abstractfunctiondecl.swift:5:2:5:16 | func2() | MethodDecl, getName:func2(), hasName:func2(), hasQualifiedName(2):Class1.func2(), hasQualifiedName(3):abstractfunctiondecl.Class1.func2() | -| abstractfunctiondecl.swift:8:3:8:17 | func3() | MethodDecl, getName:func3(), hasName:func3(), hasQualifiedName(2):Class1.Class2.func3(), hasQualifiedName(3):abstractfunctiondecl.Class1.Class2.func3() | -| abstractfunctiondecl.swift:13:2:13:13 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Protocol1.func4(), hasQualifiedName(3):abstractfunctiondecl.Protocol1.func4() | -| abstractfunctiondecl.swift:17:2:17:16 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Class3.func4(), hasQualifiedName(3):abstractfunctiondecl.Class3.func4() | -| abstractfunctiondecl.swift:21:2:21:16 | func5() | MethodDecl, getName:func5(), hasName:func5(), hasQualifiedName(2):Class3.func5(), hasQualifiedName(3):abstractfunctiondecl.Class3.func5() | -| abstractfunctiondecl.swift:25:2:25:16 | func6() | MethodDecl, getName:func6(), hasName:func6(), hasQualifiedName(2):Struct1.func6(), hasQualifiedName(3):abstractfunctiondecl.Struct1.func6() | -| abstractfunctiondecl.swift:31:2:31:16 | func7() | MethodDecl, getName:func7(), hasName:func7(), hasQualifiedName(2):Enum1.func7(), hasQualifiedName(3):abstractfunctiondecl.Enum1.func7() | +| abstractfunctiondecl.swift:5:2:5:16 | func2() | MethodDecl, getName:func2(), hasName:func2(), hasQualifiedName(2):Class1.func2(), hasQualifiedName(3):abstractfunctiondecl.Class1.func2(), memberOf:Class1 | +| abstractfunctiondecl.swift:8:3:8:17 | func3() | MethodDecl, getName:func3(), hasName:func3(), hasQualifiedName(2):Class1.Class2.func3(), hasQualifiedName(3):abstractfunctiondecl.Class1.Class2.func3(), memberOf:Class1.Class2 | +| abstractfunctiondecl.swift:13:2:13:13 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Protocol1.func4(), hasQualifiedName(3):abstractfunctiondecl.Protocol1.func4(), memberOf:Protocol1 | +| abstractfunctiondecl.swift:17:2:17:16 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Class3.func4(), hasQualifiedName(3):abstractfunctiondecl.Class3.func4(), memberOf:Class3 | +| abstractfunctiondecl.swift:21:2:21:16 | func5() | MethodDecl, getName:func5(), hasName:func5(), hasQualifiedName(2):Class3.func5(), hasQualifiedName(3):abstractfunctiondecl.Class3.func5(), memberOf:Class3 | +| abstractfunctiondecl.swift:25:2:25:16 | func6() | MethodDecl, getName:func6(), hasName:func6(), hasQualifiedName(2):Struct1.func6(), hasQualifiedName(3):abstractfunctiondecl.Struct1.func6(), memberOf:Struct1 | +| abstractfunctiondecl.swift:31:2:31:16 | func7() | MethodDecl, getName:func7(), hasName:func7(), hasQualifiedName(2):Enum1.func7(), hasQualifiedName(3):abstractfunctiondecl.Enum1.func7(), memberOf:Enum1 | +| abstractfunctiondecl.swift:37:3:37:17 | func8() | MethodDecl, getName:func8(), hasName:func8(), hasQualifiedName(2):Class1.Class4.func8(), hasQualifiedName(3):abstractfunctiondecl.Class1.Class4.func8(), memberOf:Class1.Class4 | diff --git a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql index e3b3290890d..acd05cc4438 100644 --- a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql +++ b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql @@ -19,6 +19,10 @@ string describe(AbstractFunctionDecl f) { f.(MethodDecl).hasQualifiedName(a, b, c) and result = "hasQualifiedName(3):" + a + "." + b + "." + c ) + or + exists(Decl td | td.getAMember() = f | + result = "memberOf:" + td.asNominalTypeDecl().getFullName() + ) } from AbstractFunctionDecl f diff --git a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift index 881fb93b5c2..3e0cb330708 100644 --- a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift +++ b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift @@ -30,3 +30,10 @@ enum Enum1 { case case2 func func7() {} } + +extension Class1 +{ + class Class4 { + func func8() {} + } +} 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 0e46106d3f2..8f432710dc0 100644 --- a/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected +++ b/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected @@ -14,4 +14,4 @@ subpaths | 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: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. | \ No newline at end of file +| 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. |