diff --git a/.github/workflows/check-implicit-this.yml b/.github/workflows/check-implicit-this.yml index 8711d7955bc7f..14100ed332525 100644 --- a/.github/workflows/check-implicit-this.yml +++ b/.github/workflows/check-implicit-this.yml @@ -13,7 +13,7 @@ jobs: check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check that implicit this warnings is enabled for all packs shell: bash run: | diff --git a/.github/workflows/check-qldoc.yml b/.github/workflows/check-qldoc.yml index 6cb99154aa494..7996123e9bf3a 100644 --- a/.github/workflows/check-qldoc.yml +++ b/.github/workflows/check-qldoc.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 2 diff --git a/.github/workflows/check-query-ids.yml b/.github/workflows/check-query-ids.yml index 9ce9ed5ba85a8..9e84fe0b0e352 100644 --- a/.github/workflows/check-query-ids.yml +++ b/.github/workflows/check-query-ids.yml @@ -16,6 +16,6 @@ jobs: name: Check query IDs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check for duplicate query IDs run: python3 misc/scripts/check-query-ids.py diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index dc4fa17c14d6e..b72cf6c6279b1 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: dotnet-version: 7.0.102 - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/compile-queries.yml b/.github/workflows/compile-queries.yml index ac63af81ccd7f..f3600dc0c5ead 100644 --- a/.github/workflows/compile-queries.yml +++ b/.github/workflows/compile-queries.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup CodeQL uses: ./.github/actions/fetch-codeql with: diff --git a/.github/workflows/csharp-qltest.yml b/.github/workflows/csharp-qltest.yml index 568bad3a945f9..b7a498699a25d 100644 --- a/.github/workflows/csharp-qltest.yml +++ b/.github/workflows/csharp-qltest.yml @@ -29,7 +29,7 @@ jobs: qlupgrade: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/fetch-codeql - name: Check DB upgrade scripts run: | @@ -52,7 +52,7 @@ jobs: matrix: slice: ["1/2", "2/2"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/fetch-codeql - uses: ./csharp/actions/create-extractor-pack - name: Cache compilation cache @@ -73,7 +73,7 @@ jobs: unit-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup dotnet uses: actions/setup-dotnet@v3 with: diff --git a/.github/workflows/csv-coverage-metrics.yml b/.github/workflows/csv-coverage-metrics.yml index f18671441cd72..e24c6bc74a4cb 100644 --- a/.github/workflows/csv-coverage-metrics.yml +++ b/.github/workflows/csv-coverage-metrics.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup CodeQL uses: ./.github/actions/fetch-codeql - name: Create empty database @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup CodeQL uses: ./.github/actions/fetch-codeql - name: Create empty database diff --git a/.github/workflows/csv-coverage-pr-artifacts.yml b/.github/workflows/csv-coverage-pr-artifacts.yml index b560d98a79d9f..48c55b2a6301f 100644 --- a/.github/workflows/csv-coverage-pr-artifacts.yml +++ b/.github/workflows/csv-coverage-pr-artifacts.yml @@ -31,11 +31,11 @@ jobs: GITHUB_CONTEXT: ${{ toJSON(github.event) }} run: echo "$GITHUB_CONTEXT" - name: Clone self (github/codeql) - MERGE - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: merge - name: Clone self (github/codeql) - BASE - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 2 path: base diff --git a/.github/workflows/csv-coverage-pr-comment.yml b/.github/workflows/csv-coverage-pr-comment.yml index 095ab7b3bed28..86fe74d3419a5 100644 --- a/.github/workflows/csv-coverage-pr-comment.yml +++ b/.github/workflows/csv-coverage-pr-comment.yml @@ -20,7 +20,7 @@ jobs: GITHUB_CONTEXT: ${{ toJSON(github.event) }} run: echo "$GITHUB_CONTEXT" - name: Clone self (github/codeql) - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python 3.8 uses: actions/setup-python@v4 with: diff --git a/.github/workflows/csv-coverage-timeseries.yml b/.github/workflows/csv-coverage-timeseries.yml index 42fd4711dac85..cf2758dd9d344 100644 --- a/.github/workflows/csv-coverage-timeseries.yml +++ b/.github/workflows/csv-coverage-timeseries.yml @@ -9,11 +9,11 @@ jobs: steps: - name: Clone self (github/codeql) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: script - name: Clone self (github/codeql) for analysis - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: codeqlModels fetch-depth: 0 diff --git a/.github/workflows/csv-coverage-update.yml b/.github/workflows/csv-coverage-update.yml index 6474044c4837a..ccf1ffd470538 100644 --- a/.github/workflows/csv-coverage-update.yml +++ b/.github/workflows/csv-coverage-update.yml @@ -17,7 +17,7 @@ jobs: GITHUB_CONTEXT: ${{ toJSON(github.event) }} run: echo "$GITHUB_CONTEXT" - name: Clone self (github/codeql) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: ql fetch-depth: 0 diff --git a/.github/workflows/csv-coverage.yml b/.github/workflows/csv-coverage.yml index e330490b69bab..4fb1d143fc394 100644 --- a/.github/workflows/csv-coverage.yml +++ b/.github/workflows/csv-coverage.yml @@ -13,11 +13,11 @@ jobs: steps: - name: Clone self (github/codeql) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: script - name: Clone self (github/codeql) for analysis - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: codeqlModels ref: ${{ github.event.inputs.qlModelShaOverride || github.ref }} diff --git a/.github/workflows/fast-forward.yml b/.github/workflows/fast-forward.yml index aedbf3573a716..c89675efc4ed4 100644 --- a/.github/workflows/fast-forward.yml +++ b/.github/workflows/fast-forward.yml @@ -25,7 +25,7 @@ jobs: exit 1 - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Git config shell: bash diff --git a/.github/workflows/go-tests-other-os.yml b/.github/workflows/go-tests-other-os.yml index 7b5449fa4c5d3..09765011a18f1 100644 --- a/.github/workflows/go-tests-other-os.yml +++ b/.github/workflows/go-tests-other-os.yml @@ -21,7 +21,7 @@ jobs: id: go - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up CodeQL CLI uses: ./.github/actions/fetch-codeql @@ -56,7 +56,7 @@ jobs: id: go - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up CodeQL CLI uses: ./.github/actions/fetch-codeql diff --git a/.github/workflows/go-tests.yml b/.github/workflows/go-tests.yml index 7078c733f01a6..7885f504bba3a 100644 --- a/.github/workflows/go-tests.yml +++ b/.github/workflows/go-tests.yml @@ -29,7 +29,7 @@ jobs: id: go - name: Check out code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up CodeQL CLI uses: ./.github/actions/fetch-codeql diff --git a/.github/workflows/js-ml-tests.yml b/.github/workflows/js-ml-tests.yml index 90cb569112674..866ca14053e98 100644 --- a/.github/workflows/js-ml-tests.yml +++ b/.github/workflows/js-ml-tests.yml @@ -27,7 +27,7 @@ jobs: name: Test QL runs-on: ubuntu-latest-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/fetch-codeql diff --git a/.github/workflows/mad_modelDiff.yml b/.github/workflows/mad_modelDiff.yml index 8cfaac6f1347c..17640da9f2e14 100644 --- a/.github/workflows/mad_modelDiff.yml +++ b/.github/workflows/mad_modelDiff.yml @@ -27,12 +27,12 @@ jobs: slug: ${{fromJson(github.event.inputs.projects || '["apache/commons-codec", "apache/commons-io", "apache/commons-beanutils", "apache/commons-logging", "apache/commons-fileupload", "apache/commons-lang", "apache/commons-validator", "apache/commons-csv", "apache/dubbo"]' )}} steps: - name: Clone github/codeql from PR - uses: actions/checkout@v3 + uses: actions/checkout@v4 if: github.event.pull_request with: path: codeql-pr - name: Clone github/codeql from main - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: codeql-main ref: main diff --git a/.github/workflows/mad_regenerate-models.yml b/.github/workflows/mad_regenerate-models.yml index 6b3d0347a86e2..3268a17dfbb4e 100644 --- a/.github/workflows/mad_regenerate-models.yml +++ b/.github/workflows/mad_regenerate-models.yml @@ -27,11 +27,11 @@ jobs: ref: "placeholder" steps: - name: Clone self (github/codeql) - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup CodeQL binaries uses: ./.github/actions/fetch-codeql - name: Clone repositories - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: repos/${{ matrix.ref }} ref: ${{ matrix.ref }} diff --git a/.github/workflows/qhelp-pr-preview.yml b/.github/workflows/qhelp-pr-preview.yml index a44ef5ad48d59..8b20fbe00c96a 100644 --- a/.github/workflows/qhelp-pr-preview.yml +++ b/.github/workflows/qhelp-pr-preview.yml @@ -43,7 +43,7 @@ jobs: if-no-files-found: error retention-days: 1 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 2 persist-credentials: false diff --git a/.github/workflows/ql-for-ql-build.yml b/.github/workflows/ql-for-ql-build.yml index 10086d78d78a3..e8ac1fa0f1734 100644 --- a/.github/workflows/ql-for-ql-build.yml +++ b/.github/workflows/ql-for-ql-build.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest-xl steps: ### Build the queries ### - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Find codeql diff --git a/.github/workflows/ql-for-ql-dataset_measure.yml b/.github/workflows/ql-for-ql-dataset_measure.yml index 2c7d037f9273f..d317d467c9aa2 100644 --- a/.github/workflows/ql-for-ql-dataset_measure.yml +++ b/.github/workflows/ql-for-ql-dataset_measure.yml @@ -21,7 +21,7 @@ jobs: - github/codeql runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Find codeql id: find-codeql @@ -42,7 +42,7 @@ jobs: env: CODEQL: ${{ steps.find-codeql.outputs.codeql-path }} - name: Checkout ${{ matrix.repo }} - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ${{ matrix.repo }} path: ${{ github.workspace }}/repo @@ -71,7 +71,7 @@ jobs: runs-on: ubuntu-latest needs: measure steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/download-artifact@v3 with: name: measurements diff --git a/.github/workflows/ql-for-ql-tests.yml b/.github/workflows/ql-for-ql-tests.yml index c89527113df58..4385e3f76bb14 100644 --- a/.github/workflows/ql-for-ql-tests.yml +++ b/.github/workflows/ql-for-ql-tests.yml @@ -21,7 +21,7 @@ jobs: qltest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Find codeql id: find-codeql uses: github/codeql-action/init@v2 @@ -61,7 +61,7 @@ jobs: needs: [qltest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install GNU tar if: runner.os == 'macOS' run: | diff --git a/.github/workflows/query-list.yml b/.github/workflows/query-list.yml index efb295dfcf8be..07fb3b682da3f 100644 --- a/.github/workflows/query-list.yml +++ b/.github/workflows/query-list.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Clone self (github/codeql) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: codeql - name: Set up Python 3.8 diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 935d9da642b33..392c6ff830262 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -42,7 +42,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install GNU tar if: runner.os == 'macOS' run: | @@ -113,7 +113,7 @@ jobs: compile-queries: runs-on: ubuntu-latest-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Fetch CodeQL uses: ./.github/actions/fetch-codeql - name: Cache compilation cache @@ -145,7 +145,7 @@ jobs: runs-on: ubuntu-latest needs: [build, compile-queries] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/download-artifact@v3 with: name: ruby.dbscheme @@ -206,7 +206,7 @@ jobs: runs-on: ${{ matrix.os }} needs: [package] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Fetch CodeQL uses: ./.github/actions/fetch-codeql diff --git a/.github/workflows/ruby-dataset-measure.yml b/.github/workflows/ruby-dataset-measure.yml index bb8bb6858fdc0..c064d8d2bfb4b 100644 --- a/.github/workflows/ruby-dataset-measure.yml +++ b/.github/workflows/ruby-dataset-measure.yml @@ -27,14 +27,14 @@ jobs: repo: [rails/rails, discourse/discourse, spree/spree, ruby/ruby] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/fetch-codeql - uses: ./ruby/actions/create-extractor-pack - name: Checkout ${{ matrix.repo }} - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ${{ matrix.repo }} path: ${{ github.workspace }}/repo @@ -59,7 +59,7 @@ jobs: runs-on: ubuntu-latest needs: measure steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/download-artifact@v3 with: name: measurements diff --git a/.github/workflows/ruby-qltest.yml b/.github/workflows/ruby-qltest.yml index b13cfabcd7d3f..19d5325091fde 100644 --- a/.github/workflows/ruby-qltest.yml +++ b/.github/workflows/ruby-qltest.yml @@ -33,7 +33,7 @@ jobs: qlupgrade: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/fetch-codeql - name: Check DB upgrade scripts run: | @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/fetch-codeql - uses: ./ruby/actions/create-extractor-pack - name: Cache compilation cache diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 075a5505f3971..8a04d47411810 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -39,31 +39,31 @@ jobs: build-and-test-macos: runs-on: macos-12-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./swift/actions/build-and-test build-and-test-linux: runs-on: ubuntu-latest-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./swift/actions/build-and-test qltests-linux: needs: build-and-test-linux runs-on: ubuntu-latest-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./swift/actions/run-ql-tests qltests-macos: if : ${{ github.event_name == 'pull_request' }} needs: build-and-test-macos runs-on: macos-12-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./swift/actions/run-ql-tests integration-tests-linux: needs: build-and-test-linux runs-on: ubuntu-latest-xl steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./swift/actions/run-integration-tests integration-tests-macos: if : ${{ github.event_name == 'pull_request' }} @@ -71,13 +71,13 @@ jobs: runs-on: macos-12-xl timeout-minutes: 60 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./swift/actions/run-integration-tests codegen: if : ${{ github.event_name == 'pull_request' }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: bazelbuild/setup-bazelisk@v2 - uses: actions/setup-python@v4 with: @@ -102,6 +102,6 @@ jobs: if : ${{ github.event_name == 'pull_request' }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/fetch-codeql - uses: ./swift/actions/database-upgrade-scripts diff --git a/.github/workflows/sync-files.yml b/.github/workflows/sync-files.yml index 8f4678f178871..7894eae7f55a8 100644 --- a/.github/workflows/sync-files.yml +++ b/.github/workflows/sync-files.yml @@ -14,7 +14,7 @@ jobs: sync: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check synchronized files run: python config/sync-files.py - name: Check dbscheme fragments diff --git a/.github/workflows/tree-sitter-extractor-test.yml b/.github/workflows/tree-sitter-extractor-test.yml index d41c9083fdfae..5d13b25466d34 100644 --- a/.github/workflows/tree-sitter-extractor-test.yml +++ b/.github/workflows/tree-sitter-extractor-test.yml @@ -27,7 +27,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check formatting run: cargo fmt --all -- --check - name: Run tests @@ -35,12 +35,12 @@ jobs: fmt: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check formatting run: cargo fmt --check clippy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run clippy run: cargo clippy -- --no-deps -D warnings -A clippy::new_without_default -A clippy::too_many_arguments diff --git a/.github/workflows/validate-change-notes.yml b/.github/workflows/validate-change-notes.yml index 44e0dc6df29ee..f8c1d9f650422 100644 --- a/.github/workflows/validate-change-notes.yml +++ b/.github/workflows/validate-change-notes.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup CodeQL uses: ./.github/actions/fetch-codeql diff --git a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj b/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj index abf4f358a24f3..0c9f70c6d6d62 100644 --- a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj +++ b/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj @@ -11,12 +11,12 @@ - - + + all runtime; build; native; contentfiles; analyzers - + diff --git a/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj b/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj index 5e0d40cdfe228..f8f5c28507483 100644 --- a/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj +++ b/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj @@ -17,7 +17,7 @@ - + diff --git a/cpp/ql/lib/change-notes/2023-09-06-as-defining-argument-off-by-one-fix.md b/cpp/ql/lib/change-notes/2023-09-06-as-defining-argument-off-by-one-fix.md new file mode 100644 index 0000000000000..11c3b73668214 --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-09-06-as-defining-argument-off-by-one-fix.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `DataFlow::asDefiningArgument` predicate now takes its argument from the range starting at `1` instead of `2`. Queries that depend on the single-parameter version of `DataFlow::asDefiningArgument` should have their arguments updated accordingly. diff --git a/cpp/ql/lib/change-notes/2023-09-07-return-from-end.md b/cpp/ql/lib/change-notes/2023-09-07-return-from-end.md new file mode 100644 index 0000000000000..8f1b8e9be8882 --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-09-07-return-from-end.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Treat functions that reach the end of the function as returning in the IR. + They used to be treated as unreachable but it is allowed in C. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2023-09-08-more-unreachble.md b/cpp/ql/lib/change-notes/2023-09-08-more-unreachble.md new file mode 100644 index 0000000000000..6b2fff3d17678 --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-09-08-more-unreachble.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* Functions that do not return due to calling functions that don't return (e.g. `exit`) are now detected as + non-returning in the IR and dataflow. \ No newline at end of file diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 9355493303a82..7cc9d54a3041c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -254,9 +254,7 @@ class Node extends TIRDataFlowNode { * after the `f` has returned. */ Expr asDefiningArgument(int index) { - // Subtract one because `DefinitionByReferenceNode` is defined to be in - // the range `[0 ... n - 1]` for some `n` instead of `[1 ... n]`. - this.(DefinitionByReferenceNode).getIndirectionIndex() = index - 1 and + this.(DefinitionByReferenceNode).getIndirectionIndex() = index and result = this.(DefinitionByReferenceNode).getArgument() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll index 11c77ef9613e6..7c34dc43d07b6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll @@ -447,9 +447,16 @@ class GlobalUse extends UseImpl, TGlobalUse { IRFunction getIRFunction() { result = f } final override predicate hasIndexInBlock(IRBlock block, int index) { - exists(ExitFunctionInstruction exit | - exit = f.getExitFunctionInstruction() and - block.getInstruction(index) = exit + // Similar to the `FinalParameterUse` case, we want to generate flow out of + // globals at any exit so that we can flow out of non-returning functions. + // Obviously this isn't correct as we can't actually flow but the global flow + // requires this if we want to flow into children. + exists(Instruction return | + return instanceof ReturnInstruction or + return instanceof UnreachedInstruction + | + block.getInstruction(index) = return and + return.getEnclosingIRFunction() = f ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll index 8c0695247f83a..ed4b39bc24bda 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll @@ -405,9 +405,6 @@ predicate hasUnreachedInstruction(IRFunction func) { exists(Call c | c.getEnclosingFunction() = func.getFunction() and any(Options opt).exits(c.getTarget()) - ) and - not exists(TranslatedUnreachableReturnStmt return | - return.getEnclosingFunction().getFunction() = func.getFunction() ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 497c16d407dcb..aa7527451c3c4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -442,29 +442,26 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { /** * The IR translation of an implicit `return` statement generated by the extractor to handle control - * flow that reaches the end of a non-`void`-returning function body. Since such control flow - * produces undefined behavior, we simply generate an `Unreached` instruction to prevent that flow - * from continuing on to pollute other analysis. The assumption is that the developer is certain - * that the implicit `return` is unreachable, even if the compiler cannot prove it. + * flow that reaches the end of a non-`void`-returning function body. Such control flow + * produces undefined behavior in C++ but not in C. However even in C using the return value is + * undefined behaviour. We make it return uninitialized memory to get as much flow as possible. */ -class TranslatedUnreachableReturnStmt extends TranslatedReturnStmt { - TranslatedUnreachableReturnStmt() { +class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariableInitialization { + TranslatedNoValueReturnStmt() { not stmt.hasExpr() and hasReturnValue(stmt.getEnclosingFunction()) } - override TranslatedElement getChild(int id) { none() } - - override Instruction getFirstInstruction() { result = this.getInstruction(OnlyInstructionTag()) } - - override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { - tag = OnlyInstructionTag() and - opcode instanceof Opcode::Unreached and - resultType = getVoidType() + final override Instruction getInitializationSuccessor() { + result = this.getEnclosingFunction().getReturnSuccessorInstruction() } - override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() } - override Instruction getChildSuccessor(TranslatedElement child) { none() } + final override TranslatedInitialization getInitialization() { none() } + + final override IRVariable getIRVariable() { + result = this.getEnclosingFunction().getReturnVariable() + } } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll index 277791e2baedf..bd7a1f8da2bd5 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll @@ -10,6 +10,65 @@ predicate isInfeasibleInstructionSuccessor(Instruction instr, EdgeKind kind) { or instr.getSuccessor(kind) instanceof UnreachedInstruction and kind instanceof GotoEdge + or + isCallToNonReturningFunction(instr) and exists(instr.getSuccessor(kind)) +} + +/** + * Holds if all calls to `f` never return (e.g. they call `exit` or loop forever) + */ +private predicate isNonReturningFunction(IRFunction f) { + // If the function has an instruction with a missing successor then + // the analysis is probably going to be incorrect, so assume they exit. + not hasInstructionWithMissingSuccessor(f) and + ( + // If all flows to the exit block are pass through an unreachable then f never returns. + any(UnreachedInstruction instr).getBlock().postDominates(f.getEntryBlock()) + or + // If there is no flow to the exit block then f never returns. + not exists(IRBlock entry, IRBlock exit | + exit = f.getExitFunctionInstruction().getBlock() and + entry = f.getEntryBlock() and + exit = entry.getASuccessor*() + ) + or + // If all flows to the exit block are pass through a call that never returns then f never returns. + exists(CallInstruction ci | + ci.getBlock().postDominates(f.getEntryBlock()) and + isCallToNonReturningFunction(ci) + ) + ) +} + +/** + * Holds if `f` has an instruction with a missing successor. + * This matches `instructionWithoutSuccessor` from `IRConsistency`, but + * avoids generating the error strings. + */ +predicate hasInstructionWithMissingSuccessor(IRFunction f) { + exists(Instruction missingSucc | + missingSucc.getEnclosingIRFunction() = f and + not exists(missingSucc.getASuccessor()) and + not missingSucc instanceof ExitFunctionInstruction and + // Phi instructions aren't linked into the instruction-level flow graph. + not missingSucc instanceof PhiInstruction and + not missingSucc instanceof UnreachedInstruction + ) +} + +/** + * Holds if the call `ci` never returns. + */ +private predicate isCallToNonReturningFunction(CallInstruction ci) { + exists(IRFunction callee, Language::Function staticTarget | + staticTarget = ci.getStaticCallTarget() and + staticTarget = callee.getFunction() and + // We can't easily tell if the call is virtual or not + // if the callee is virtual. So assume that the call is virtual + // if the target is. + not staticTarget.isVirtual() and + isNonReturningFunction(callee) + ) } pragma[noinline] diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll index 3041b662962b3..5014a96c002af 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll @@ -1,2 +1,3 @@ import semmle.code.cpp.ir.implementation.raw.IR as IR import semmle.code.cpp.ir.implementation.raw.constant.ConstantAnalysis as ConstantAnalysis +import semmle.code.cpp.ir.internal.IRCppLanguage as Language diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll index 277791e2baedf..bd7a1f8da2bd5 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll @@ -10,6 +10,65 @@ predicate isInfeasibleInstructionSuccessor(Instruction instr, EdgeKind kind) { or instr.getSuccessor(kind) instanceof UnreachedInstruction and kind instanceof GotoEdge + or + isCallToNonReturningFunction(instr) and exists(instr.getSuccessor(kind)) +} + +/** + * Holds if all calls to `f` never return (e.g. they call `exit` or loop forever) + */ +private predicate isNonReturningFunction(IRFunction f) { + // If the function has an instruction with a missing successor then + // the analysis is probably going to be incorrect, so assume they exit. + not hasInstructionWithMissingSuccessor(f) and + ( + // If all flows to the exit block are pass through an unreachable then f never returns. + any(UnreachedInstruction instr).getBlock().postDominates(f.getEntryBlock()) + or + // If there is no flow to the exit block then f never returns. + not exists(IRBlock entry, IRBlock exit | + exit = f.getExitFunctionInstruction().getBlock() and + entry = f.getEntryBlock() and + exit = entry.getASuccessor*() + ) + or + // If all flows to the exit block are pass through a call that never returns then f never returns. + exists(CallInstruction ci | + ci.getBlock().postDominates(f.getEntryBlock()) and + isCallToNonReturningFunction(ci) + ) + ) +} + +/** + * Holds if `f` has an instruction with a missing successor. + * This matches `instructionWithoutSuccessor` from `IRConsistency`, but + * avoids generating the error strings. + */ +predicate hasInstructionWithMissingSuccessor(IRFunction f) { + exists(Instruction missingSucc | + missingSucc.getEnclosingIRFunction() = f and + not exists(missingSucc.getASuccessor()) and + not missingSucc instanceof ExitFunctionInstruction and + // Phi instructions aren't linked into the instruction-level flow graph. + not missingSucc instanceof PhiInstruction and + not missingSucc instanceof UnreachedInstruction + ) +} + +/** + * Holds if the call `ci` never returns. + */ +private predicate isCallToNonReturningFunction(CallInstruction ci) { + exists(IRFunction callee, Language::Function staticTarget | + staticTarget = ci.getStaticCallTarget() and + staticTarget = callee.getFunction() and + // We can't easily tell if the call is virtual or not + // if the callee is virtual. So assume that the call is virtual + // if the target is. + not staticTarget.isVirtual() and + isNonReturningFunction(callee) + ) } pragma[noinline] diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll index 61dc1a50399a4..29101e77e6fe9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll @@ -1,2 +1,3 @@ import semmle.code.cpp.ir.implementation.unaliased_ssa.IR as IR import semmle.code.cpp.ir.implementation.unaliased_ssa.constant.ConstantAnalysis as ConstantAnalysis +import semmle.code.cpp.ir.internal.IRCppLanguage as Language diff --git a/cpp/ql/src/change-notes/2023-09-08-unreachble-edges.md b/cpp/ql/src/change-notes/2023-09-08-unreachble-edges.md new file mode 100644 index 0000000000000..1839120619b04 --- /dev/null +++ b/cpp/ql/src/change-notes/2023-09-08-unreachble-edges.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* The queries `cpp/double-free` and `cpp/use-after-free` find fewer false positives + in cases where a non-returning function is called. \ No newline at end of file diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 9c261125c2f95..a698e72a23fe8 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -15740,6 +15740,112 @@ ir.cpp: # 2072| Value = [VariableAccess] 116 # 2072| ValueCategory = prvalue(load) # 2073| getStmt(2): [ReturnStmt] return ... +# 2075| [TopLevelFunction] void exit(int) +# 2075| : +# 2075| getParameter(0): [Parameter] code +# 2075| Type = [IntType] int +# 2077| [TopLevelFunction] int NonExit() +# 2077| : +# 2077| getEntryPoint(): [BlockStmt] { ... } +# 2078| getStmt(0): [DeclStmt] declaration +# 2078| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2078| Type = [IntType] int +# 2078| getVariable().getInitializer(): [Initializer] initializer for x +# 2078| getExpr(): [FunctionCall] call to Add +# 2078| Type = [IntType] int +# 2078| ValueCategory = prvalue +# 2078| getArgument(0): [Literal] 3 +# 2078| Type = [IntType] int +# 2078| Value = [Literal] 3 +# 2078| ValueCategory = prvalue +# 2078| getArgument(1): [Literal] 4 +# 2078| Type = [IntType] int +# 2078| Value = [Literal] 4 +# 2078| ValueCategory = prvalue +# 2079| getStmt(1): [IfStmt] if (...) ... +# 2079| getCondition(): [EQExpr] ... == ... +# 2079| Type = [BoolType] bool +# 2079| ValueCategory = prvalue +# 2079| getLeftOperand(): [VariableAccess] x +# 2079| Type = [IntType] int +# 2079| ValueCategory = prvalue(load) +# 2079| getRightOperand(): [Literal] 7 +# 2079| Type = [IntType] int +# 2079| Value = [Literal] 7 +# 2079| ValueCategory = prvalue +# 2080| getThen(): [ExprStmt] ExprStmt +# 2080| getExpr(): [FunctionCall] call to exit +# 2080| Type = [VoidType] void +# 2080| ValueCategory = prvalue +# 2080| getArgument(0): [Literal] 3 +# 2080| Type = [IntType] int +# 2080| Value = [Literal] 3 +# 2080| ValueCategory = prvalue +# 2081| getStmt(2): [ExprStmt] ExprStmt +# 2081| getExpr(): [FunctionCall] call to VoidFunc +# 2081| Type = [VoidType] void +# 2081| ValueCategory = prvalue +# 2082| getStmt(3): [ReturnStmt] return ... +# 2082| getExpr(): [VariableAccess] x +# 2082| Type = [IntType] int +# 2082| ValueCategory = prvalue(load) +# 2085| [TopLevelFunction] void CallsNonExit() +# 2085| : +# 2085| getEntryPoint(): [BlockStmt] { ... } +# 2086| getStmt(0): [ExprStmt] ExprStmt +# 2086| getExpr(): [FunctionCall] call to VoidFunc +# 2086| Type = [VoidType] void +# 2086| ValueCategory = prvalue +# 2087| getStmt(1): [ExprStmt] ExprStmt +# 2087| getExpr(): [FunctionCall] call to exit +# 2087| Type = [VoidType] void +# 2087| ValueCategory = prvalue +# 2087| getArgument(0): [Literal] 3 +# 2087| Type = [IntType] int +# 2087| Value = [Literal] 3 +# 2087| ValueCategory = prvalue +# 2088| getStmt(2): [ReturnStmt] return ... +# 2090| [TopLevelFunction] int TransNonExit() +# 2090| : +# 2090| getEntryPoint(): [BlockStmt] { ... } +# 2091| getStmt(0): [DeclStmt] declaration +# 2091| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2091| Type = [IntType] int +# 2091| getVariable().getInitializer(): [Initializer] initializer for x +# 2091| getExpr(): [FunctionCall] call to Add +# 2091| Type = [IntType] int +# 2091| ValueCategory = prvalue +# 2091| getArgument(0): [Literal] 3 +# 2091| Type = [IntType] int +# 2091| Value = [Literal] 3 +# 2091| ValueCategory = prvalue +# 2091| getArgument(1): [Literal] 4 +# 2091| Type = [IntType] int +# 2091| Value = [Literal] 4 +# 2091| ValueCategory = prvalue +# 2092| getStmt(1): [IfStmt] if (...) ... +# 2092| getCondition(): [EQExpr] ... == ... +# 2092| Type = [BoolType] bool +# 2092| ValueCategory = prvalue +# 2092| getLeftOperand(): [VariableAccess] x +# 2092| Type = [IntType] int +# 2092| ValueCategory = prvalue(load) +# 2092| getRightOperand(): [Literal] 7 +# 2092| Type = [IntType] int +# 2092| Value = [Literal] 7 +# 2092| ValueCategory = prvalue +# 2093| getThen(): [ExprStmt] ExprStmt +# 2093| getExpr(): [FunctionCall] call to CallsNonExit +# 2093| Type = [VoidType] void +# 2093| ValueCategory = prvalue +# 2094| getStmt(2): [ExprStmt] ExprStmt +# 2094| getExpr(): [FunctionCall] call to VoidFunc +# 2094| Type = [VoidType] void +# 2094| ValueCategory = prvalue +# 2095| getStmt(3): [ReturnStmt] return ... +# 2095| getExpr(): [VariableAccess] x +# 2095| Type = [IntType] int +# 2095| ValueCategory = prvalue(load) perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected new file mode 100644 index 0000000000000..43525ccf1db8d --- /dev/null +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -0,0 +1,12956 @@ +bad_asts.cpp: +# 9| int Bad::S::MemberFunction(int) +# 9| Block 0 +# 9| v9_1(void) = EnterFunction : +# 9| m9_2(unknown) = AliasedDefinition : +# 9| m9_3(unknown) = InitializeNonLocal : +# 9| m9_4(unknown) = Chi : total:m9_2, partial:m9_3 +# 9| r9_5(glval) = VariableAddress[#this] : +# 9| m9_6(glval) = InitializeParameter[#this] : &:r9_5 +# 9| r9_7(glval) = Load[#this] : &:r9_5, m9_6 +# 9| m9_8(S) = InitializeIndirection[#this] : &:r9_7 +# 9| r9_9(glval) = VariableAddress[y] : +# 9| m9_10(int) = InitializeParameter[y] : &:r9_9 +# 10| r10_1(glval) = VariableAddress[#return] : +# 10| r10_2(int) = Constant[6] : +# 10| r10_3(glval) = VariableAddress[#this] : +# 10| r10_4(S *) = Load[#this] : &:r10_3, m9_6 +# 10| r10_5(glval) = FieldAddress[x] : r10_4 +# 10| r10_6(int) = Load[?] : &:r10_5, ~m9_8 +# 10| r10_7(int) = Add : r10_2, r10_6 +# 10| r10_8(glval) = VariableAddress[y] : +# 10| r10_9(int) = Load[y] : &:r10_8, m9_10 +# 10| r10_10(int) = Add : r10_7, r10_9 +# 10| m10_11(int) = Store[#return] : &:r10_1, r10_10 +# 9| v9_11(void) = ReturnIndirection[#this] : &:r9_7, m9_8 +# 9| r9_12(glval) = VariableAddress[#return] : +# 9| v9_13(void) = ReturnValue : &:r9_12, m10_11 +# 9| v9_14(void) = AliasedUse : m9_3 +# 9| v9_15(void) = ExitFunction : + +# 14| void Bad::CallBadMemberFunction() +# 14| Block 0 +# 14| v14_1(void) = EnterFunction : +# 14| m14_2(unknown) = AliasedDefinition : +# 14| m14_3(unknown) = InitializeNonLocal : +# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3 +# 15| r15_1(glval) = VariableAddress[s] : +# 15| m15_2(S) = Uninitialized[s] : &:r15_1 +# 15| r15_3(glval) = FieldAddress[x] : r15_1 +# 15| r15_4(int) = Constant[0] : +# 15| m15_5(int) = Store[?] : &:r15_3, r15_4 +# 16| r16_1(glval) = VariableAddress[s] : +# 16| r16_2(glval) = FunctionAddress[MemberFunction] : +# 16| r16_3(int) = Constant[1] : +# 16| r16_4(int) = Call[MemberFunction] : func:r16_2, this:r16_1, 0:r16_3 +# 16| m16_5(unknown) = ^CallSideEffect : ~m14_4 +# 16| m16_6(unknown) = Chi : total:m14_4, partial:m16_5 +# 16| v16_7(void) = ^IndirectReadSideEffect[-1] : &:r16_1, ~m15_5 +# 16| m16_8(S) = ^IndirectMayWriteSideEffect[-1] : &:r16_1 +# 16| m16_9(S) = Chi : total:m15_5, partial:m16_8 +# 17| v17_1(void) = NoOp : +# 14| v14_5(void) = ReturnVoid : +# 14| v14_6(void) = AliasedUse : ~m16_6 +# 14| v14_7(void) = ExitFunction : + +# 19| void Bad::Point::Point(Bad::Point const&) +# 19| Block 0 +# 19| v19_1(void) = EnterFunction : +# 19| m19_2(unknown) = AliasedDefinition : +# 19| m19_3(unknown) = InitializeNonLocal : +# 19| m19_4(unknown) = Chi : total:m19_2, partial:m19_3 +# 19| r19_5(glval) = VariableAddress[#this] : +# 19| m19_6(glval) = InitializeParameter[#this] : &:r19_5 +# 19| r19_7(glval) = Load[#this] : &:r19_5, m19_6 +# 19| m19_8(Point) = InitializeIndirection[#this] : &:r19_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(Point &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(Point &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 19| r19_9(glval) = FieldAddress[x] : m19_6 +# 19| r19_10(glval) = VariableAddress[(unnamed parameter 0)] : +# 19| r19_11(Point &) = Load[(unnamed parameter 0)] : &:r19_10, m0_2 +# 19| r19_12(glval) = CopyValue : r19_11 +# 19| r19_13(glval) = FieldAddress[x] : r19_12 +# 19| r19_14(int) = Load[?] : &:r19_13, ~m0_4 +# 19| m19_15(int) = Store[?] : &:r19_9, r19_14 +# 19| m19_16(unknown) = Chi : total:m19_8, partial:m19_15 +# 19| r19_17(glval) = FieldAddress[y] : m19_6 +# 19| r19_18(glval) = VariableAddress[(unnamed parameter 0)] : +# 19| r19_19(Point &) = Load[(unnamed parameter 0)] : &:r19_18, m0_2 +# 19| r19_20(glval) = CopyValue : r19_19 +# 19| r19_21(glval) = FieldAddress[y] : r19_20 +# 19| r19_22(int) = Load[?] : &:r19_21, ~m0_4 +# 19| m19_23(int) = Store[?] : &:r19_17, r19_22 +# 19| m19_24(unknown) = Chi : total:m19_16, partial:m19_23 +# 19| v19_25(void) = NoOp : +# 19| v19_26(void) = ReturnIndirection[#this] : &:r19_7, m19_24 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 19| v19_27(void) = ReturnVoid : +# 19| v19_28(void) = AliasedUse : m19_3 +# 19| v19_29(void) = ExitFunction : + +# 22| void Bad::Point::Point() +# 22| Block 0 +# 22| v22_1(void) = EnterFunction : +# 22| m22_2(unknown) = AliasedDefinition : +# 22| m22_3(unknown) = InitializeNonLocal : +# 22| m22_4(unknown) = Chi : total:m22_2, partial:m22_3 +# 22| r22_5(glval) = VariableAddress[#this] : +# 22| m22_6(glval) = InitializeParameter[#this] : &:r22_5 +# 22| r22_7(glval) = Load[#this] : &:r22_5, m22_6 +# 22| m22_8(Point) = InitializeIndirection[#this] : &:r22_7 +# 23| v23_1(void) = NoOp : +# 22| v22_9(void) = ReturnIndirection[#this] : &:r22_7, m22_8 +# 22| v22_10(void) = ReturnVoid : +# 22| v22_11(void) = AliasedUse : m22_3 +# 22| v22_12(void) = ExitFunction : + +# 26| void Bad::CallCopyConstructor(Bad::Point const&) +# 26| Block 0 +# 26| v26_1(void) = EnterFunction : +# 26| m26_2(unknown) = AliasedDefinition : +# 26| m26_3(unknown) = InitializeNonLocal : +# 26| m26_4(unknown) = Chi : total:m26_2, partial:m26_3 +# 26| r26_5(glval) = VariableAddress[a] : +# 26| m26_6(Point &) = InitializeParameter[a] : &:r26_5 +# 26| r26_7(Point &) = Load[a] : &:r26_5, m26_6 +# 26| m26_8(unknown) = InitializeIndirection[a] : &:r26_7 +# 27| r27_1(glval) = VariableAddress[b] : +# 27| r27_2(glval) = VariableAddress[a] : +# 27| r27_3(Point &) = Load[a] : &:r27_2, m26_6 +# 27| r27_4(glval) = CopyValue : r27_3 +# 27| r27_5(glval) = Convert : r27_4 +# 27| r27_6(Point) = Load[?] : &:r27_5, ~m26_8 +# 27| m27_7(Point) = Store[b] : &:r27_1, r27_6 +# 28| v28_1(void) = NoOp : +# 26| v26_9(void) = ReturnIndirection[a] : &:r26_7, m26_8 +# 26| v26_10(void) = ReturnVoid : +# 26| v26_11(void) = AliasedUse : m26_3 +# 26| v26_12(void) = ExitFunction : + +bad_stmts.cpp: +# 5| void Bad::errorExpr() +# 5| Block 0 +# 5| v5_1(void) = EnterFunction : +# 5| m5_2(unknown) = AliasedDefinition : +# 5| m5_3(unknown) = InitializeNonLocal : +# 5| m5_4(unknown) = Chi : total:m5_2, partial:m5_3 +# 6| r6_1(glval) = VariableAddress[intref] : +# 6| r6_2(error) = Error : +# 6| m6_3(int &) = Store[intref] : &:r6_1, r6_2 +# 7| r7_1(glval) = VariableAddress[x] : +# 7| r7_2(error) = Error : +# 7| m7_3(int) = Store[x] : &:r7_1, r7_2 +# 8| r8_1(glval) = Error : +# 8| r8_2(error) = Load[?] : &:r8_1, ~m5_4 +# 8| r8_3(glval) = VariableAddress[x] : +# 8| m8_4(int) = Store[x] : &:r8_3, r8_2 +# 9| v9_1(void) = NoOp : +# 5| v5_5(void) = ReturnVoid : +# 5| v5_6(void) = AliasedUse : m5_3 +# 5| v5_7(void) = ExitFunction : + +clang.cpp: +# 5| int* globalIntAddress() +# 5| Block 0 +# 5| v5_1(void) = EnterFunction : +# 5| m5_2(unknown) = AliasedDefinition : +# 5| m5_3(unknown) = InitializeNonLocal : +# 5| m5_4(unknown) = Chi : total:m5_2, partial:m5_3 +# 6| r6_1(glval) = VariableAddress[#return] : +# 6| r6_2(glval) = VariableAddress[globalInt] : +# 6| r6_3(int *) = CopyValue : r6_2 +# 6| m6_4(int *) = Store[#return] : &:r6_1, r6_3 +# 5| r5_5(glval) = VariableAddress[#return] : +# 5| v5_6(void) = ReturnValue : &:r5_5, m6_4 +# 5| v5_7(void) = AliasedUse : m5_3 +# 5| v5_8(void) = ExitFunction : + +complex.c: +# 1| void complex_literals() +# 1| Block 0 +# 1| v1_1(void) = EnterFunction : +# 1| m1_2(unknown) = AliasedDefinition : +# 1| m1_3(unknown) = InitializeNonLocal : +# 1| m1_4(unknown) = Chi : total:m1_2, partial:m1_3 +# 2| r2_1(glval<_Complex float>) = VariableAddress[cf] : +# 2| r2_2(double) = Constant[2.0] : +# 2| r2_3(_Complex float) = Convert : r2_2 +# 2| m2_4(_Complex float) = Store[cf] : &:r2_1, r2_3 +# 3| r3_1(_Imaginary float) = Constant[1.0i] : +# 3| r3_2(_Complex float) = Convert : r3_1 +# 3| r3_3(glval<_Complex float>) = VariableAddress[cf] : +# 3| m3_4(_Complex float) = Store[cf] : &:r3_3, r3_2 +# 4| r4_1(glval<_Complex double>) = VariableAddress[cd] : +# 4| r4_2(double) = Constant[3.0] : +# 4| r4_3(_Complex double) = Convert : r4_2 +# 4| m4_4(_Complex double) = Store[cd] : &:r4_1, r4_3 +# 5| r5_1(_Imaginary float) = Constant[1.0i] : +# 5| r5_2(_Complex double) = Convert : r5_1 +# 5| r5_3(glval<_Complex double>) = VariableAddress[cd] : +# 5| m5_4(_Complex double) = Store[cd] : &:r5_3, r5_2 +# 6| r6_1(glval<_Complex long double>) = VariableAddress[cld] : +# 6| r6_2(double) = Constant[5.0] : +# 6| r6_3(_Complex long double) = Convert : r6_2 +# 6| m6_4(_Complex long double) = Store[cld] : &:r6_1, r6_3 +# 7| r7_1(_Imaginary float) = Constant[1.0i] : +# 7| r7_2(_Complex long double) = Convert : r7_1 +# 7| r7_3(glval<_Complex long double>) = VariableAddress[cld] : +# 7| m7_4(_Complex long double) = Store[cld] : &:r7_3, r7_2 +# 9| r9_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 9| r9_2(_Imaginary float) = Constant[1.0i] : +# 9| m9_3(_Imaginary float) = Store[jf] : &:r9_1, r9_2 +# 10| r10_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 10| r10_2(_Imaginary float) = Constant[1.0i] : +# 10| r10_3(_Imaginary double) = Convert : r10_2 +# 10| m10_4(_Imaginary double) = Store[jd] : &:r10_1, r10_3 +# 11| r11_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 11| r11_2(_Imaginary float) = Constant[1.0i] : +# 11| r11_3(_Imaginary long double) = Convert : r11_2 +# 11| m11_4(_Imaginary long double) = Store[jld] : &:r11_1, r11_3 +# 12| v12_1(void) = NoOp : +# 1| v1_5(void) = ReturnVoid : +# 1| v1_6(void) = AliasedUse : m1_3 +# 1| v1_7(void) = ExitFunction : + +# 14| void complex_arithmetic() +# 14| Block 0 +# 14| v14_1(void) = EnterFunction : +# 14| m14_2(unknown) = AliasedDefinition : +# 14| m14_3(unknown) = InitializeNonLocal : +# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3 +# 15| r15_1(glval) = VariableAddress[f1] : +# 15| r15_2(float) = Constant[5.0] : +# 15| m15_3(float) = Store[f1] : &:r15_1, r15_2 +# 16| r16_1(glval) = VariableAddress[f2] : +# 16| r16_2(float) = Constant[7.0] : +# 16| m16_3(float) = Store[f2] : &:r16_1, r16_2 +# 17| r17_1(glval) = VariableAddress[f3] : +# 17| m17_2(float) = Uninitialized[f3] : &:r17_1 +# 18| r18_1(glval<_Complex float>) = VariableAddress[cf1] : +# 18| r18_2(double) = Constant[2.0] : +# 18| r18_3(_Complex float) = Convert : r18_2 +# 18| m18_4(_Complex float) = Store[cf1] : &:r18_1, r18_3 +# 19| r19_1(glval<_Complex float>) = VariableAddress[cf2] : +# 19| r19_2(_Imaginary float) = Constant[1.0i] : +# 19| r19_3(_Complex float) = Convert : r19_2 +# 19| m19_4(_Complex float) = Store[cf2] : &:r19_1, r19_3 +# 20| r20_1(glval<_Complex float>) = VariableAddress[cf3] : +# 20| m20_2(_Complex float) = Uninitialized[cf3] : &:r20_1 +# 21| r21_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 21| r21_2(_Imaginary float) = Constant[1.0i] : +# 21| m21_3(_Imaginary float) = Store[jf1] : &:r21_1, r21_2 +# 22| r22_1(glval<_Imaginary float>) = VariableAddress[jf2] : +# 22| r22_2(_Imaginary float) = Constant[1.0i] : +# 22| m22_3(_Imaginary float) = Store[jf2] : &:r22_1, r22_2 +# 23| r23_1(glval<_Imaginary float>) = VariableAddress[jf3] : +# 23| m23_2(_Imaginary float) = Uninitialized[jf3] : &:r23_1 +# 26| r26_1(glval<_Complex float>) = VariableAddress[cf1] : +# 26| r26_2(_Complex float) = Load[cf1] : &:r26_1, m18_4 +# 26| r26_3(_Complex float) = CopyValue : r26_2 +# 26| r26_4(glval<_Complex float>) = VariableAddress[cf3] : +# 26| m26_5(_Complex float) = Store[cf3] : &:r26_4, r26_3 +# 27| r27_1(glval<_Complex float>) = VariableAddress[cf1] : +# 27| r27_2(_Complex float) = Load[cf1] : &:r27_1, m18_4 +# 27| r27_3(_Complex float) = Negate : r27_2 +# 27| r27_4(glval<_Complex float>) = VariableAddress[cf3] : +# 27| m27_5(_Complex float) = Store[cf3] : &:r27_4, r27_3 +# 30| r30_1(glval<_Complex float>) = VariableAddress[cf1] : +# 30| r30_2(_Complex float) = Load[cf1] : &:r30_1, m18_4 +# 30| r30_3(glval<_Complex float>) = VariableAddress[cf2] : +# 30| r30_4(_Complex float) = Load[cf2] : &:r30_3, m19_4 +# 30| r30_5(_Complex float) = Add : r30_2, r30_4 +# 30| r30_6(glval<_Complex float>) = VariableAddress[cf3] : +# 30| m30_7(_Complex float) = Store[cf3] : &:r30_6, r30_5 +# 31| r31_1(glval<_Complex float>) = VariableAddress[cf1] : +# 31| r31_2(_Complex float) = Load[cf1] : &:r31_1, m18_4 +# 31| r31_3(glval<_Complex float>) = VariableAddress[cf2] : +# 31| r31_4(_Complex float) = Load[cf2] : &:r31_3, m19_4 +# 31| r31_5(_Complex float) = Sub : r31_2, r31_4 +# 31| r31_6(glval<_Complex float>) = VariableAddress[cf3] : +# 31| m31_7(_Complex float) = Store[cf3] : &:r31_6, r31_5 +# 32| r32_1(glval<_Complex float>) = VariableAddress[cf1] : +# 32| r32_2(_Complex float) = Load[cf1] : &:r32_1, m18_4 +# 32| r32_3(glval<_Complex float>) = VariableAddress[cf2] : +# 32| r32_4(_Complex float) = Load[cf2] : &:r32_3, m19_4 +# 32| r32_5(_Complex float) = Mul : r32_2, r32_4 +# 32| r32_6(glval<_Complex float>) = VariableAddress[cf3] : +# 32| m32_7(_Complex float) = Store[cf3] : &:r32_6, r32_5 +# 33| r33_1(glval<_Complex float>) = VariableAddress[cf1] : +# 33| r33_2(_Complex float) = Load[cf1] : &:r33_1, m18_4 +# 33| r33_3(glval<_Complex float>) = VariableAddress[cf2] : +# 33| r33_4(_Complex float) = Load[cf2] : &:r33_3, m19_4 +# 33| r33_5(_Complex float) = Div : r33_2, r33_4 +# 33| r33_6(glval<_Complex float>) = VariableAddress[cf3] : +# 33| m33_7(_Complex float) = Store[cf3] : &:r33_6, r33_5 +# 36| r36_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 36| r36_2(_Imaginary float) = Load[jf1] : &:r36_1, m21_3 +# 36| r36_3(_Imaginary float) = CopyValue : r36_2 +# 36| r36_4(glval<_Imaginary float>) = VariableAddress[jf3] : +# 36| m36_5(_Imaginary float) = Store[jf3] : &:r36_4, r36_3 +# 37| r37_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 37| r37_2(_Imaginary float) = Load[jf1] : &:r37_1, m21_3 +# 37| r37_3(_Imaginary float) = Negate : r37_2 +# 37| r37_4(glval<_Imaginary float>) = VariableAddress[jf3] : +# 37| m37_5(_Imaginary float) = Store[jf3] : &:r37_4, r37_3 +# 40| r40_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 40| r40_2(_Imaginary float) = Load[jf1] : &:r40_1, m21_3 +# 40| r40_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 40| r40_4(_Imaginary float) = Load[jf2] : &:r40_3, m22_3 +# 40| r40_5(_Imaginary float) = Add : r40_2, r40_4 +# 40| r40_6(glval<_Imaginary float>) = VariableAddress[jf3] : +# 40| m40_7(_Imaginary float) = Store[jf3] : &:r40_6, r40_5 +# 41| r41_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 41| r41_2(_Imaginary float) = Load[jf1] : &:r41_1, m21_3 +# 41| r41_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 41| r41_4(_Imaginary float) = Load[jf2] : &:r41_3, m22_3 +# 41| r41_5(_Imaginary float) = Sub : r41_2, r41_4 +# 41| r41_6(glval<_Imaginary float>) = VariableAddress[jf3] : +# 41| m41_7(_Imaginary float) = Store[jf3] : &:r41_6, r41_5 +# 42| r42_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 42| r42_2(_Imaginary float) = Load[jf1] : &:r42_1, m21_3 +# 42| r42_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 42| r42_4(_Imaginary float) = Load[jf2] : &:r42_3, m22_3 +# 42| r42_5(float) = Mul : r42_2, r42_4 +# 42| r42_6(glval) = VariableAddress[f3] : +# 42| m42_7(float) = Store[f3] : &:r42_6, r42_5 +# 43| r43_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 43| r43_2(_Imaginary float) = Load[jf1] : &:r43_1, m21_3 +# 43| r43_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 43| r43_4(_Imaginary float) = Load[jf2] : &:r43_3, m22_3 +# 43| r43_5(float) = Div : r43_2, r43_4 +# 43| r43_6(glval) = VariableAddress[f3] : +# 43| m43_7(float) = Store[f3] : &:r43_6, r43_5 +# 46| r46_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 46| r46_2(_Imaginary float) = Load[jf1] : &:r46_1, m21_3 +# 46| r46_3(glval) = VariableAddress[f2] : +# 46| r46_4(float) = Load[f2] : &:r46_3, m16_3 +# 46| r46_5(_Complex float) = Add : r46_2, r46_4 +# 46| r46_6(glval<_Complex float>) = VariableAddress[cf3] : +# 46| m46_7(_Complex float) = Store[cf3] : &:r46_6, r46_5 +# 47| r47_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 47| r47_2(_Imaginary float) = Load[jf1] : &:r47_1, m21_3 +# 47| r47_3(glval) = VariableAddress[f2] : +# 47| r47_4(float) = Load[f2] : &:r47_3, m16_3 +# 47| r47_5(_Complex float) = Sub : r47_2, r47_4 +# 47| r47_6(glval<_Complex float>) = VariableAddress[cf3] : +# 47| m47_7(_Complex float) = Store[cf3] : &:r47_6, r47_5 +# 48| r48_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 48| r48_2(_Imaginary float) = Load[jf1] : &:r48_1, m21_3 +# 48| r48_3(glval) = VariableAddress[f2] : +# 48| r48_4(float) = Load[f2] : &:r48_3, m16_3 +# 48| r48_5(_Imaginary float) = Mul : r48_2, r48_4 +# 48| r48_6(glval<_Imaginary float>) = VariableAddress[jf3] : +# 48| m48_7(_Imaginary float) = Store[jf3] : &:r48_6, r48_5 +# 49| r49_1(glval<_Imaginary float>) = VariableAddress[jf1] : +# 49| r49_2(_Imaginary float) = Load[jf1] : &:r49_1, m21_3 +# 49| r49_3(glval) = VariableAddress[f2] : +# 49| r49_4(float) = Load[f2] : &:r49_3, m16_3 +# 49| r49_5(_Imaginary float) = Div : r49_2, r49_4 +# 49| r49_6(glval<_Imaginary float>) = VariableAddress[jf3] : +# 49| m49_7(_Imaginary float) = Store[jf3] : &:r49_6, r49_5 +# 52| r52_1(glval) = VariableAddress[f1] : +# 52| r52_2(float) = Load[f1] : &:r52_1, m15_3 +# 52| r52_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 52| r52_4(_Imaginary float) = Load[jf2] : &:r52_3, m22_3 +# 52| r52_5(_Complex float) = Add : r52_2, r52_4 +# 52| r52_6(glval<_Complex float>) = VariableAddress[cf3] : +# 52| m52_7(_Complex float) = Store[cf3] : &:r52_6, r52_5 +# 53| r53_1(glval) = VariableAddress[f1] : +# 53| r53_2(float) = Load[f1] : &:r53_1, m15_3 +# 53| r53_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 53| r53_4(_Imaginary float) = Load[jf2] : &:r53_3, m22_3 +# 53| r53_5(_Complex float) = Sub : r53_2, r53_4 +# 53| r53_6(glval<_Complex float>) = VariableAddress[cf3] : +# 53| m53_7(_Complex float) = Store[cf3] : &:r53_6, r53_5 +# 54| r54_1(glval) = VariableAddress[f1] : +# 54| r54_2(float) = Load[f1] : &:r54_1, m15_3 +# 54| r54_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 54| r54_4(_Imaginary float) = Load[jf2] : &:r54_3, m22_3 +# 54| r54_5(_Imaginary float) = Mul : r54_2, r54_4 +# 54| r54_6(glval<_Imaginary float>) = VariableAddress[jf3] : +# 54| m54_7(_Imaginary float) = Store[jf3] : &:r54_6, r54_5 +# 55| r55_1(glval) = VariableAddress[f1] : +# 55| r55_2(float) = Load[f1] : &:r55_1, m15_3 +# 55| r55_3(glval<_Imaginary float>) = VariableAddress[jf2] : +# 55| r55_4(_Imaginary float) = Load[jf2] : &:r55_3, m22_3 +# 55| r55_5(_Imaginary float) = Div : r55_2, r55_4 +# 55| r55_6(glval<_Imaginary float>) = VariableAddress[jf3] : +# 55| m55_7(_Imaginary float) = Store[jf3] : &:r55_6, r55_5 +# 56| v56_1(void) = NoOp : +# 14| v14_5(void) = ReturnVoid : +# 14| v14_6(void) = AliasedUse : m14_3 +# 14| v14_7(void) = ExitFunction : + +# 58| void complex_conversions() +# 58| Block 0 +# 58| v58_1(void) = EnterFunction : +# 58| m58_2(unknown) = AliasedDefinition : +# 58| m58_3(unknown) = InitializeNonLocal : +# 58| m58_4(unknown) = Chi : total:m58_2, partial:m58_3 +# 59| r59_1(glval) = VariableAddress[f] : +# 59| r59_2(float) = Constant[2.0] : +# 59| m59_3(float) = Store[f] : &:r59_1, r59_2 +# 60| r60_1(glval) = VariableAddress[d] : +# 60| r60_2(double) = Constant[3.0] : +# 60| m60_3(double) = Store[d] : &:r60_1, r60_2 +# 61| r61_1(glval) = VariableAddress[ld] : +# 61| r61_2(long double) = Constant[5.0] : +# 61| m61_3(long double) = Store[ld] : &:r61_1, r61_2 +# 62| r62_1(glval<_Complex float>) = VariableAddress[cf] : +# 62| r62_2(double) = Constant[7.0] : +# 62| r62_3(_Complex float) = Convert : r62_2 +# 62| m62_4(_Complex float) = Store[cf] : &:r62_1, r62_3 +# 63| r63_1(glval<_Complex double>) = VariableAddress[cd] : +# 63| r63_2(double) = Constant[11.0] : +# 63| r63_3(_Complex double) = Convert : r63_2 +# 63| m63_4(_Complex double) = Store[cd] : &:r63_1, r63_3 +# 64| r64_1(glval<_Complex long double>) = VariableAddress[cld] : +# 64| r64_2(double) = Constant[13.0] : +# 64| r64_3(_Complex long double) = Convert : r64_2 +# 64| m64_4(_Complex long double) = Store[cld] : &:r64_1, r64_3 +# 65| r65_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 65| r65_2(_Imaginary float) = Constant[1.0i] : +# 65| m65_3(_Imaginary float) = Store[jf] : &:r65_1, r65_2 +# 66| r66_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 66| r66_2(_Imaginary float) = Constant[1.0i] : +# 66| r66_3(_Imaginary double) = Convert : r66_2 +# 66| m66_4(_Imaginary double) = Store[jd] : &:r66_1, r66_3 +# 67| r67_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 67| r67_2(_Imaginary float) = Constant[1.0i] : +# 67| r67_3(_Imaginary long double) = Convert : r67_2 +# 67| m67_4(_Imaginary long double) = Store[jld] : &:r67_1, r67_3 +# 70| r70_1(glval<_Complex float>) = VariableAddress[cf] : +# 70| r70_2(_Complex float) = Load[cf] : &:r70_1, m62_4 +# 70| r70_3(glval<_Complex float>) = VariableAddress[cf] : +# 70| m70_4(_Complex float) = Store[cf] : &:r70_3, r70_2 +# 71| r71_1(glval<_Complex double>) = VariableAddress[cd] : +# 71| r71_2(_Complex double) = Load[cd] : &:r71_1, m63_4 +# 71| r71_3(_Complex float) = Convert : r71_2 +# 71| r71_4(glval<_Complex float>) = VariableAddress[cf] : +# 71| m71_5(_Complex float) = Store[cf] : &:r71_4, r71_3 +# 72| r72_1(glval<_Complex long double>) = VariableAddress[cld] : +# 72| r72_2(_Complex long double) = Load[cld] : &:r72_1, m64_4 +# 72| r72_3(_Complex float) = Convert : r72_2 +# 72| r72_4(glval<_Complex float>) = VariableAddress[cf] : +# 72| m72_5(_Complex float) = Store[cf] : &:r72_4, r72_3 +# 73| r73_1(glval<_Complex float>) = VariableAddress[cf] : +# 73| r73_2(_Complex float) = Load[cf] : &:r73_1, m72_5 +# 73| r73_3(_Complex double) = Convert : r73_2 +# 73| r73_4(glval<_Complex double>) = VariableAddress[cd] : +# 73| m73_5(_Complex double) = Store[cd] : &:r73_4, r73_3 +# 74| r74_1(glval<_Complex double>) = VariableAddress[cd] : +# 74| r74_2(_Complex double) = Load[cd] : &:r74_1, m73_5 +# 74| r74_3(glval<_Complex double>) = VariableAddress[cd] : +# 74| m74_4(_Complex double) = Store[cd] : &:r74_3, r74_2 +# 75| r75_1(glval<_Complex long double>) = VariableAddress[cld] : +# 75| r75_2(_Complex long double) = Load[cld] : &:r75_1, m64_4 +# 75| r75_3(_Complex double) = Convert : r75_2 +# 75| r75_4(glval<_Complex double>) = VariableAddress[cd] : +# 75| m75_5(_Complex double) = Store[cd] : &:r75_4, r75_3 +# 76| r76_1(glval<_Complex float>) = VariableAddress[cf] : +# 76| r76_2(_Complex float) = Load[cf] : &:r76_1, m72_5 +# 76| r76_3(_Complex long double) = Convert : r76_2 +# 76| r76_4(glval<_Complex long double>) = VariableAddress[cld] : +# 76| m76_5(_Complex long double) = Store[cld] : &:r76_4, r76_3 +# 77| r77_1(glval<_Complex double>) = VariableAddress[cd] : +# 77| r77_2(_Complex double) = Load[cd] : &:r77_1, m75_5 +# 77| r77_3(_Complex long double) = Convert : r77_2 +# 77| r77_4(glval<_Complex long double>) = VariableAddress[cld] : +# 77| m77_5(_Complex long double) = Store[cld] : &:r77_4, r77_3 +# 78| r78_1(glval<_Complex long double>) = VariableAddress[cld] : +# 78| r78_2(_Complex long double) = Load[cld] : &:r78_1, m77_5 +# 78| r78_3(glval<_Complex long double>) = VariableAddress[cld] : +# 78| m78_4(_Complex long double) = Store[cld] : &:r78_3, r78_2 +# 81| r81_1(glval) = VariableAddress[f] : +# 81| r81_2(float) = Load[f] : &:r81_1, m59_3 +# 81| r81_3(_Complex float) = Convert : r81_2 +# 81| r81_4(glval<_Complex float>) = VariableAddress[cf] : +# 81| m81_5(_Complex float) = Store[cf] : &:r81_4, r81_3 +# 82| r82_1(glval) = VariableAddress[d] : +# 82| r82_2(double) = Load[d] : &:r82_1, m60_3 +# 82| r82_3(_Complex float) = Convert : r82_2 +# 82| r82_4(glval<_Complex float>) = VariableAddress[cf] : +# 82| m82_5(_Complex float) = Store[cf] : &:r82_4, r82_3 +# 83| r83_1(glval) = VariableAddress[ld] : +# 83| r83_2(long double) = Load[ld] : &:r83_1, m61_3 +# 83| r83_3(_Complex float) = Convert : r83_2 +# 83| r83_4(glval<_Complex float>) = VariableAddress[cf] : +# 83| m83_5(_Complex float) = Store[cf] : &:r83_4, r83_3 +# 84| r84_1(glval) = VariableAddress[f] : +# 84| r84_2(float) = Load[f] : &:r84_1, m59_3 +# 84| r84_3(_Complex double) = Convert : r84_2 +# 84| r84_4(glval<_Complex double>) = VariableAddress[cd] : +# 84| m84_5(_Complex double) = Store[cd] : &:r84_4, r84_3 +# 85| r85_1(glval) = VariableAddress[d] : +# 85| r85_2(double) = Load[d] : &:r85_1, m60_3 +# 85| r85_3(_Complex double) = Convert : r85_2 +# 85| r85_4(glval<_Complex double>) = VariableAddress[cd] : +# 85| m85_5(_Complex double) = Store[cd] : &:r85_4, r85_3 +# 86| r86_1(glval) = VariableAddress[ld] : +# 86| r86_2(long double) = Load[ld] : &:r86_1, m61_3 +# 86| r86_3(_Complex double) = Convert : r86_2 +# 86| r86_4(glval<_Complex double>) = VariableAddress[cd] : +# 86| m86_5(_Complex double) = Store[cd] : &:r86_4, r86_3 +# 87| r87_1(glval) = VariableAddress[f] : +# 87| r87_2(float) = Load[f] : &:r87_1, m59_3 +# 87| r87_3(_Complex long double) = Convert : r87_2 +# 87| r87_4(glval<_Complex long double>) = VariableAddress[cld] : +# 87| m87_5(_Complex long double) = Store[cld] : &:r87_4, r87_3 +# 88| r88_1(glval) = VariableAddress[d] : +# 88| r88_2(double) = Load[d] : &:r88_1, m60_3 +# 88| r88_3(_Complex long double) = Convert : r88_2 +# 88| r88_4(glval<_Complex long double>) = VariableAddress[cld] : +# 88| m88_5(_Complex long double) = Store[cld] : &:r88_4, r88_3 +# 89| r89_1(glval) = VariableAddress[ld] : +# 89| r89_2(long double) = Load[ld] : &:r89_1, m61_3 +# 89| r89_3(_Complex long double) = Convert : r89_2 +# 89| r89_4(glval<_Complex long double>) = VariableAddress[cld] : +# 89| m89_5(_Complex long double) = Store[cld] : &:r89_4, r89_3 +# 92| r92_1(glval<_Complex float>) = VariableAddress[cf] : +# 92| r92_2(_Complex float) = Load[cf] : &:r92_1, m83_5 +# 92| r92_3(float) = Convert : r92_2 +# 92| r92_4(glval) = VariableAddress[f] : +# 92| m92_5(float) = Store[f] : &:r92_4, r92_3 +# 93| r93_1(glval<_Complex double>) = VariableAddress[cd] : +# 93| r93_2(_Complex double) = Load[cd] : &:r93_1, m86_5 +# 93| r93_3(float) = Convert : r93_2 +# 93| r93_4(glval) = VariableAddress[f] : +# 93| m93_5(float) = Store[f] : &:r93_4, r93_3 +# 94| r94_1(glval<_Complex long double>) = VariableAddress[cld] : +# 94| r94_2(_Complex long double) = Load[cld] : &:r94_1, m89_5 +# 94| r94_3(float) = Convert : r94_2 +# 94| r94_4(glval) = VariableAddress[f] : +# 94| m94_5(float) = Store[f] : &:r94_4, r94_3 +# 95| r95_1(glval<_Complex float>) = VariableAddress[cf] : +# 95| r95_2(_Complex float) = Load[cf] : &:r95_1, m83_5 +# 95| r95_3(double) = Convert : r95_2 +# 95| r95_4(glval) = VariableAddress[d] : +# 95| m95_5(double) = Store[d] : &:r95_4, r95_3 +# 96| r96_1(glval<_Complex double>) = VariableAddress[cd] : +# 96| r96_2(_Complex double) = Load[cd] : &:r96_1, m86_5 +# 96| r96_3(double) = Convert : r96_2 +# 96| r96_4(glval) = VariableAddress[d] : +# 96| m96_5(double) = Store[d] : &:r96_4, r96_3 +# 97| r97_1(glval<_Complex long double>) = VariableAddress[cld] : +# 97| r97_2(_Complex long double) = Load[cld] : &:r97_1, m89_5 +# 97| r97_3(double) = Convert : r97_2 +# 97| r97_4(glval) = VariableAddress[d] : +# 97| m97_5(double) = Store[d] : &:r97_4, r97_3 +# 98| r98_1(glval<_Complex float>) = VariableAddress[cf] : +# 98| r98_2(_Complex float) = Load[cf] : &:r98_1, m83_5 +# 98| r98_3(long double) = Convert : r98_2 +# 98| r98_4(glval) = VariableAddress[ld] : +# 98| m98_5(long double) = Store[ld] : &:r98_4, r98_3 +# 99| r99_1(glval<_Complex double>) = VariableAddress[cd] : +# 99| r99_2(_Complex double) = Load[cd] : &:r99_1, m86_5 +# 99| r99_3(long double) = Convert : r99_2 +# 99| r99_4(glval) = VariableAddress[ld] : +# 99| m99_5(long double) = Store[ld] : &:r99_4, r99_3 +# 100| r100_1(glval<_Complex long double>) = VariableAddress[cld] : +# 100| r100_2(_Complex long double) = Load[cld] : &:r100_1, m89_5 +# 100| r100_3(long double) = Convert : r100_2 +# 100| r100_4(glval) = VariableAddress[ld] : +# 100| m100_5(long double) = Store[ld] : &:r100_4, r100_3 +# 103| r103_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 103| r103_2(_Imaginary float) = Load[jf] : &:r103_1, m65_3 +# 103| r103_3(_Complex float) = Convert : r103_2 +# 103| r103_4(glval<_Complex float>) = VariableAddress[cf] : +# 103| m103_5(_Complex float) = Store[cf] : &:r103_4, r103_3 +# 104| r104_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 104| r104_2(_Imaginary double) = Load[jd] : &:r104_1, m66_4 +# 104| r104_3(_Complex float) = Convert : r104_2 +# 104| r104_4(glval<_Complex float>) = VariableAddress[cf] : +# 104| m104_5(_Complex float) = Store[cf] : &:r104_4, r104_3 +# 105| r105_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 105| r105_2(_Imaginary long double) = Load[jld] : &:r105_1, m67_4 +# 105| r105_3(_Complex float) = Convert : r105_2 +# 105| r105_4(glval<_Complex float>) = VariableAddress[cf] : +# 105| m105_5(_Complex float) = Store[cf] : &:r105_4, r105_3 +# 106| r106_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 106| r106_2(_Imaginary float) = Load[jf] : &:r106_1, m65_3 +# 106| r106_3(_Complex double) = Convert : r106_2 +# 106| r106_4(glval<_Complex double>) = VariableAddress[cd] : +# 106| m106_5(_Complex double) = Store[cd] : &:r106_4, r106_3 +# 107| r107_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 107| r107_2(_Imaginary double) = Load[jd] : &:r107_1, m66_4 +# 107| r107_3(_Complex double) = Convert : r107_2 +# 107| r107_4(glval<_Complex double>) = VariableAddress[cd] : +# 107| m107_5(_Complex double) = Store[cd] : &:r107_4, r107_3 +# 108| r108_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 108| r108_2(_Imaginary long double) = Load[jld] : &:r108_1, m67_4 +# 108| r108_3(_Complex double) = Convert : r108_2 +# 108| r108_4(glval<_Complex double>) = VariableAddress[cd] : +# 108| m108_5(_Complex double) = Store[cd] : &:r108_4, r108_3 +# 109| r109_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 109| r109_2(_Imaginary float) = Load[jf] : &:r109_1, m65_3 +# 109| r109_3(_Complex long double) = Convert : r109_2 +# 109| r109_4(glval<_Complex long double>) = VariableAddress[cld] : +# 109| m109_5(_Complex long double) = Store[cld] : &:r109_4, r109_3 +# 110| r110_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 110| r110_2(_Imaginary double) = Load[jd] : &:r110_1, m66_4 +# 110| r110_3(_Complex long double) = Convert : r110_2 +# 110| r110_4(glval<_Complex long double>) = VariableAddress[cld] : +# 110| m110_5(_Complex long double) = Store[cld] : &:r110_4, r110_3 +# 111| r111_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 111| r111_2(_Imaginary long double) = Load[jld] : &:r111_1, m67_4 +# 111| r111_3(_Complex long double) = Convert : r111_2 +# 111| r111_4(glval<_Complex long double>) = VariableAddress[cld] : +# 111| m111_5(_Complex long double) = Store[cld] : &:r111_4, r111_3 +# 114| r114_1(glval<_Complex float>) = VariableAddress[cf] : +# 114| r114_2(_Complex float) = Load[cf] : &:r114_1, m105_5 +# 114| r114_3(_Imaginary float) = Convert : r114_2 +# 114| r114_4(glval<_Imaginary float>) = VariableAddress[jf] : +# 114| m114_5(_Imaginary float) = Store[jf] : &:r114_4, r114_3 +# 115| r115_1(glval<_Complex double>) = VariableAddress[cd] : +# 115| r115_2(_Complex double) = Load[cd] : &:r115_1, m108_5 +# 115| r115_3(_Imaginary float) = Convert : r115_2 +# 115| r115_4(glval<_Imaginary float>) = VariableAddress[jf] : +# 115| m115_5(_Imaginary float) = Store[jf] : &:r115_4, r115_3 +# 116| r116_1(glval<_Complex long double>) = VariableAddress[cld] : +# 116| r116_2(_Complex long double) = Load[cld] : &:r116_1, m111_5 +# 116| r116_3(_Imaginary float) = Convert : r116_2 +# 116| r116_4(glval<_Imaginary float>) = VariableAddress[jf] : +# 116| m116_5(_Imaginary float) = Store[jf] : &:r116_4, r116_3 +# 117| r117_1(glval<_Complex float>) = VariableAddress[cf] : +# 117| r117_2(_Complex float) = Load[cf] : &:r117_1, m105_5 +# 117| r117_3(_Imaginary double) = Convert : r117_2 +# 117| r117_4(glval<_Imaginary double>) = VariableAddress[jd] : +# 117| m117_5(_Imaginary double) = Store[jd] : &:r117_4, r117_3 +# 118| r118_1(glval<_Complex double>) = VariableAddress[cd] : +# 118| r118_2(_Complex double) = Load[cd] : &:r118_1, m108_5 +# 118| r118_3(_Imaginary double) = Convert : r118_2 +# 118| r118_4(glval<_Imaginary double>) = VariableAddress[jd] : +# 118| m118_5(_Imaginary double) = Store[jd] : &:r118_4, r118_3 +# 119| r119_1(glval<_Complex long double>) = VariableAddress[cld] : +# 119| r119_2(_Complex long double) = Load[cld] : &:r119_1, m111_5 +# 119| r119_3(_Imaginary double) = Convert : r119_2 +# 119| r119_4(glval<_Imaginary double>) = VariableAddress[jd] : +# 119| m119_5(_Imaginary double) = Store[jd] : &:r119_4, r119_3 +# 120| r120_1(glval<_Complex float>) = VariableAddress[cf] : +# 120| r120_2(_Complex float) = Load[cf] : &:r120_1, m105_5 +# 120| r120_3(_Imaginary long double) = Convert : r120_2 +# 120| r120_4(glval<_Imaginary long double>) = VariableAddress[jld] : +# 120| m120_5(_Imaginary long double) = Store[jld] : &:r120_4, r120_3 +# 121| r121_1(glval<_Complex double>) = VariableAddress[cd] : +# 121| r121_2(_Complex double) = Load[cd] : &:r121_1, m108_5 +# 121| r121_3(_Imaginary long double) = Convert : r121_2 +# 121| r121_4(glval<_Imaginary long double>) = VariableAddress[jld] : +# 121| m121_5(_Imaginary long double) = Store[jld] : &:r121_4, r121_3 +# 122| r122_1(glval<_Complex long double>) = VariableAddress[cld] : +# 122| r122_2(_Complex long double) = Load[cld] : &:r122_1, m111_5 +# 122| r122_3(_Imaginary long double) = Convert : r122_2 +# 122| r122_4(glval<_Imaginary long double>) = VariableAddress[jld] : +# 122| m122_5(_Imaginary long double) = Store[jld] : &:r122_4, r122_3 +# 125| r125_1(glval) = VariableAddress[f] : +# 125| r125_2(float) = Load[f] : &:r125_1, m94_5 +# 125| r125_3(_Imaginary float) = Convert : r125_2 +# 125| r125_4(glval<_Imaginary float>) = VariableAddress[jf] : +# 125| m125_5(_Imaginary float) = Store[jf] : &:r125_4, r125_3 +# 126| r126_1(glval) = VariableAddress[d] : +# 126| r126_2(double) = Load[d] : &:r126_1, m97_5 +# 126| r126_3(_Imaginary float) = Convert : r126_2 +# 126| r126_4(glval<_Imaginary float>) = VariableAddress[jf] : +# 126| m126_5(_Imaginary float) = Store[jf] : &:r126_4, r126_3 +# 127| r127_1(glval) = VariableAddress[ld] : +# 127| r127_2(long double) = Load[ld] : &:r127_1, m100_5 +# 127| r127_3(_Imaginary float) = Convert : r127_2 +# 127| r127_4(glval<_Imaginary float>) = VariableAddress[jf] : +# 127| m127_5(_Imaginary float) = Store[jf] : &:r127_4, r127_3 +# 128| r128_1(glval) = VariableAddress[f] : +# 128| r128_2(float) = Load[f] : &:r128_1, m94_5 +# 128| r128_3(_Imaginary double) = Convert : r128_2 +# 128| r128_4(glval<_Imaginary double>) = VariableAddress[jd] : +# 128| m128_5(_Imaginary double) = Store[jd] : &:r128_4, r128_3 +# 129| r129_1(glval) = VariableAddress[d] : +# 129| r129_2(double) = Load[d] : &:r129_1, m97_5 +# 129| r129_3(_Imaginary double) = Convert : r129_2 +# 129| r129_4(glval<_Imaginary double>) = VariableAddress[jd] : +# 129| m129_5(_Imaginary double) = Store[jd] : &:r129_4, r129_3 +# 130| r130_1(glval) = VariableAddress[ld] : +# 130| r130_2(long double) = Load[ld] : &:r130_1, m100_5 +# 130| r130_3(_Imaginary double) = Convert : r130_2 +# 130| r130_4(glval<_Imaginary double>) = VariableAddress[jd] : +# 130| m130_5(_Imaginary double) = Store[jd] : &:r130_4, r130_3 +# 131| r131_1(glval) = VariableAddress[f] : +# 131| r131_2(float) = Load[f] : &:r131_1, m94_5 +# 131| r131_3(_Imaginary long double) = Convert : r131_2 +# 131| r131_4(glval<_Imaginary long double>) = VariableAddress[jld] : +# 131| m131_5(_Imaginary long double) = Store[jld] : &:r131_4, r131_3 +# 132| r132_1(glval) = VariableAddress[d] : +# 132| r132_2(double) = Load[d] : &:r132_1, m97_5 +# 132| r132_3(_Imaginary long double) = Convert : r132_2 +# 132| r132_4(glval<_Imaginary long double>) = VariableAddress[jld] : +# 132| m132_5(_Imaginary long double) = Store[jld] : &:r132_4, r132_3 +# 133| r133_1(glval) = VariableAddress[ld] : +# 133| r133_2(long double) = Load[ld] : &:r133_1, m100_5 +# 133| r133_3(_Imaginary long double) = Convert : r133_2 +# 133| r133_4(glval<_Imaginary long double>) = VariableAddress[jld] : +# 133| m133_5(_Imaginary long double) = Store[jld] : &:r133_4, r133_3 +# 136| r136_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 136| r136_2(_Imaginary float) = Load[jf] : &:r136_1, m127_5 +# 136| r136_3(float) = Convert : r136_2 +# 136| r136_4(glval) = VariableAddress[f] : +# 136| m136_5(float) = Store[f] : &:r136_4, r136_3 +# 137| r137_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 137| r137_2(_Imaginary double) = Load[jd] : &:r137_1, m130_5 +# 137| r137_3(float) = Convert : r137_2 +# 137| r137_4(glval) = VariableAddress[f] : +# 137| m137_5(float) = Store[f] : &:r137_4, r137_3 +# 138| r138_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 138| r138_2(_Imaginary long double) = Load[jld] : &:r138_1, m133_5 +# 138| r138_3(float) = Convert : r138_2 +# 138| r138_4(glval) = VariableAddress[f] : +# 138| m138_5(float) = Store[f] : &:r138_4, r138_3 +# 139| r139_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 139| r139_2(_Imaginary float) = Load[jf] : &:r139_1, m127_5 +# 139| r139_3(double) = Convert : r139_2 +# 139| r139_4(glval) = VariableAddress[d] : +# 139| m139_5(double) = Store[d] : &:r139_4, r139_3 +# 140| r140_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 140| r140_2(_Imaginary double) = Load[jd] : &:r140_1, m130_5 +# 140| r140_3(double) = Convert : r140_2 +# 140| r140_4(glval) = VariableAddress[d] : +# 140| m140_5(double) = Store[d] : &:r140_4, r140_3 +# 141| r141_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 141| r141_2(_Imaginary long double) = Load[jld] : &:r141_1, m133_5 +# 141| r141_3(double) = Convert : r141_2 +# 141| r141_4(glval) = VariableAddress[d] : +# 141| m141_5(double) = Store[d] : &:r141_4, r141_3 +# 142| r142_1(glval<_Imaginary float>) = VariableAddress[jf] : +# 142| r142_2(_Imaginary float) = Load[jf] : &:r142_1, m127_5 +# 142| r142_3(long double) = Convert : r142_2 +# 142| r142_4(glval) = VariableAddress[ld] : +# 142| m142_5(long double) = Store[ld] : &:r142_4, r142_3 +# 143| r143_1(glval<_Imaginary double>) = VariableAddress[jd] : +# 143| r143_2(_Imaginary double) = Load[jd] : &:r143_1, m130_5 +# 143| r143_3(long double) = Convert : r143_2 +# 143| r143_4(glval) = VariableAddress[ld] : +# 143| m143_5(long double) = Store[ld] : &:r143_4, r143_3 +# 144| r144_1(glval<_Imaginary long double>) = VariableAddress[jld] : +# 144| r144_2(_Imaginary long double) = Load[jld] : &:r144_1, m133_5 +# 144| r144_3(long double) = Convert : r144_2 +# 144| r144_4(glval) = VariableAddress[ld] : +# 144| m144_5(long double) = Store[ld] : &:r144_4, r144_3 +# 145| v145_1(void) = NoOp : +# 58| v58_5(void) = ReturnVoid : +# 58| v58_6(void) = AliasedUse : m58_3 +# 58| v58_7(void) = ExitFunction : + +ir.c: +# 7| void MyCoordsTest(int) +# 7| Block 0 +# 7| v7_1(void) = EnterFunction : +# 7| m7_2(unknown) = AliasedDefinition : +# 7| m7_3(unknown) = InitializeNonLocal : +# 7| m7_4(unknown) = Chi : total:m7_2, partial:m7_3 +# 7| r7_5(glval) = VariableAddress[pos] : +# 7| m7_6(int) = InitializeParameter[pos] : &:r7_5 +# 8| r8_1(glval<(unnamed class/struct/union)>) = VariableAddress[coords] : +# 8| m8_2((unnamed class/struct/union)) = Uninitialized[coords] : &:r8_1 +# 8| r8_3(glval) = FieldAddress[x] : r8_1 +# 8| r8_4(int) = Constant[0] : +# 8| m8_5(int) = Store[?] : &:r8_3, r8_4 +# 8| m8_6((unnamed class/struct/union)) = Chi : total:m8_2, partial:m8_5 +# 8| r8_7(glval) = FieldAddress[y] : r8_1 +# 8| r8_8(int) = Constant[0] : +# 8| m8_9(int) = Store[?] : &:r8_7, r8_8 +# 8| m8_10((unnamed class/struct/union)) = Chi : total:m8_6, partial:m8_9 +# 9| r9_1(glval) = VariableAddress[pos] : +# 9| r9_2(int) = Load[pos] : &:r9_1, m7_6 +# 9| r9_3(int) = Constant[1] : +# 9| r9_4(int) = Add : r9_2, r9_3 +# 9| r9_5(glval<(unnamed class/struct/union)>) = VariableAddress[coords] : +# 9| r9_6(glval) = FieldAddress[y] : r9_5 +# 9| m9_7(int) = Store[?] : &:r9_6, r9_4 +# 9| m9_8((unnamed class/struct/union)) = Chi : total:m8_10, partial:m9_7 +# 9| r9_9(int) = CopyValue : r9_4 +# 9| r9_10(glval<(unnamed class/struct/union)>) = VariableAddress[coords] : +# 9| r9_11(glval) = FieldAddress[x] : r9_10 +# 9| m9_12(int) = Store[?] : &:r9_11, r9_9 +# 9| m9_13((unnamed class/struct/union)) = Chi : total:m9_8, partial:m9_12 +# 10| r10_1(glval) = FunctionAddress[getX] : +# 10| r10_2(glval<(unnamed class/struct/union)>) = VariableAddress[coords] : +# 10| r10_3(struct *) = CopyValue : r10_2 +# 10| r10_4(int) = Call[getX] : func:r10_1, 0:r10_3 +# 10| m10_5(unknown) = ^CallSideEffect : ~m7_4 +# 10| m10_6(unknown) = Chi : total:m7_4, partial:m10_5 +# 10| v10_7(void) = ^BufferReadSideEffect[0] : &:r10_3, ~m9_13 +# 10| m10_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r10_3 +# 10| m10_9((unnamed class/struct/union)) = Chi : total:m9_13, partial:m10_8 +# 10| r10_10(glval<(unnamed class/struct/union)>) = VariableAddress[coords] : +# 10| r10_11(glval) = FieldAddress[x] : r10_10 +# 10| m10_12(int) = Store[?] : &:r10_11, r10_4 +# 10| m10_13((unnamed class/struct/union)) = Chi : total:m10_9, partial:m10_12 +# 11| v11_1(void) = NoOp : +# 7| v7_7(void) = ReturnVoid : +# 7| v7_8(void) = AliasedUse : ~m10_6 +# 7| v7_9(void) = ExitFunction : + +# 13| void CStyleCast(void*) +# 13| Block 0 +# 13| v13_1(void) = EnterFunction : +# 13| m13_2(unknown) = AliasedDefinition : +# 13| m13_3(unknown) = InitializeNonLocal : +# 13| m13_4(unknown) = Chi : total:m13_2, partial:m13_3 +# 13| r13_5(glval) = VariableAddress[src] : +# 13| m13_6(void *) = InitializeParameter[src] : &:r13_5 +# 13| r13_7(void *) = Load[src] : &:r13_5, m13_6 +# 13| m13_8(unknown) = InitializeIndirection[src] : &:r13_7 +# 15| r15_1(glval) = VariableAddress[dst] : +# 15| r15_2(glval) = VariableAddress[src] : +# 15| r15_3(void *) = Load[src] : &:r15_2, m13_6 +# 15| r15_4(char *) = Convert : r15_3 +# 15| m15_5(char *) = Store[dst] : &:r15_1, r15_4 +# 16| v16_1(void) = NoOp : +# 13| v13_9(void) = ReturnIndirection[src] : &:r13_7, m13_8 +# 13| v13_10(void) = ReturnVoid : +# 13| v13_11(void) = AliasedUse : m13_3 +# 13| v13_12(void) = ExitFunction : + +ir.cpp: +# 1| void Constants() +# 1| Block 0 +# 1| v1_1(void) = EnterFunction : +# 1| m1_2(unknown) = AliasedDefinition : +# 1| m1_3(unknown) = InitializeNonLocal : +# 1| m1_4(unknown) = Chi : total:m1_2, partial:m1_3 +# 2| r2_1(glval) = VariableAddress[c_i] : +# 2| r2_2(char) = Constant[1] : +# 2| m2_3(char) = Store[c_i] : &:r2_1, r2_2 +# 3| r3_1(glval) = VariableAddress[c_c] : +# 3| r3_2(char) = Constant[65] : +# 3| m3_3(char) = Store[c_c] : &:r3_1, r3_2 +# 5| r5_1(glval) = VariableAddress[sc_i] : +# 5| r5_2(signed char) = Constant[-1] : +# 5| m5_3(signed char) = Store[sc_i] : &:r5_1, r5_2 +# 6| r6_1(glval) = VariableAddress[sc_c] : +# 6| r6_2(signed char) = Constant[65] : +# 6| m6_3(signed char) = Store[sc_c] : &:r6_1, r6_2 +# 8| r8_1(glval) = VariableAddress[uc_i] : +# 8| r8_2(unsigned char) = Constant[5] : +# 8| m8_3(unsigned char) = Store[uc_i] : &:r8_1, r8_2 +# 9| r9_1(glval) = VariableAddress[uc_c] : +# 9| r9_2(unsigned char) = Constant[65] : +# 9| m9_3(unsigned char) = Store[uc_c] : &:r9_1, r9_2 +# 11| r11_1(glval) = VariableAddress[s] : +# 11| r11_2(short) = Constant[5] : +# 11| m11_3(short) = Store[s] : &:r11_1, r11_2 +# 12| r12_1(glval) = VariableAddress[us] : +# 12| r12_2(unsigned short) = Constant[5] : +# 12| m12_3(unsigned short) = Store[us] : &:r12_1, r12_2 +# 14| r14_1(glval) = VariableAddress[i] : +# 14| r14_2(int) = Constant[5] : +# 14| m14_3(int) = Store[i] : &:r14_1, r14_2 +# 15| r15_1(glval) = VariableAddress[ui] : +# 15| r15_2(unsigned int) = Constant[5] : +# 15| m15_3(unsigned int) = Store[ui] : &:r15_1, r15_2 +# 17| r17_1(glval) = VariableAddress[l] : +# 17| r17_2(long) = Constant[5] : +# 17| m17_3(long) = Store[l] : &:r17_1, r17_2 +# 18| r18_1(glval) = VariableAddress[ul] : +# 18| r18_2(unsigned long) = Constant[5] : +# 18| m18_3(unsigned long) = Store[ul] : &:r18_1, r18_2 +# 20| r20_1(glval) = VariableAddress[ll_i] : +# 20| r20_2(long long) = Constant[5] : +# 20| m20_3(long long) = Store[ll_i] : &:r20_1, r20_2 +# 21| r21_1(glval) = VariableAddress[ll_ll] : +# 21| r21_2(long long) = Constant[5] : +# 21| m21_3(long long) = Store[ll_ll] : &:r21_1, r21_2 +# 22| r22_1(glval) = VariableAddress[ull_i] : +# 22| r22_2(unsigned long long) = Constant[5] : +# 22| m22_3(unsigned long long) = Store[ull_i] : &:r22_1, r22_2 +# 23| r23_1(glval) = VariableAddress[ull_ull] : +# 23| r23_2(unsigned long long) = Constant[5] : +# 23| m23_3(unsigned long long) = Store[ull_ull] : &:r23_1, r23_2 +# 25| r25_1(glval) = VariableAddress[b_t] : +# 25| r25_2(bool) = Constant[1] : +# 25| m25_3(bool) = Store[b_t] : &:r25_1, r25_2 +# 26| r26_1(glval) = VariableAddress[b_f] : +# 26| r26_2(bool) = Constant[0] : +# 26| m26_3(bool) = Store[b_f] : &:r26_1, r26_2 +# 28| r28_1(glval) = VariableAddress[wc_i] : +# 28| r28_2(wchar_t) = Constant[5] : +# 28| m28_3(wchar_t) = Store[wc_i] : &:r28_1, r28_2 +# 29| r29_1(glval) = VariableAddress[wc_c] : +# 29| r29_2(wchar_t) = Constant[65] : +# 29| m29_3(wchar_t) = Store[wc_c] : &:r29_1, r29_2 +# 31| r31_1(glval) = VariableAddress[c16] : +# 31| r31_2(char16_t) = Constant[65] : +# 31| m31_3(char16_t) = Store[c16] : &:r31_1, r31_2 +# 32| r32_1(glval) = VariableAddress[c32] : +# 32| r32_2(char32_t) = Constant[65] : +# 32| m32_3(char32_t) = Store[c32] : &:r32_1, r32_2 +# 34| r34_1(glval) = VariableAddress[f_i] : +# 34| r34_2(float) = Constant[1.0] : +# 34| m34_3(float) = Store[f_i] : &:r34_1, r34_2 +# 35| r35_1(glval) = VariableAddress[f_f] : +# 35| r35_2(float) = Constant[1.0] : +# 35| m35_3(float) = Store[f_f] : &:r35_1, r35_2 +# 36| r36_1(glval) = VariableAddress[f_d] : +# 36| r36_2(float) = Constant[1.0] : +# 36| m36_3(float) = Store[f_d] : &:r36_1, r36_2 +# 38| r38_1(glval) = VariableAddress[d_i] : +# 38| r38_2(double) = Constant[1.0] : +# 38| m38_3(double) = Store[d_i] : &:r38_1, r38_2 +# 39| r39_1(glval) = VariableAddress[d_f] : +# 39| r39_2(double) = Constant[1.0] : +# 39| m39_3(double) = Store[d_f] : &:r39_1, r39_2 +# 40| r40_1(glval) = VariableAddress[d_d] : +# 40| r40_2(double) = Constant[1.0] : +# 40| m40_3(double) = Store[d_d] : &:r40_1, r40_2 +# 41| v41_1(void) = NoOp : +# 1| v1_5(void) = ReturnVoid : +# 1| v1_6(void) = AliasedUse : m1_3 +# 1| v1_7(void) = ExitFunction : + +# 43| void Foo() +# 43| Block 0 +# 43| v43_1(void) = EnterFunction : +# 43| m43_2(unknown) = AliasedDefinition : +# 43| m43_3(unknown) = InitializeNonLocal : +# 43| m43_4(unknown) = Chi : total:m43_2, partial:m43_3 +# 44| r44_1(glval) = VariableAddress[x] : +# 44| r44_2(int) = Constant[17] : +# 44| m44_3(int) = Store[x] : &:r44_1, r44_2 +# 45| r45_1(glval) = VariableAddress[y] : +# 45| r45_2(short) = Constant[7] : +# 45| m45_3(short) = Store[y] : &:r45_1, r45_2 +# 46| r46_1(glval) = VariableAddress[x] : +# 46| r46_2(int) = Load[x] : &:r46_1, m44_3 +# 46| r46_3(glval) = VariableAddress[y] : +# 46| r46_4(short) = Load[y] : &:r46_3, m45_3 +# 46| r46_5(int) = Convert : r46_4 +# 46| r46_6(int) = Add : r46_2, r46_5 +# 46| r46_7(short) = Convert : r46_6 +# 46| r46_8(glval) = VariableAddress[y] : +# 46| m46_9(short) = Store[y] : &:r46_8, r46_7 +# 47| r47_1(glval) = VariableAddress[x] : +# 47| r47_2(int) = Load[x] : &:r47_1, m44_3 +# 47| r47_3(glval) = VariableAddress[y] : +# 47| r47_4(short) = Load[y] : &:r47_3, m46_9 +# 47| r47_5(int) = Convert : r47_4 +# 47| r47_6(int) = Mul : r47_2, r47_5 +# 47| r47_7(glval) = VariableAddress[x] : +# 47| m47_8(int) = Store[x] : &:r47_7, r47_6 +# 48| v48_1(void) = NoOp : +# 43| v43_5(void) = ReturnVoid : +# 43| v43_6(void) = AliasedUse : m43_3 +# 43| v43_7(void) = ExitFunction : + +# 50| void IntegerOps(int, int) +# 50| Block 0 +# 50| v50_1(void) = EnterFunction : +# 50| m50_2(unknown) = AliasedDefinition : +# 50| m50_3(unknown) = InitializeNonLocal : +# 50| m50_4(unknown) = Chi : total:m50_2, partial:m50_3 +# 50| r50_5(glval) = VariableAddress[x] : +# 50| m50_6(int) = InitializeParameter[x] : &:r50_5 +# 50| r50_7(glval) = VariableAddress[y] : +# 50| m50_8(int) = InitializeParameter[y] : &:r50_7 +# 51| r51_1(glval) = VariableAddress[z] : +# 51| m51_2(int) = Uninitialized[z] : &:r51_1 +# 53| r53_1(glval) = VariableAddress[x] : +# 53| r53_2(int) = Load[x] : &:r53_1, m50_6 +# 53| r53_3(glval) = VariableAddress[y] : +# 53| r53_4(int) = Load[y] : &:r53_3, m50_8 +# 53| r53_5(int) = Add : r53_2, r53_4 +# 53| r53_6(glval) = VariableAddress[z] : +# 53| m53_7(int) = Store[z] : &:r53_6, r53_5 +# 54| r54_1(glval) = VariableAddress[x] : +# 54| r54_2(int) = Load[x] : &:r54_1, m50_6 +# 54| r54_3(glval) = VariableAddress[y] : +# 54| r54_4(int) = Load[y] : &:r54_3, m50_8 +# 54| r54_5(int) = Sub : r54_2, r54_4 +# 54| r54_6(glval) = VariableAddress[z] : +# 54| m54_7(int) = Store[z] : &:r54_6, r54_5 +# 55| r55_1(glval) = VariableAddress[x] : +# 55| r55_2(int) = Load[x] : &:r55_1, m50_6 +# 55| r55_3(glval) = VariableAddress[y] : +# 55| r55_4(int) = Load[y] : &:r55_3, m50_8 +# 55| r55_5(int) = Mul : r55_2, r55_4 +# 55| r55_6(glval) = VariableAddress[z] : +# 55| m55_7(int) = Store[z] : &:r55_6, r55_5 +# 56| r56_1(glval) = VariableAddress[x] : +# 56| r56_2(int) = Load[x] : &:r56_1, m50_6 +# 56| r56_3(glval) = VariableAddress[y] : +# 56| r56_4(int) = Load[y] : &:r56_3, m50_8 +# 56| r56_5(int) = Div : r56_2, r56_4 +# 56| r56_6(glval) = VariableAddress[z] : +# 56| m56_7(int) = Store[z] : &:r56_6, r56_5 +# 57| r57_1(glval) = VariableAddress[x] : +# 57| r57_2(int) = Load[x] : &:r57_1, m50_6 +# 57| r57_3(glval) = VariableAddress[y] : +# 57| r57_4(int) = Load[y] : &:r57_3, m50_8 +# 57| r57_5(int) = Rem : r57_2, r57_4 +# 57| r57_6(glval) = VariableAddress[z] : +# 57| m57_7(int) = Store[z] : &:r57_6, r57_5 +# 59| r59_1(glval) = VariableAddress[x] : +# 59| r59_2(int) = Load[x] : &:r59_1, m50_6 +# 59| r59_3(glval) = VariableAddress[y] : +# 59| r59_4(int) = Load[y] : &:r59_3, m50_8 +# 59| r59_5(int) = BitAnd : r59_2, r59_4 +# 59| r59_6(glval) = VariableAddress[z] : +# 59| m59_7(int) = Store[z] : &:r59_6, r59_5 +# 60| r60_1(glval) = VariableAddress[x] : +# 60| r60_2(int) = Load[x] : &:r60_1, m50_6 +# 60| r60_3(glval) = VariableAddress[y] : +# 60| r60_4(int) = Load[y] : &:r60_3, m50_8 +# 60| r60_5(int) = BitOr : r60_2, r60_4 +# 60| r60_6(glval) = VariableAddress[z] : +# 60| m60_7(int) = Store[z] : &:r60_6, r60_5 +# 61| r61_1(glval) = VariableAddress[x] : +# 61| r61_2(int) = Load[x] : &:r61_1, m50_6 +# 61| r61_3(glval) = VariableAddress[y] : +# 61| r61_4(int) = Load[y] : &:r61_3, m50_8 +# 61| r61_5(int) = BitXor : r61_2, r61_4 +# 61| r61_6(glval) = VariableAddress[z] : +# 61| m61_7(int) = Store[z] : &:r61_6, r61_5 +# 63| r63_1(glval) = VariableAddress[x] : +# 63| r63_2(int) = Load[x] : &:r63_1, m50_6 +# 63| r63_3(glval) = VariableAddress[y] : +# 63| r63_4(int) = Load[y] : &:r63_3, m50_8 +# 63| r63_5(int) = ShiftLeft : r63_2, r63_4 +# 63| r63_6(glval) = VariableAddress[z] : +# 63| m63_7(int) = Store[z] : &:r63_6, r63_5 +# 64| r64_1(glval) = VariableAddress[x] : +# 64| r64_2(int) = Load[x] : &:r64_1, m50_6 +# 64| r64_3(glval) = VariableAddress[y] : +# 64| r64_4(int) = Load[y] : &:r64_3, m50_8 +# 64| r64_5(int) = ShiftRight : r64_2, r64_4 +# 64| r64_6(glval) = VariableAddress[z] : +# 64| m64_7(int) = Store[z] : &:r64_6, r64_5 +# 66| r66_1(glval) = VariableAddress[x] : +# 66| r66_2(int) = Load[x] : &:r66_1, m50_6 +# 66| r66_3(glval) = VariableAddress[z] : +# 66| m66_4(int) = Store[z] : &:r66_3, r66_2 +# 68| r68_1(glval) = VariableAddress[x] : +# 68| r68_2(int) = Load[x] : &:r68_1, m50_6 +# 68| r68_3(glval) = VariableAddress[z] : +# 68| r68_4(int) = Load[z] : &:r68_3, m66_4 +# 68| r68_5(int) = Add : r68_4, r68_2 +# 68| m68_6(int) = Store[z] : &:r68_3, r68_5 +# 69| r69_1(glval) = VariableAddress[x] : +# 69| r69_2(int) = Load[x] : &:r69_1, m50_6 +# 69| r69_3(glval) = VariableAddress[z] : +# 69| r69_4(int) = Load[z] : &:r69_3, m68_6 +# 69| r69_5(int) = Sub : r69_4, r69_2 +# 69| m69_6(int) = Store[z] : &:r69_3, r69_5 +# 70| r70_1(glval) = VariableAddress[x] : +# 70| r70_2(int) = Load[x] : &:r70_1, m50_6 +# 70| r70_3(glval) = VariableAddress[z] : +# 70| r70_4(int) = Load[z] : &:r70_3, m69_6 +# 70| r70_5(int) = Mul : r70_4, r70_2 +# 70| m70_6(int) = Store[z] : &:r70_3, r70_5 +# 71| r71_1(glval) = VariableAddress[x] : +# 71| r71_2(int) = Load[x] : &:r71_1, m50_6 +# 71| r71_3(glval) = VariableAddress[z] : +# 71| r71_4(int) = Load[z] : &:r71_3, m70_6 +# 71| r71_5(int) = Div : r71_4, r71_2 +# 71| m71_6(int) = Store[z] : &:r71_3, r71_5 +# 72| r72_1(glval) = VariableAddress[x] : +# 72| r72_2(int) = Load[x] : &:r72_1, m50_6 +# 72| r72_3(glval) = VariableAddress[z] : +# 72| r72_4(int) = Load[z] : &:r72_3, m71_6 +# 72| r72_5(int) = Rem : r72_4, r72_2 +# 72| m72_6(int) = Store[z] : &:r72_3, r72_5 +# 74| r74_1(glval) = VariableAddress[x] : +# 74| r74_2(int) = Load[x] : &:r74_1, m50_6 +# 74| r74_3(glval) = VariableAddress[z] : +# 74| r74_4(int) = Load[z] : &:r74_3, m72_6 +# 74| r74_5(int) = BitAnd : r74_4, r74_2 +# 74| m74_6(int) = Store[z] : &:r74_3, r74_5 +# 75| r75_1(glval) = VariableAddress[x] : +# 75| r75_2(int) = Load[x] : &:r75_1, m50_6 +# 75| r75_3(glval) = VariableAddress[z] : +# 75| r75_4(int) = Load[z] : &:r75_3, m74_6 +# 75| r75_5(int) = BitOr : r75_4, r75_2 +# 75| m75_6(int) = Store[z] : &:r75_3, r75_5 +# 76| r76_1(glval) = VariableAddress[x] : +# 76| r76_2(int) = Load[x] : &:r76_1, m50_6 +# 76| r76_3(glval) = VariableAddress[z] : +# 76| r76_4(int) = Load[z] : &:r76_3, m75_6 +# 76| r76_5(int) = BitXor : r76_4, r76_2 +# 76| m76_6(int) = Store[z] : &:r76_3, r76_5 +# 78| r78_1(glval) = VariableAddress[x] : +# 78| r78_2(int) = Load[x] : &:r78_1, m50_6 +# 78| r78_3(glval) = VariableAddress[z] : +# 78| r78_4(int) = Load[z] : &:r78_3, m76_6 +# 78| r78_5(int) = ShiftLeft : r78_4, r78_2 +# 78| m78_6(int) = Store[z] : &:r78_3, r78_5 +# 79| r79_1(glval) = VariableAddress[x] : +# 79| r79_2(int) = Load[x] : &:r79_1, m50_6 +# 79| r79_3(glval) = VariableAddress[z] : +# 79| r79_4(int) = Load[z] : &:r79_3, m78_6 +# 79| r79_5(int) = ShiftRight : r79_4, r79_2 +# 79| m79_6(int) = Store[z] : &:r79_3, r79_5 +# 81| r81_1(glval) = VariableAddress[x] : +# 81| r81_2(int) = Load[x] : &:r81_1, m50_6 +# 81| r81_3(int) = CopyValue : r81_2 +# 81| r81_4(glval) = VariableAddress[z] : +# 81| m81_5(int) = Store[z] : &:r81_4, r81_3 +# 82| r82_1(glval) = VariableAddress[x] : +# 82| r82_2(int) = Load[x] : &:r82_1, m50_6 +# 82| r82_3(int) = Negate : r82_2 +# 82| r82_4(glval) = VariableAddress[z] : +# 82| m82_5(int) = Store[z] : &:r82_4, r82_3 +# 83| r83_1(glval) = VariableAddress[x] : +# 83| r83_2(int) = Load[x] : &:r83_1, m50_6 +# 83| r83_3(int) = BitComplement : r83_2 +# 83| r83_4(glval) = VariableAddress[z] : +# 83| m83_5(int) = Store[z] : &:r83_4, r83_3 +# 84| r84_1(glval) = VariableAddress[x] : +# 84| r84_2(int) = Load[x] : &:r84_1, m50_6 +# 84| r84_3(int) = Constant[0] : +# 84| r84_4(bool) = CompareNE : r84_2, r84_3 +# 84| r84_5(bool) = LogicalNot : r84_4 +# 84| r84_6(int) = Convert : r84_5 +# 84| r84_7(glval) = VariableAddress[z] : +# 84| m84_8(int) = Store[z] : &:r84_7, r84_6 +# 85| v85_1(void) = NoOp : +# 50| v50_9(void) = ReturnVoid : +# 50| v50_10(void) = AliasedUse : m50_3 +# 50| v50_11(void) = ExitFunction : + +# 87| void IntegerCompare(int, int) +# 87| Block 0 +# 87| v87_1(void) = EnterFunction : +# 87| m87_2(unknown) = AliasedDefinition : +# 87| m87_3(unknown) = InitializeNonLocal : +# 87| m87_4(unknown) = Chi : total:m87_2, partial:m87_3 +# 87| r87_5(glval) = VariableAddress[x] : +# 87| m87_6(int) = InitializeParameter[x] : &:r87_5 +# 87| r87_7(glval) = VariableAddress[y] : +# 87| m87_8(int) = InitializeParameter[y] : &:r87_7 +# 88| r88_1(glval) = VariableAddress[b] : +# 88| m88_2(bool) = Uninitialized[b] : &:r88_1 +# 90| r90_1(glval) = VariableAddress[x] : +# 90| r90_2(int) = Load[x] : &:r90_1, m87_6 +# 90| r90_3(glval) = VariableAddress[y] : +# 90| r90_4(int) = Load[y] : &:r90_3, m87_8 +# 90| r90_5(bool) = CompareEQ : r90_2, r90_4 +# 90| r90_6(glval) = VariableAddress[b] : +# 90| m90_7(bool) = Store[b] : &:r90_6, r90_5 +# 91| r91_1(glval) = VariableAddress[x] : +# 91| r91_2(int) = Load[x] : &:r91_1, m87_6 +# 91| r91_3(glval) = VariableAddress[y] : +# 91| r91_4(int) = Load[y] : &:r91_3, m87_8 +# 91| r91_5(bool) = CompareNE : r91_2, r91_4 +# 91| r91_6(glval) = VariableAddress[b] : +# 91| m91_7(bool) = Store[b] : &:r91_6, r91_5 +# 92| r92_1(glval) = VariableAddress[x] : +# 92| r92_2(int) = Load[x] : &:r92_1, m87_6 +# 92| r92_3(glval) = VariableAddress[y] : +# 92| r92_4(int) = Load[y] : &:r92_3, m87_8 +# 92| r92_5(bool) = CompareLT : r92_2, r92_4 +# 92| r92_6(glval) = VariableAddress[b] : +# 92| m92_7(bool) = Store[b] : &:r92_6, r92_5 +# 93| r93_1(glval) = VariableAddress[x] : +# 93| r93_2(int) = Load[x] : &:r93_1, m87_6 +# 93| r93_3(glval) = VariableAddress[y] : +# 93| r93_4(int) = Load[y] : &:r93_3, m87_8 +# 93| r93_5(bool) = CompareGT : r93_2, r93_4 +# 93| r93_6(glval) = VariableAddress[b] : +# 93| m93_7(bool) = Store[b] : &:r93_6, r93_5 +# 94| r94_1(glval) = VariableAddress[x] : +# 94| r94_2(int) = Load[x] : &:r94_1, m87_6 +# 94| r94_3(glval) = VariableAddress[y] : +# 94| r94_4(int) = Load[y] : &:r94_3, m87_8 +# 94| r94_5(bool) = CompareLE : r94_2, r94_4 +# 94| r94_6(glval) = VariableAddress[b] : +# 94| m94_7(bool) = Store[b] : &:r94_6, r94_5 +# 95| r95_1(glval) = VariableAddress[x] : +# 95| r95_2(int) = Load[x] : &:r95_1, m87_6 +# 95| r95_3(glval) = VariableAddress[y] : +# 95| r95_4(int) = Load[y] : &:r95_3, m87_8 +# 95| r95_5(bool) = CompareGE : r95_2, r95_4 +# 95| r95_6(glval) = VariableAddress[b] : +# 95| m95_7(bool) = Store[b] : &:r95_6, r95_5 +# 96| v96_1(void) = NoOp : +# 87| v87_9(void) = ReturnVoid : +# 87| v87_10(void) = AliasedUse : m87_3 +# 87| v87_11(void) = ExitFunction : + +# 98| void IntegerCrement(int) +# 98| Block 0 +# 98| v98_1(void) = EnterFunction : +# 98| m98_2(unknown) = AliasedDefinition : +# 98| m98_3(unknown) = InitializeNonLocal : +# 98| m98_4(unknown) = Chi : total:m98_2, partial:m98_3 +# 98| r98_5(glval) = VariableAddress[x] : +# 98| m98_6(int) = InitializeParameter[x] : &:r98_5 +# 99| r99_1(glval) = VariableAddress[y] : +# 99| m99_2(int) = Uninitialized[y] : &:r99_1 +# 101| r101_1(glval) = VariableAddress[x] : +# 101| r101_2(int) = Load[x] : &:r101_1, m98_6 +# 101| r101_3(int) = Constant[1] : +# 101| r101_4(int) = Add : r101_2, r101_3 +# 101| m101_5(int) = Store[x] : &:r101_1, r101_4 +# 101| r101_6(glval) = VariableAddress[y] : +# 101| m101_7(int) = Store[y] : &:r101_6, r101_4 +# 102| r102_1(glval) = VariableAddress[x] : +# 102| r102_2(int) = Load[x] : &:r102_1, m101_5 +# 102| r102_3(int) = Constant[1] : +# 102| r102_4(int) = Sub : r102_2, r102_3 +# 102| m102_5(int) = Store[x] : &:r102_1, r102_4 +# 102| r102_6(glval) = VariableAddress[y] : +# 102| m102_7(int) = Store[y] : &:r102_6, r102_4 +# 103| r103_1(glval) = VariableAddress[x] : +# 103| r103_2(int) = Load[x] : &:r103_1, m102_5 +# 103| r103_3(int) = Constant[1] : +# 103| r103_4(int) = Add : r103_2, r103_3 +# 103| m103_5(int) = Store[x] : &:r103_1, r103_4 +# 103| r103_6(int) = CopyValue : r103_2 +# 103| r103_7(glval) = VariableAddress[y] : +# 103| m103_8(int) = Store[y] : &:r103_7, r103_6 +# 104| r104_1(glval) = VariableAddress[x] : +# 104| r104_2(int) = Load[x] : &:r104_1, m103_5 +# 104| r104_3(int) = Constant[1] : +# 104| r104_4(int) = Sub : r104_2, r104_3 +# 104| m104_5(int) = Store[x] : &:r104_1, r104_4 +# 104| r104_6(int) = CopyValue : r104_2 +# 104| r104_7(glval) = VariableAddress[y] : +# 104| m104_8(int) = Store[y] : &:r104_7, r104_6 +# 105| v105_1(void) = NoOp : +# 98| v98_7(void) = ReturnVoid : +# 98| v98_8(void) = AliasedUse : m98_3 +# 98| v98_9(void) = ExitFunction : + +# 107| void IntegerCrement_LValue(int) +# 107| Block 0 +# 107| v107_1(void) = EnterFunction : +# 107| m107_2(unknown) = AliasedDefinition : +# 107| m107_3(unknown) = InitializeNonLocal : +# 107| m107_4(unknown) = Chi : total:m107_2, partial:m107_3 +# 107| r107_5(glval) = VariableAddress[x] : +# 107| m107_6(int) = InitializeParameter[x] : &:r107_5 +# 108| r108_1(glval) = VariableAddress[p] : +# 108| m108_2(int *) = Uninitialized[p] : &:r108_1 +# 110| r110_1(glval) = VariableAddress[x] : +# 110| r110_2(int) = Load[x] : &:r110_1, m107_6 +# 110| r110_3(int) = Constant[1] : +# 110| r110_4(int) = Add : r110_2, r110_3 +# 110| m110_5(int) = Store[x] : &:r110_1, r110_4 +# 110| r110_6(glval) = CopyValue : r110_1 +# 110| r110_7(int *) = CopyValue : r110_6 +# 110| r110_8(glval) = VariableAddress[p] : +# 110| m110_9(int *) = Store[p] : &:r110_8, r110_7 +# 111| r111_1(glval) = VariableAddress[x] : +# 111| r111_2(int) = Load[x] : &:r111_1, m110_5 +# 111| r111_3(int) = Constant[1] : +# 111| r111_4(int) = Sub : r111_2, r111_3 +# 111| m111_5(int) = Store[x] : &:r111_1, r111_4 +# 111| r111_6(glval) = CopyValue : r111_1 +# 111| r111_7(int *) = CopyValue : r111_6 +# 111| r111_8(glval) = VariableAddress[p] : +# 111| m111_9(int *) = Store[p] : &:r111_8, r111_7 +# 112| v112_1(void) = NoOp : +# 107| v107_7(void) = ReturnVoid : +# 107| v107_8(void) = AliasedUse : m107_3 +# 107| v107_9(void) = ExitFunction : + +# 114| void FloatOps(double, double) +# 114| Block 0 +# 114| v114_1(void) = EnterFunction : +# 114| m114_2(unknown) = AliasedDefinition : +# 114| m114_3(unknown) = InitializeNonLocal : +# 114| m114_4(unknown) = Chi : total:m114_2, partial:m114_3 +# 114| r114_5(glval) = VariableAddress[x] : +# 114| m114_6(double) = InitializeParameter[x] : &:r114_5 +# 114| r114_7(glval) = VariableAddress[y] : +# 114| m114_8(double) = InitializeParameter[y] : &:r114_7 +# 115| r115_1(glval) = VariableAddress[z] : +# 115| m115_2(double) = Uninitialized[z] : &:r115_1 +# 117| r117_1(glval) = VariableAddress[x] : +# 117| r117_2(double) = Load[x] : &:r117_1, m114_6 +# 117| r117_3(glval) = VariableAddress[y] : +# 117| r117_4(double) = Load[y] : &:r117_3, m114_8 +# 117| r117_5(double) = Add : r117_2, r117_4 +# 117| r117_6(glval) = VariableAddress[z] : +# 117| m117_7(double) = Store[z] : &:r117_6, r117_5 +# 118| r118_1(glval) = VariableAddress[x] : +# 118| r118_2(double) = Load[x] : &:r118_1, m114_6 +# 118| r118_3(glval) = VariableAddress[y] : +# 118| r118_4(double) = Load[y] : &:r118_3, m114_8 +# 118| r118_5(double) = Sub : r118_2, r118_4 +# 118| r118_6(glval) = VariableAddress[z] : +# 118| m118_7(double) = Store[z] : &:r118_6, r118_5 +# 119| r119_1(glval) = VariableAddress[x] : +# 119| r119_2(double) = Load[x] : &:r119_1, m114_6 +# 119| r119_3(glval) = VariableAddress[y] : +# 119| r119_4(double) = Load[y] : &:r119_3, m114_8 +# 119| r119_5(double) = Mul : r119_2, r119_4 +# 119| r119_6(glval) = VariableAddress[z] : +# 119| m119_7(double) = Store[z] : &:r119_6, r119_5 +# 120| r120_1(glval) = VariableAddress[x] : +# 120| r120_2(double) = Load[x] : &:r120_1, m114_6 +# 120| r120_3(glval) = VariableAddress[y] : +# 120| r120_4(double) = Load[y] : &:r120_3, m114_8 +# 120| r120_5(double) = Div : r120_2, r120_4 +# 120| r120_6(glval) = VariableAddress[z] : +# 120| m120_7(double) = Store[z] : &:r120_6, r120_5 +# 122| r122_1(glval) = VariableAddress[x] : +# 122| r122_2(double) = Load[x] : &:r122_1, m114_6 +# 122| r122_3(glval) = VariableAddress[z] : +# 122| m122_4(double) = Store[z] : &:r122_3, r122_2 +# 124| r124_1(glval) = VariableAddress[x] : +# 124| r124_2(double) = Load[x] : &:r124_1, m114_6 +# 124| r124_3(glval) = VariableAddress[z] : +# 124| r124_4(double) = Load[z] : &:r124_3, m122_4 +# 124| r124_5(double) = Add : r124_4, r124_2 +# 124| m124_6(double) = Store[z] : &:r124_3, r124_5 +# 125| r125_1(glval) = VariableAddress[x] : +# 125| r125_2(double) = Load[x] : &:r125_1, m114_6 +# 125| r125_3(glval) = VariableAddress[z] : +# 125| r125_4(double) = Load[z] : &:r125_3, m124_6 +# 125| r125_5(double) = Sub : r125_4, r125_2 +# 125| m125_6(double) = Store[z] : &:r125_3, r125_5 +# 126| r126_1(glval) = VariableAddress[x] : +# 126| r126_2(double) = Load[x] : &:r126_1, m114_6 +# 126| r126_3(glval) = VariableAddress[z] : +# 126| r126_4(double) = Load[z] : &:r126_3, m125_6 +# 126| r126_5(double) = Mul : r126_4, r126_2 +# 126| m126_6(double) = Store[z] : &:r126_3, r126_5 +# 127| r127_1(glval) = VariableAddress[x] : +# 127| r127_2(double) = Load[x] : &:r127_1, m114_6 +# 127| r127_3(glval) = VariableAddress[z] : +# 127| r127_4(double) = Load[z] : &:r127_3, m126_6 +# 127| r127_5(double) = Div : r127_4, r127_2 +# 127| m127_6(double) = Store[z] : &:r127_3, r127_5 +# 129| r129_1(glval) = VariableAddress[x] : +# 129| r129_2(double) = Load[x] : &:r129_1, m114_6 +# 129| r129_3(double) = CopyValue : r129_2 +# 129| r129_4(glval) = VariableAddress[z] : +# 129| m129_5(double) = Store[z] : &:r129_4, r129_3 +# 130| r130_1(glval) = VariableAddress[x] : +# 130| r130_2(double) = Load[x] : &:r130_1, m114_6 +# 130| r130_3(double) = Negate : r130_2 +# 130| r130_4(glval) = VariableAddress[z] : +# 130| m130_5(double) = Store[z] : &:r130_4, r130_3 +# 131| v131_1(void) = NoOp : +# 114| v114_9(void) = ReturnVoid : +# 114| v114_10(void) = AliasedUse : m114_3 +# 114| v114_11(void) = ExitFunction : + +# 133| void FloatCompare(double, double) +# 133| Block 0 +# 133| v133_1(void) = EnterFunction : +# 133| m133_2(unknown) = AliasedDefinition : +# 133| m133_3(unknown) = InitializeNonLocal : +# 133| m133_4(unknown) = Chi : total:m133_2, partial:m133_3 +# 133| r133_5(glval) = VariableAddress[x] : +# 133| m133_6(double) = InitializeParameter[x] : &:r133_5 +# 133| r133_7(glval) = VariableAddress[y] : +# 133| m133_8(double) = InitializeParameter[y] : &:r133_7 +# 134| r134_1(glval) = VariableAddress[b] : +# 134| m134_2(bool) = Uninitialized[b] : &:r134_1 +# 136| r136_1(glval) = VariableAddress[x] : +# 136| r136_2(double) = Load[x] : &:r136_1, m133_6 +# 136| r136_3(glval) = VariableAddress[y] : +# 136| r136_4(double) = Load[y] : &:r136_3, m133_8 +# 136| r136_5(bool) = CompareEQ : r136_2, r136_4 +# 136| r136_6(glval) = VariableAddress[b] : +# 136| m136_7(bool) = Store[b] : &:r136_6, r136_5 +# 137| r137_1(glval) = VariableAddress[x] : +# 137| r137_2(double) = Load[x] : &:r137_1, m133_6 +# 137| r137_3(glval) = VariableAddress[y] : +# 137| r137_4(double) = Load[y] : &:r137_3, m133_8 +# 137| r137_5(bool) = CompareNE : r137_2, r137_4 +# 137| r137_6(glval) = VariableAddress[b] : +# 137| m137_7(bool) = Store[b] : &:r137_6, r137_5 +# 138| r138_1(glval) = VariableAddress[x] : +# 138| r138_2(double) = Load[x] : &:r138_1, m133_6 +# 138| r138_3(glval) = VariableAddress[y] : +# 138| r138_4(double) = Load[y] : &:r138_3, m133_8 +# 138| r138_5(bool) = CompareLT : r138_2, r138_4 +# 138| r138_6(glval) = VariableAddress[b] : +# 138| m138_7(bool) = Store[b] : &:r138_6, r138_5 +# 139| r139_1(glval) = VariableAddress[x] : +# 139| r139_2(double) = Load[x] : &:r139_1, m133_6 +# 139| r139_3(glval) = VariableAddress[y] : +# 139| r139_4(double) = Load[y] : &:r139_3, m133_8 +# 139| r139_5(bool) = CompareGT : r139_2, r139_4 +# 139| r139_6(glval) = VariableAddress[b] : +# 139| m139_7(bool) = Store[b] : &:r139_6, r139_5 +# 140| r140_1(glval) = VariableAddress[x] : +# 140| r140_2(double) = Load[x] : &:r140_1, m133_6 +# 140| r140_3(glval) = VariableAddress[y] : +# 140| r140_4(double) = Load[y] : &:r140_3, m133_8 +# 140| r140_5(bool) = CompareLE : r140_2, r140_4 +# 140| r140_6(glval) = VariableAddress[b] : +# 140| m140_7(bool) = Store[b] : &:r140_6, r140_5 +# 141| r141_1(glval) = VariableAddress[x] : +# 141| r141_2(double) = Load[x] : &:r141_1, m133_6 +# 141| r141_3(glval) = VariableAddress[y] : +# 141| r141_4(double) = Load[y] : &:r141_3, m133_8 +# 141| r141_5(bool) = CompareGE : r141_2, r141_4 +# 141| r141_6(glval) = VariableAddress[b] : +# 141| m141_7(bool) = Store[b] : &:r141_6, r141_5 +# 142| v142_1(void) = NoOp : +# 133| v133_9(void) = ReturnVoid : +# 133| v133_10(void) = AliasedUse : m133_3 +# 133| v133_11(void) = ExitFunction : + +# 144| void FloatCrement(float) +# 144| Block 0 +# 144| v144_1(void) = EnterFunction : +# 144| m144_2(unknown) = AliasedDefinition : +# 144| m144_3(unknown) = InitializeNonLocal : +# 144| m144_4(unknown) = Chi : total:m144_2, partial:m144_3 +# 144| r144_5(glval) = VariableAddress[x] : +# 144| m144_6(float) = InitializeParameter[x] : &:r144_5 +# 145| r145_1(glval) = VariableAddress[y] : +# 145| m145_2(float) = Uninitialized[y] : &:r145_1 +# 147| r147_1(glval) = VariableAddress[x] : +# 147| r147_2(float) = Load[x] : &:r147_1, m144_6 +# 147| r147_3(float) = Constant[1.0] : +# 147| r147_4(float) = Add : r147_2, r147_3 +# 147| m147_5(float) = Store[x] : &:r147_1, r147_4 +# 147| r147_6(glval) = VariableAddress[y] : +# 147| m147_7(float) = Store[y] : &:r147_6, r147_4 +# 148| r148_1(glval) = VariableAddress[x] : +# 148| r148_2(float) = Load[x] : &:r148_1, m147_5 +# 148| r148_3(float) = Constant[1.0] : +# 148| r148_4(float) = Sub : r148_2, r148_3 +# 148| m148_5(float) = Store[x] : &:r148_1, r148_4 +# 148| r148_6(glval) = VariableAddress[y] : +# 148| m148_7(float) = Store[y] : &:r148_6, r148_4 +# 149| r149_1(glval) = VariableAddress[x] : +# 149| r149_2(float) = Load[x] : &:r149_1, m148_5 +# 149| r149_3(float) = Constant[1.0] : +# 149| r149_4(float) = Add : r149_2, r149_3 +# 149| m149_5(float) = Store[x] : &:r149_1, r149_4 +# 149| r149_6(float) = CopyValue : r149_2 +# 149| r149_7(glval) = VariableAddress[y] : +# 149| m149_8(float) = Store[y] : &:r149_7, r149_6 +# 150| r150_1(glval) = VariableAddress[x] : +# 150| r150_2(float) = Load[x] : &:r150_1, m149_5 +# 150| r150_3(float) = Constant[1.0] : +# 150| r150_4(float) = Sub : r150_2, r150_3 +# 150| m150_5(float) = Store[x] : &:r150_1, r150_4 +# 150| r150_6(float) = CopyValue : r150_2 +# 150| r150_7(glval) = VariableAddress[y] : +# 150| m150_8(float) = Store[y] : &:r150_7, r150_6 +# 151| v151_1(void) = NoOp : +# 144| v144_7(void) = ReturnVoid : +# 144| v144_8(void) = AliasedUse : m144_3 +# 144| v144_9(void) = ExitFunction : + +# 153| void PointerOps(int*, int) +# 153| Block 0 +# 153| v153_1(void) = EnterFunction : +# 153| m153_2(unknown) = AliasedDefinition : +# 153| m153_3(unknown) = InitializeNonLocal : +# 153| m153_4(unknown) = Chi : total:m153_2, partial:m153_3 +# 153| r153_5(glval) = VariableAddress[p] : +# 153| m153_6(int *) = InitializeParameter[p] : &:r153_5 +# 153| r153_7(int *) = Load[p] : &:r153_5, m153_6 +# 153| m153_8(unknown) = InitializeIndirection[p] : &:r153_7 +# 153| r153_9(glval) = VariableAddress[i] : +# 153| m153_10(int) = InitializeParameter[i] : &:r153_9 +# 154| r154_1(glval) = VariableAddress[q] : +# 154| m154_2(int *) = Uninitialized[q] : &:r154_1 +# 155| r155_1(glval) = VariableAddress[b] : +# 155| m155_2(bool) = Uninitialized[b] : &:r155_1 +# 157| r157_1(glval) = VariableAddress[p] : +# 157| r157_2(int *) = Load[p] : &:r157_1, m153_6 +# 157| r157_3(glval) = VariableAddress[i] : +# 157| r157_4(int) = Load[i] : &:r157_3, m153_10 +# 157| r157_5(int *) = PointerAdd[4] : r157_2, r157_4 +# 157| r157_6(glval) = VariableAddress[q] : +# 157| m157_7(int *) = Store[q] : &:r157_6, r157_5 +# 158| r158_1(glval) = VariableAddress[i] : +# 158| r158_2(int) = Load[i] : &:r158_1, m153_10 +# 158| r158_3(glval) = VariableAddress[p] : +# 158| r158_4(int *) = Load[p] : &:r158_3, m153_6 +# 158| r158_5(int *) = PointerAdd[4] : r158_4, r158_2 +# 158| r158_6(glval) = VariableAddress[q] : +# 158| m158_7(int *) = Store[q] : &:r158_6, r158_5 +# 159| r159_1(glval) = VariableAddress[p] : +# 159| r159_2(int *) = Load[p] : &:r159_1, m153_6 +# 159| r159_3(glval) = VariableAddress[i] : +# 159| r159_4(int) = Load[i] : &:r159_3, m153_10 +# 159| r159_5(int *) = PointerSub[4] : r159_2, r159_4 +# 159| r159_6(glval) = VariableAddress[q] : +# 159| m159_7(int *) = Store[q] : &:r159_6, r159_5 +# 160| r160_1(glval) = VariableAddress[p] : +# 160| r160_2(int *) = Load[p] : &:r160_1, m153_6 +# 160| r160_3(glval) = VariableAddress[q] : +# 160| r160_4(int *) = Load[q] : &:r160_3, m159_7 +# 160| r160_5(long) = PointerDiff[4] : r160_2, r160_4 +# 160| r160_6(int) = Convert : r160_5 +# 160| r160_7(glval) = VariableAddress[i] : +# 160| m160_8(int) = Store[i] : &:r160_7, r160_6 +# 162| r162_1(glval) = VariableAddress[p] : +# 162| r162_2(int *) = Load[p] : &:r162_1, m153_6 +# 162| r162_3(glval) = VariableAddress[q] : +# 162| m162_4(int *) = Store[q] : &:r162_3, r162_2 +# 164| r164_1(glval) = VariableAddress[i] : +# 164| r164_2(int) = Load[i] : &:r164_1, m160_8 +# 164| r164_3(glval) = VariableAddress[q] : +# 164| r164_4(int *) = Load[q] : &:r164_3, m162_4 +# 164| r164_5(int *) = PointerAdd[4] : r164_4, r164_2 +# 164| m164_6(int *) = Store[q] : &:r164_3, r164_5 +# 165| r165_1(glval) = VariableAddress[i] : +# 165| r165_2(int) = Load[i] : &:r165_1, m160_8 +# 165| r165_3(glval) = VariableAddress[q] : +# 165| r165_4(int *) = Load[q] : &:r165_3, m164_6 +# 165| r165_5(int *) = PointerSub[4] : r165_4, r165_2 +# 165| m165_6(int *) = Store[q] : &:r165_3, r165_5 +# 167| r167_1(glval) = VariableAddress[p] : +# 167| r167_2(int *) = Load[p] : &:r167_1, m153_6 +# 167| r167_3(int *) = Constant[0] : +# 167| r167_4(bool) = CompareNE : r167_2, r167_3 +# 167| r167_5(glval) = VariableAddress[b] : +# 167| m167_6(bool) = Store[b] : &:r167_5, r167_4 +# 168| r168_1(glval) = VariableAddress[p] : +# 168| r168_2(int *) = Load[p] : &:r168_1, m153_6 +# 168| r168_3(int *) = Constant[0] : +# 168| r168_4(bool) = CompareNE : r168_2, r168_3 +# 168| r168_5(bool) = LogicalNot : r168_4 +# 168| r168_6(glval) = VariableAddress[b] : +# 168| m168_7(bool) = Store[b] : &:r168_6, r168_5 +# 169| v169_1(void) = NoOp : +# 153| v153_11(void) = ReturnIndirection[p] : &:r153_7, m153_8 +# 153| v153_12(void) = ReturnVoid : +# 153| v153_13(void) = AliasedUse : m153_3 +# 153| v153_14(void) = ExitFunction : + +# 171| void ArrayAccess(int*, int) +# 171| Block 0 +# 171| v171_1(void) = EnterFunction : +# 171| m171_2(unknown) = AliasedDefinition : +# 171| m171_3(unknown) = InitializeNonLocal : +# 171| m171_4(unknown) = Chi : total:m171_2, partial:m171_3 +# 171| r171_5(glval) = VariableAddress[p] : +# 171| m171_6(int *) = InitializeParameter[p] : &:r171_5 +# 171| r171_7(int *) = Load[p] : &:r171_5, m171_6 +# 171| m171_8(unknown) = InitializeIndirection[p] : &:r171_7 +# 171| r171_9(glval) = VariableAddress[i] : +# 171| m171_10(int) = InitializeParameter[i] : &:r171_9 +# 172| r172_1(glval) = VariableAddress[x] : +# 172| m172_2(int) = Uninitialized[x] : &:r172_1 +# 174| r174_1(glval) = VariableAddress[p] : +# 174| r174_2(int *) = Load[p] : &:r174_1, m171_6 +# 174| r174_3(glval) = VariableAddress[i] : +# 174| r174_4(int) = Load[i] : &:r174_3, m171_10 +# 174| r174_5(glval) = PointerAdd[4] : r174_2, r174_4 +# 174| r174_6(int) = Load[?] : &:r174_5, ~m171_8 +# 174| r174_7(glval) = VariableAddress[x] : +# 174| m174_8(int) = Store[x] : &:r174_7, r174_6 +# 175| r175_1(glval) = VariableAddress[p] : +# 175| r175_2(int *) = Load[p] : &:r175_1, m171_6 +# 175| r175_3(glval) = VariableAddress[i] : +# 175| r175_4(int) = Load[i] : &:r175_3, m171_10 +# 175| r175_5(glval) = PointerAdd[4] : r175_2, r175_4 +# 175| r175_6(int) = Load[?] : &:r175_5, ~m171_8 +# 175| r175_7(glval) = VariableAddress[x] : +# 175| m175_8(int) = Store[x] : &:r175_7, r175_6 +# 177| r177_1(glval) = VariableAddress[x] : +# 177| r177_2(int) = Load[x] : &:r177_1, m175_8 +# 177| r177_3(glval) = VariableAddress[p] : +# 177| r177_4(int *) = Load[p] : &:r177_3, m171_6 +# 177| r177_5(glval) = VariableAddress[i] : +# 177| r177_6(int) = Load[i] : &:r177_5, m171_10 +# 177| r177_7(glval) = PointerAdd[4] : r177_4, r177_6 +# 177| m177_8(int) = Store[?] : &:r177_7, r177_2 +# 177| m177_9(unknown) = Chi : total:m171_8, partial:m177_8 +# 178| r178_1(glval) = VariableAddress[x] : +# 178| r178_2(int) = Load[x] : &:r178_1, m175_8 +# 178| r178_3(glval) = VariableAddress[p] : +# 178| r178_4(int *) = Load[p] : &:r178_3, m171_6 +# 178| r178_5(glval) = VariableAddress[i] : +# 178| r178_6(int) = Load[i] : &:r178_5, m171_10 +# 178| r178_7(glval) = PointerAdd[4] : r178_4, r178_6 +# 178| m178_8(int) = Store[?] : &:r178_7, r178_2 +# 178| m178_9(unknown) = Chi : total:m177_9, partial:m178_8 +# 180| r180_1(glval) = VariableAddress[a] : +# 180| m180_2(int[10]) = Uninitialized[a] : &:r180_1 +# 181| r181_1(glval) = VariableAddress[a] : +# 181| r181_2(int *) = Convert : r181_1 +# 181| r181_3(glval) = VariableAddress[i] : +# 181| r181_4(int) = Load[i] : &:r181_3, m171_10 +# 181| r181_5(glval) = PointerAdd[4] : r181_2, r181_4 +# 181| r181_6(int) = Load[?] : &:r181_5, ~m180_2 +# 181| r181_7(glval) = VariableAddress[x] : +# 181| m181_8(int) = Store[x] : &:r181_7, r181_6 +# 182| r182_1(glval) = VariableAddress[a] : +# 182| r182_2(int *) = Convert : r182_1 +# 182| r182_3(glval) = VariableAddress[i] : +# 182| r182_4(int) = Load[i] : &:r182_3, m171_10 +# 182| r182_5(glval) = PointerAdd[4] : r182_2, r182_4 +# 182| r182_6(int) = Load[?] : &:r182_5, ~m180_2 +# 182| r182_7(glval) = VariableAddress[x] : +# 182| m182_8(int) = Store[x] : &:r182_7, r182_6 +# 183| r183_1(glval) = VariableAddress[x] : +# 183| r183_2(int) = Load[x] : &:r183_1, m182_8 +# 183| r183_3(glval) = VariableAddress[a] : +# 183| r183_4(int *) = Convert : r183_3 +# 183| r183_5(glval) = VariableAddress[i] : +# 183| r183_6(int) = Load[i] : &:r183_5, m171_10 +# 183| r183_7(glval) = PointerAdd[4] : r183_4, r183_6 +# 183| m183_8(int) = Store[?] : &:r183_7, r183_2 +# 183| m183_9(int[10]) = Chi : total:m180_2, partial:m183_8 +# 184| r184_1(glval) = VariableAddress[x] : +# 184| r184_2(int) = Load[x] : &:r184_1, m182_8 +# 184| r184_3(glval) = VariableAddress[a] : +# 184| r184_4(int *) = Convert : r184_3 +# 184| r184_5(glval) = VariableAddress[i] : +# 184| r184_6(int) = Load[i] : &:r184_5, m171_10 +# 184| r184_7(glval) = PointerAdd[4] : r184_4, r184_6 +# 184| m184_8(int) = Store[?] : &:r184_7, r184_2 +# 184| m184_9(int[10]) = Chi : total:m183_9, partial:m184_8 +# 185| v185_1(void) = NoOp : +# 171| v171_11(void) = ReturnIndirection[p] : &:r171_7, m178_9 +# 171| v171_12(void) = ReturnVoid : +# 171| v171_13(void) = AliasedUse : m171_3 +# 171| v171_14(void) = ExitFunction : + +# 187| void StringLiteral(int) +# 187| Block 0 +# 187| v187_1(void) = EnterFunction : +# 187| m187_2(unknown) = AliasedDefinition : +# 187| m187_3(unknown) = InitializeNonLocal : +# 187| m187_4(unknown) = Chi : total:m187_2, partial:m187_3 +# 187| r187_5(glval) = VariableAddress[i] : +# 187| m187_6(int) = InitializeParameter[i] : &:r187_5 +# 188| r188_1(glval) = VariableAddress[c] : +# 188| r188_2(glval) = StringConstant["Foo"] : +# 188| r188_3(char *) = Convert : r188_2 +# 188| r188_4(glval) = VariableAddress[i] : +# 188| r188_5(int) = Load[i] : &:r188_4, m187_6 +# 188| r188_6(glval) = PointerAdd[1] : r188_3, r188_5 +# 188| r188_7(char) = Load[?] : &:r188_6, ~m187_3 +# 188| m188_8(char) = Store[c] : &:r188_1, r188_7 +# 189| r189_1(glval) = VariableAddress[pwc] : +# 189| r189_2(glval) = StringConstant[L"Bar"] : +# 189| r189_3(wchar_t *) = Convert : r189_2 +# 189| r189_4(wchar_t *) = Convert : r189_3 +# 189| m189_5(wchar_t *) = Store[pwc] : &:r189_1, r189_4 +# 190| r190_1(glval) = VariableAddress[wc] : +# 190| r190_2(glval) = VariableAddress[pwc] : +# 190| r190_3(wchar_t *) = Load[pwc] : &:r190_2, m189_5 +# 190| r190_4(glval) = VariableAddress[i] : +# 190| r190_5(int) = Load[i] : &:r190_4, m187_6 +# 190| r190_6(glval) = PointerAdd[4] : r190_3, r190_5 +# 190| r190_7(wchar_t) = Load[?] : &:r190_6, ~m187_3 +# 190| m190_8(wchar_t) = Store[wc] : &:r190_1, r190_7 +# 191| v191_1(void) = NoOp : +# 187| v187_7(void) = ReturnVoid : +# 187| v187_8(void) = AliasedUse : m187_3 +# 187| v187_9(void) = ExitFunction : + +# 193| void PointerCompare(int*, int*) +# 193| Block 0 +# 193| v193_1(void) = EnterFunction : +# 193| m193_2(unknown) = AliasedDefinition : +# 193| m193_3(unknown) = InitializeNonLocal : +# 193| m193_4(unknown) = Chi : total:m193_2, partial:m193_3 +# 193| r193_5(glval) = VariableAddress[p] : +# 193| m193_6(int *) = InitializeParameter[p] : &:r193_5 +# 193| r193_7(int *) = Load[p] : &:r193_5, m193_6 +# 193| m193_8(unknown) = InitializeIndirection[p] : &:r193_7 +# 193| r193_9(glval) = VariableAddress[q] : +# 193| m193_10(int *) = InitializeParameter[q] : &:r193_9 +# 193| r193_11(int *) = Load[q] : &:r193_9, m193_10 +# 193| m193_12(unknown) = InitializeIndirection[q] : &:r193_11 +# 194| r194_1(glval) = VariableAddress[b] : +# 194| m194_2(bool) = Uninitialized[b] : &:r194_1 +# 196| r196_1(glval) = VariableAddress[p] : +# 196| r196_2(int *) = Load[p] : &:r196_1, m193_6 +# 196| r196_3(glval) = VariableAddress[q] : +# 196| r196_4(int *) = Load[q] : &:r196_3, m193_10 +# 196| r196_5(bool) = CompareEQ : r196_2, r196_4 +# 196| r196_6(glval) = VariableAddress[b] : +# 196| m196_7(bool) = Store[b] : &:r196_6, r196_5 +# 197| r197_1(glval) = VariableAddress[p] : +# 197| r197_2(int *) = Load[p] : &:r197_1, m193_6 +# 197| r197_3(glval) = VariableAddress[q] : +# 197| r197_4(int *) = Load[q] : &:r197_3, m193_10 +# 197| r197_5(bool) = CompareNE : r197_2, r197_4 +# 197| r197_6(glval) = VariableAddress[b] : +# 197| m197_7(bool) = Store[b] : &:r197_6, r197_5 +# 198| r198_1(glval) = VariableAddress[p] : +# 198| r198_2(int *) = Load[p] : &:r198_1, m193_6 +# 198| r198_3(glval) = VariableAddress[q] : +# 198| r198_4(int *) = Load[q] : &:r198_3, m193_10 +# 198| r198_5(bool) = CompareLT : r198_2, r198_4 +# 198| r198_6(glval) = VariableAddress[b] : +# 198| m198_7(bool) = Store[b] : &:r198_6, r198_5 +# 199| r199_1(glval) = VariableAddress[p] : +# 199| r199_2(int *) = Load[p] : &:r199_1, m193_6 +# 199| r199_3(glval) = VariableAddress[q] : +# 199| r199_4(int *) = Load[q] : &:r199_3, m193_10 +# 199| r199_5(bool) = CompareGT : r199_2, r199_4 +# 199| r199_6(glval) = VariableAddress[b] : +# 199| m199_7(bool) = Store[b] : &:r199_6, r199_5 +# 200| r200_1(glval) = VariableAddress[p] : +# 200| r200_2(int *) = Load[p] : &:r200_1, m193_6 +# 200| r200_3(glval) = VariableAddress[q] : +# 200| r200_4(int *) = Load[q] : &:r200_3, m193_10 +# 200| r200_5(bool) = CompareLE : r200_2, r200_4 +# 200| r200_6(glval) = VariableAddress[b] : +# 200| m200_7(bool) = Store[b] : &:r200_6, r200_5 +# 201| r201_1(glval) = VariableAddress[p] : +# 201| r201_2(int *) = Load[p] : &:r201_1, m193_6 +# 201| r201_3(glval) = VariableAddress[q] : +# 201| r201_4(int *) = Load[q] : &:r201_3, m193_10 +# 201| r201_5(bool) = CompareGE : r201_2, r201_4 +# 201| r201_6(glval) = VariableAddress[b] : +# 201| m201_7(bool) = Store[b] : &:r201_6, r201_5 +# 202| v202_1(void) = NoOp : +# 193| v193_13(void) = ReturnIndirection[p] : &:r193_7, m193_8 +# 193| v193_14(void) = ReturnIndirection[q] : &:r193_11, m193_12 +# 193| v193_15(void) = ReturnVoid : +# 193| v193_16(void) = AliasedUse : m193_3 +# 193| v193_17(void) = ExitFunction : + +# 204| void PointerCrement(int*) +# 204| Block 0 +# 204| v204_1(void) = EnterFunction : +# 204| m204_2(unknown) = AliasedDefinition : +# 204| m204_3(unknown) = InitializeNonLocal : +# 204| m204_4(unknown) = Chi : total:m204_2, partial:m204_3 +# 204| r204_5(glval) = VariableAddress[p] : +# 204| m204_6(int *) = InitializeParameter[p] : &:r204_5 +# 204| r204_7(int *) = Load[p] : &:r204_5, m204_6 +# 204| m204_8(unknown) = InitializeIndirection[p] : &:r204_7 +# 205| r205_1(glval) = VariableAddress[q] : +# 205| m205_2(int *) = Uninitialized[q] : &:r205_1 +# 207| r207_1(glval) = VariableAddress[p] : +# 207| r207_2(int *) = Load[p] : &:r207_1, m204_6 +# 207| r207_3(int) = Constant[1] : +# 207| r207_4(int *) = PointerAdd[4] : r207_2, r207_3 +# 207| m207_5(int *) = Store[p] : &:r207_1, r207_4 +# 207| r207_6(glval) = VariableAddress[q] : +# 207| m207_7(int *) = Store[q] : &:r207_6, r207_4 +# 208| r208_1(glval) = VariableAddress[p] : +# 208| r208_2(int *) = Load[p] : &:r208_1, m207_5 +# 208| r208_3(int) = Constant[1] : +# 208| r208_4(int *) = PointerSub[4] : r208_2, r208_3 +# 208| m208_5(int *) = Store[p] : &:r208_1, r208_4 +# 208| r208_6(glval) = VariableAddress[q] : +# 208| m208_7(int *) = Store[q] : &:r208_6, r208_4 +# 209| r209_1(glval) = VariableAddress[p] : +# 209| r209_2(int *) = Load[p] : &:r209_1, m208_5 +# 209| r209_3(int) = Constant[1] : +# 209| r209_4(int *) = PointerAdd[4] : r209_2, r209_3 +# 209| m209_5(int *) = Store[p] : &:r209_1, r209_4 +# 209| r209_6(int *) = CopyValue : r209_2 +# 209| r209_7(glval) = VariableAddress[q] : +# 209| m209_8(int *) = Store[q] : &:r209_7, r209_6 +# 210| r210_1(glval) = VariableAddress[p] : +# 210| r210_2(int *) = Load[p] : &:r210_1, m209_5 +# 210| r210_3(int) = Constant[1] : +# 210| r210_4(int *) = PointerSub[4] : r210_2, r210_3 +# 210| m210_5(int *) = Store[p] : &:r210_1, r210_4 +# 210| r210_6(int *) = CopyValue : r210_2 +# 210| r210_7(glval) = VariableAddress[q] : +# 210| m210_8(int *) = Store[q] : &:r210_7, r210_6 +# 211| v211_1(void) = NoOp : +# 204| v204_9(void) = ReturnIndirection[p] : &:r204_7, m204_8 +# 204| v204_10(void) = ReturnVoid : +# 204| v204_11(void) = AliasedUse : m204_3 +# 204| v204_12(void) = ExitFunction : + +# 213| void CompoundAssignment() +# 213| Block 0 +# 213| v213_1(void) = EnterFunction : +# 213| m213_2(unknown) = AliasedDefinition : +# 213| m213_3(unknown) = InitializeNonLocal : +# 213| m213_4(unknown) = Chi : total:m213_2, partial:m213_3 +# 215| r215_1(glval) = VariableAddress[x] : +# 215| r215_2(int) = Constant[5] : +# 215| m215_3(int) = Store[x] : &:r215_1, r215_2 +# 216| r216_1(int) = Constant[7] : +# 216| r216_2(glval) = VariableAddress[x] : +# 216| r216_3(int) = Load[x] : &:r216_2, m215_3 +# 216| r216_4(int) = Add : r216_3, r216_1 +# 216| m216_5(int) = Store[x] : &:r216_2, r216_4 +# 219| r219_1(glval) = VariableAddress[y] : +# 219| r219_2(short) = Constant[5] : +# 219| m219_3(short) = Store[y] : &:r219_1, r219_2 +# 220| r220_1(glval) = VariableAddress[x] : +# 220| r220_2(int) = Load[x] : &:r220_1, m216_5 +# 220| r220_3(glval) = VariableAddress[y] : +# 220| r220_4(short) = Load[y] : &:r220_3, m219_3 +# 220| r220_5(int) = Convert : r220_4 +# 220| r220_6(int) = Add : r220_5, r220_2 +# 220| r220_7(short) = Convert : r220_6 +# 220| m220_8(short) = Store[y] : &:r220_3, r220_7 +# 223| r223_1(int) = Constant[1] : +# 223| r223_2(glval) = VariableAddress[y] : +# 223| r223_3(short) = Load[y] : &:r223_2, m220_8 +# 223| r223_4(short) = ShiftLeft : r223_3, r223_1 +# 223| m223_5(short) = Store[y] : &:r223_2, r223_4 +# 226| r226_1(glval) = VariableAddress[z] : +# 226| r226_2(long) = Constant[7] : +# 226| m226_3(long) = Store[z] : &:r226_1, r226_2 +# 227| r227_1(float) = Constant[2.0] : +# 227| r227_2(glval) = VariableAddress[z] : +# 227| r227_3(long) = Load[z] : &:r227_2, m226_3 +# 227| r227_4(float) = Convert : r227_3 +# 227| r227_5(float) = Add : r227_4, r227_1 +# 227| r227_6(long) = Convert : r227_5 +# 227| m227_7(long) = Store[z] : &:r227_2, r227_6 +# 228| v228_1(void) = NoOp : +# 213| v213_5(void) = ReturnVoid : +# 213| v213_6(void) = AliasedUse : m213_3 +# 213| v213_7(void) = ExitFunction : + +# 230| void UninitializedVariables() +# 230| Block 0 +# 230| v230_1(void) = EnterFunction : +# 230| m230_2(unknown) = AliasedDefinition : +# 230| m230_3(unknown) = InitializeNonLocal : +# 230| m230_4(unknown) = Chi : total:m230_2, partial:m230_3 +# 231| r231_1(glval) = VariableAddress[x] : +# 231| m231_2(int) = Uninitialized[x] : &:r231_1 +# 232| r232_1(glval) = VariableAddress[y] : +# 232| r232_2(glval) = VariableAddress[x] : +# 232| r232_3(int) = Load[x] : &:r232_2, m231_2 +# 232| m232_4(int) = Store[y] : &:r232_1, r232_3 +# 233| v233_1(void) = NoOp : +# 230| v230_5(void) = ReturnVoid : +# 230| v230_6(void) = AliasedUse : m230_3 +# 230| v230_7(void) = ExitFunction : + +# 235| int Parameters(int, int) +# 235| Block 0 +# 235| v235_1(void) = EnterFunction : +# 235| m235_2(unknown) = AliasedDefinition : +# 235| m235_3(unknown) = InitializeNonLocal : +# 235| m235_4(unknown) = Chi : total:m235_2, partial:m235_3 +# 235| r235_5(glval) = VariableAddress[x] : +# 235| m235_6(int) = InitializeParameter[x] : &:r235_5 +# 235| r235_7(glval) = VariableAddress[y] : +# 235| m235_8(int) = InitializeParameter[y] : &:r235_7 +# 236| r236_1(glval) = VariableAddress[#return] : +# 236| r236_2(glval) = VariableAddress[x] : +# 236| r236_3(int) = Load[x] : &:r236_2, m235_6 +# 236| r236_4(glval) = VariableAddress[y] : +# 236| r236_5(int) = Load[y] : &:r236_4, m235_8 +# 236| r236_6(int) = Rem : r236_3, r236_5 +# 236| m236_7(int) = Store[#return] : &:r236_1, r236_6 +# 235| r235_9(glval) = VariableAddress[#return] : +# 235| v235_10(void) = ReturnValue : &:r235_9, m236_7 +# 235| v235_11(void) = AliasedUse : m235_3 +# 235| v235_12(void) = ExitFunction : + +# 239| void IfStatements(bool, int, int) +# 239| Block 0 +# 239| v239_1(void) = EnterFunction : +# 239| m239_2(unknown) = AliasedDefinition : +# 239| m239_3(unknown) = InitializeNonLocal : +# 239| m239_4(unknown) = Chi : total:m239_2, partial:m239_3 +# 239| r239_5(glval) = VariableAddress[b] : +# 239| m239_6(bool) = InitializeParameter[b] : &:r239_5 +# 239| r239_7(glval) = VariableAddress[x] : +# 239| m239_8(int) = InitializeParameter[x] : &:r239_7 +# 239| r239_9(glval) = VariableAddress[y] : +# 239| m239_10(int) = InitializeParameter[y] : &:r239_9 +# 240| r240_1(glval) = VariableAddress[b] : +# 240| r240_2(bool) = Load[b] : &:r240_1, m239_6 +# 240| v240_3(void) = ConditionalBranch : r240_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 240| Block 1 +# 240| v240_4(void) = NoOp : +#-----| Goto -> Block 2 + +# 243| Block 2 +# 243| r243_1(glval) = VariableAddress[b] : +# 243| r243_2(bool) = Load[b] : &:r243_1, m239_6 +# 243| v243_3(void) = ConditionalBranch : r243_2 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 244| Block 3 +# 244| r244_1(glval) = VariableAddress[y] : +# 244| r244_2(int) = Load[y] : &:r244_1, m239_10 +# 244| r244_3(glval) = VariableAddress[x] : +# 244| m244_4(int) = Store[x] : &:r244_3, r244_2 +#-----| Goto -> Block 4 + +# 247| Block 4 +# 247| m247_1(int) = Phi : from 2:m239_8, from 3:m244_4 +# 247| r247_2(glval) = VariableAddress[x] : +# 247| r247_3(int) = Load[x] : &:r247_2, m247_1 +# 247| r247_4(int) = Constant[7] : +# 247| r247_5(bool) = CompareLT : r247_3, r247_4 +# 247| v247_6(void) = ConditionalBranch : r247_5 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 248| Block 5 +# 248| r248_1(int) = Constant[2] : +# 248| r248_2(glval) = VariableAddress[x] : +# 248| m248_3(int) = Store[x] : &:r248_2, r248_1 +#-----| Goto -> Block 7 + +# 250| Block 6 +# 250| r250_1(int) = Constant[7] : +# 250| r250_2(glval) = VariableAddress[x] : +# 250| m250_3(int) = Store[x] : &:r250_2, r250_1 +#-----| Goto -> Block 7 + +# 251| Block 7 +# 251| v251_1(void) = NoOp : +# 239| v239_11(void) = ReturnVoid : +# 239| v239_12(void) = AliasedUse : m239_3 +# 239| v239_13(void) = ExitFunction : + +# 253| void WhileStatements(int) +# 253| Block 0 +# 253| v253_1(void) = EnterFunction : +# 253| m253_2(unknown) = AliasedDefinition : +# 253| m253_3(unknown) = InitializeNonLocal : +# 253| m253_4(unknown) = Chi : total:m253_2, partial:m253_3 +# 253| r253_5(glval) = VariableAddress[n] : +# 253| m253_6(int) = InitializeParameter[n] : &:r253_5 +#-----| Goto -> Block 1 + +# 254| Block 1 +# 254| m254_1(int) = Phi : from 0:m253_6, from 2:m255_5 +# 254| r254_2(glval) = VariableAddress[n] : +# 254| r254_3(int) = Load[n] : &:r254_2, m254_1 +# 254| r254_4(int) = Constant[0] : +# 254| r254_5(bool) = CompareGT : r254_3, r254_4 +# 254| v254_6(void) = ConditionalBranch : r254_5 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 255| Block 2 +# 255| r255_1(int) = Constant[1] : +# 255| r255_2(glval) = VariableAddress[n] : +# 255| r255_3(int) = Load[n] : &:r255_2, m254_1 +# 255| r255_4(int) = Sub : r255_3, r255_1 +# 255| m255_5(int) = Store[n] : &:r255_2, r255_4 +#-----| Goto (back edge) -> Block 1 + +# 257| Block 3 +# 257| v257_1(void) = NoOp : +# 253| v253_7(void) = ReturnVoid : +# 253| v253_8(void) = AliasedUse : m253_3 +# 253| v253_9(void) = ExitFunction : + +# 259| void DoStatements(int) +# 259| Block 0 +# 259| v259_1(void) = EnterFunction : +# 259| m259_2(unknown) = AliasedDefinition : +# 259| m259_3(unknown) = InitializeNonLocal : +# 259| m259_4(unknown) = Chi : total:m259_2, partial:m259_3 +# 259| r259_5(glval) = VariableAddress[n] : +# 259| m259_6(int) = InitializeParameter[n] : &:r259_5 +#-----| Goto -> Block 1 + +# 261| Block 1 +# 261| m261_1(int) = Phi : from 0:m259_6, from 1:m261_6 +# 261| r261_2(int) = Constant[1] : +# 261| r261_3(glval) = VariableAddress[n] : +# 261| r261_4(int) = Load[n] : &:r261_3, m261_1 +# 261| r261_5(int) = Sub : r261_4, r261_2 +# 261| m261_6(int) = Store[n] : &:r261_3, r261_5 +# 262| r262_1(glval) = VariableAddress[n] : +# 262| r262_2(int) = Load[n] : &:r262_1, m261_6 +# 262| r262_3(int) = Constant[0] : +# 262| r262_4(bool) = CompareGT : r262_2, r262_3 +# 262| v262_5(void) = ConditionalBranch : r262_4 +#-----| False -> Block 2 +#-----| True (back edge) -> Block 1 + +# 263| Block 2 +# 263| v263_1(void) = NoOp : +# 259| v259_7(void) = ReturnVoid : +# 259| v259_8(void) = AliasedUse : m259_3 +# 259| v259_9(void) = ExitFunction : + +# 265| void For_Empty() +# 265| Block 0 +# 265| v265_1(void) = EnterFunction : +# 265| m265_2(unknown) = AliasedDefinition : +# 265| m265_3(unknown) = InitializeNonLocal : +# 265| m265_4(unknown) = Chi : total:m265_2, partial:m265_3 +# 266| r266_1(glval) = VariableAddress[j] : +# 266| m266_2(int) = Uninitialized[j] : &:r266_1 +#-----| Goto -> Block 1 + +# 268| Block 1 +# 268| v268_1(void) = NoOp : +#-----| Goto (back edge) -> Block 1 + +# 272| void For_Init() +# 272| Block 0 +# 272| v272_1(void) = EnterFunction : +# 272| m272_2(unknown) = AliasedDefinition : +# 272| m272_3(unknown) = InitializeNonLocal : +# 272| m272_4(unknown) = Chi : total:m272_2, partial:m272_3 +# 273| r273_1(glval) = VariableAddress[i] : +# 273| r273_2(int) = Constant[0] : +# 273| m273_3(int) = Store[i] : &:r273_1, r273_2 +#-----| Goto -> Block 1 + +# 274| Block 1 +# 274| v274_1(void) = NoOp : +#-----| Goto (back edge) -> Block 1 + +# 278| void For_Condition() +# 278| Block 0 +# 278| v278_1(void) = EnterFunction : +# 278| m278_2(unknown) = AliasedDefinition : +# 278| m278_3(unknown) = InitializeNonLocal : +# 278| m278_4(unknown) = Chi : total:m278_2, partial:m278_3 +# 279| r279_1(glval) = VariableAddress[i] : +# 279| r279_2(int) = Constant[0] : +# 279| m279_3(int) = Store[i] : &:r279_1, r279_2 +#-----| Goto -> Block 1 + +# 280| Block 1 +# 280| r280_1(glval) = VariableAddress[i] : +# 280| r280_2(int) = Load[i] : &:r280_1, m279_3 +# 280| r280_3(int) = Constant[10] : +# 280| r280_4(bool) = CompareLT : r280_2, r280_3 +# 280| v280_5(void) = ConditionalBranch : r280_4 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 281| Block 2 +# 281| v281_1(void) = NoOp : +#-----| Goto (back edge) -> Block 1 + +# 278| Block 3 +# 278| v278_5(void) = Unreached : + +# 285| void For_Update() +# 285| Block 0 +# 285| v285_1(void) = EnterFunction : +# 285| m285_2(unknown) = AliasedDefinition : +# 285| m285_3(unknown) = InitializeNonLocal : +# 285| m285_4(unknown) = Chi : total:m285_2, partial:m285_3 +# 286| r286_1(glval) = VariableAddress[i] : +# 286| r286_2(int) = Constant[0] : +# 286| m286_3(int) = Store[i] : &:r286_1, r286_2 +#-----| Goto -> Block 1 + +# 288| Block 1 +# 288| m288_1(int) = Phi : from 0:m286_3, from 1:m287_5 +# 288| v288_2(void) = NoOp : +# 287| r287_1(int) = Constant[1] : +# 287| r287_2(glval) = VariableAddress[i] : +# 287| r287_3(int) = Load[i] : &:r287_2, m288_1 +# 287| r287_4(int) = Add : r287_3, r287_1 +# 287| m287_5(int) = Store[i] : &:r287_2, r287_4 +#-----| Goto (back edge) -> Block 1 + +# 292| void For_InitCondition() +# 292| Block 0 +# 292| v292_1(void) = EnterFunction : +# 292| m292_2(unknown) = AliasedDefinition : +# 292| m292_3(unknown) = InitializeNonLocal : +# 292| m292_4(unknown) = Chi : total:m292_2, partial:m292_3 +# 293| r293_1(glval) = VariableAddress[i] : +# 293| r293_2(int) = Constant[0] : +# 293| m293_3(int) = Store[i] : &:r293_1, r293_2 +#-----| Goto -> Block 1 + +# 293| Block 1 +# 293| r293_4(glval) = VariableAddress[i] : +# 293| r293_5(int) = Load[i] : &:r293_4, m293_3 +# 293| r293_6(int) = Constant[10] : +# 293| r293_7(bool) = CompareLT : r293_5, r293_6 +# 293| v293_8(void) = ConditionalBranch : r293_7 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 294| Block 2 +# 294| v294_1(void) = NoOp : +#-----| Goto (back edge) -> Block 1 + +# 292| Block 3 +# 292| v292_5(void) = Unreached : + +# 298| void For_InitUpdate() +# 298| Block 0 +# 298| v298_1(void) = EnterFunction : +# 298| m298_2(unknown) = AliasedDefinition : +# 298| m298_3(unknown) = InitializeNonLocal : +# 298| m298_4(unknown) = Chi : total:m298_2, partial:m298_3 +# 299| r299_1(glval) = VariableAddress[i] : +# 299| r299_2(int) = Constant[0] : +# 299| m299_3(int) = Store[i] : &:r299_1, r299_2 +#-----| Goto -> Block 1 + +# 300| Block 1 +# 300| m300_1(int) = Phi : from 0:m299_3, from 1:m299_8 +# 300| v300_2(void) = NoOp : +# 299| r299_4(int) = Constant[1] : +# 299| r299_5(glval) = VariableAddress[i] : +# 299| r299_6(int) = Load[i] : &:r299_5, m300_1 +# 299| r299_7(int) = Add : r299_6, r299_4 +# 299| m299_8(int) = Store[i] : &:r299_5, r299_7 +#-----| Goto (back edge) -> Block 1 + +# 304| void For_ConditionUpdate() +# 304| Block 0 +# 304| v304_1(void) = EnterFunction : +# 304| m304_2(unknown) = AliasedDefinition : +# 304| m304_3(unknown) = InitializeNonLocal : +# 304| m304_4(unknown) = Chi : total:m304_2, partial:m304_3 +# 305| r305_1(glval) = VariableAddress[i] : +# 305| r305_2(int) = Constant[0] : +# 305| m305_3(int) = Store[i] : &:r305_1, r305_2 +#-----| Goto -> Block 1 + +# 306| Block 1 +# 306| m306_1(int) = Phi : from 0:m305_3, from 2:m306_11 +# 306| r306_2(glval) = VariableAddress[i] : +# 306| r306_3(int) = Load[i] : &:r306_2, m306_1 +# 306| r306_4(int) = Constant[10] : +# 306| r306_5(bool) = CompareLT : r306_3, r306_4 +# 306| v306_6(void) = ConditionalBranch : r306_5 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 307| Block 2 +# 307| v307_1(void) = NoOp : +# 306| r306_7(int) = Constant[1] : +# 306| r306_8(glval) = VariableAddress[i] : +# 306| r306_9(int) = Load[i] : &:r306_8, m306_1 +# 306| r306_10(int) = Add : r306_9, r306_7 +# 306| m306_11(int) = Store[i] : &:r306_8, r306_10 +#-----| Goto (back edge) -> Block 1 + +# 309| Block 3 +# 309| v309_1(void) = NoOp : +# 304| v304_5(void) = ReturnVoid : +# 304| v304_6(void) = AliasedUse : m304_3 +# 304| v304_7(void) = ExitFunction : + +# 311| void For_InitConditionUpdate() +# 311| Block 0 +# 311| v311_1(void) = EnterFunction : +# 311| m311_2(unknown) = AliasedDefinition : +# 311| m311_3(unknown) = InitializeNonLocal : +# 311| m311_4(unknown) = Chi : total:m311_2, partial:m311_3 +# 312| r312_1(glval) = VariableAddress[i] : +# 312| r312_2(int) = Constant[0] : +# 312| m312_3(int) = Store[i] : &:r312_1, r312_2 +#-----| Goto -> Block 1 + +# 312| Block 1 +# 312| m312_4(int) = Phi : from 0:m312_3, from 2:m312_14 +# 312| r312_5(glval) = VariableAddress[i] : +# 312| r312_6(int) = Load[i] : &:r312_5, m312_4 +# 312| r312_7(int) = Constant[10] : +# 312| r312_8(bool) = CompareLT : r312_6, r312_7 +# 312| v312_9(void) = ConditionalBranch : r312_8 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 313| Block 2 +# 313| v313_1(void) = NoOp : +# 312| r312_10(int) = Constant[1] : +# 312| r312_11(glval) = VariableAddress[i] : +# 312| r312_12(int) = Load[i] : &:r312_11, m312_4 +# 312| r312_13(int) = Add : r312_12, r312_10 +# 312| m312_14(int) = Store[i] : &:r312_11, r312_13 +#-----| Goto (back edge) -> Block 1 + +# 315| Block 3 +# 315| v315_1(void) = NoOp : +# 311| v311_5(void) = ReturnVoid : +# 311| v311_6(void) = AliasedUse : m311_3 +# 311| v311_7(void) = ExitFunction : + +# 317| void For_Break() +# 317| Block 0 +# 317| v317_1(void) = EnterFunction : +# 317| m317_2(unknown) = AliasedDefinition : +# 317| m317_3(unknown) = InitializeNonLocal : +# 317| m317_4(unknown) = Chi : total:m317_2, partial:m317_3 +# 318| r318_1(glval) = VariableAddress[i] : +# 318| r318_2(int) = Constant[0] : +# 318| m318_3(int) = Store[i] : &:r318_1, r318_2 +#-----| Goto -> Block 1 + +# 318| Block 1 +# 318| m318_4(int) = Phi : from 0:m318_3, from 2:m318_14 +# 318| r318_5(glval) = VariableAddress[i] : +# 318| r318_6(int) = Load[i] : &:r318_5, m318_4 +# 318| r318_7(int) = Constant[10] : +# 318| r318_8(bool) = CompareLT : r318_6, r318_7 +# 318| v318_9(void) = ConditionalBranch : r318_8 +#-----| False -> Block 5 +#-----| True -> Block 3 + +# 318| Block 2 +# 318| r318_10(int) = Constant[1] : +# 318| r318_11(glval) = VariableAddress[i] : +# 318| r318_12(int) = Load[i] : &:r318_11, m318_4 +# 318| r318_13(int) = Add : r318_12, r318_10 +# 318| m318_14(int) = Store[i] : &:r318_11, r318_13 +#-----| Goto (back edge) -> Block 1 + +# 319| Block 3 +# 319| r319_1(glval) = VariableAddress[i] : +# 319| r319_2(int) = Load[i] : &:r319_1, m318_4 +# 319| r319_3(int) = Constant[5] : +# 319| r319_4(bool) = CompareEQ : r319_2, r319_3 +# 319| v319_5(void) = ConditionalBranch : r319_4 +#-----| False -> Block 2 +#-----| True -> Block 4 + +# 320| Block 4 +# 320| v320_1(void) = NoOp : +#-----| Goto -> Block 5 + +# 322| Block 5 +# 322| v322_1(void) = NoOp : +# 323| v323_1(void) = NoOp : +# 317| v317_5(void) = ReturnVoid : +# 317| v317_6(void) = AliasedUse : m317_3 +# 317| v317_7(void) = ExitFunction : + +# 325| void For_Continue_Update() +# 325| Block 0 +# 325| v325_1(void) = EnterFunction : +# 325| m325_2(unknown) = AliasedDefinition : +# 325| m325_3(unknown) = InitializeNonLocal : +# 325| m325_4(unknown) = Chi : total:m325_2, partial:m325_3 +# 326| r326_1(glval) = VariableAddress[i] : +# 326| r326_2(int) = Constant[0] : +# 326| m326_3(int) = Store[i] : &:r326_1, r326_2 +#-----| Goto -> Block 1 + +# 326| Block 1 +# 326| m326_4(int) = Phi : from 0:m326_3, from 4:m326_15 +# 326| r326_5(glval) = VariableAddress[i] : +# 326| r326_6(int) = Load[i] : &:r326_5, m326_4 +# 326| r326_7(int) = Constant[10] : +# 326| r326_8(bool) = CompareLT : r326_6, r326_7 +# 326| v326_9(void) = ConditionalBranch : r326_8 +#-----| False -> Block 5 +#-----| True -> Block 2 + +# 327| Block 2 +# 327| r327_1(glval) = VariableAddress[i] : +# 327| r327_2(int) = Load[i] : &:r327_1, m326_4 +# 327| r327_3(int) = Constant[5] : +# 327| r327_4(bool) = CompareEQ : r327_2, r327_3 +# 327| v327_5(void) = ConditionalBranch : r327_4 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 328| Block 3 +# 328| v328_1(void) = NoOp : +#-----| Goto -> Block 4 + +# 326| Block 4 +# 326| v326_10(void) = NoOp : +# 326| r326_11(int) = Constant[1] : +# 326| r326_12(glval) = VariableAddress[i] : +# 326| r326_13(int) = Load[i] : &:r326_12, m326_4 +# 326| r326_14(int) = Add : r326_13, r326_11 +# 326| m326_15(int) = Store[i] : &:r326_12, r326_14 +#-----| Goto (back edge) -> Block 1 + +# 331| Block 5 +# 331| v331_1(void) = NoOp : +# 325| v325_5(void) = ReturnVoid : +# 325| v325_6(void) = AliasedUse : m325_3 +# 325| v325_7(void) = ExitFunction : + +# 333| void For_Continue_NoUpdate() +# 333| Block 0 +# 333| v333_1(void) = EnterFunction : +# 333| m333_2(unknown) = AliasedDefinition : +# 333| m333_3(unknown) = InitializeNonLocal : +# 333| m333_4(unknown) = Chi : total:m333_2, partial:m333_3 +# 334| r334_1(glval) = VariableAddress[i] : +# 334| r334_2(int) = Constant[0] : +# 334| m334_3(int) = Store[i] : &:r334_1, r334_2 +#-----| Goto -> Block 1 + +# 334| Block 1 +# 334| r334_4(glval) = VariableAddress[i] : +# 334| r334_5(int) = Load[i] : &:r334_4, m334_3 +# 334| r334_6(int) = Constant[10] : +# 334| r334_7(bool) = CompareLT : r334_5, r334_6 +# 334| v334_8(void) = ConditionalBranch : r334_7 +#-----| False -> Block 4 +#-----| True -> Block 2 + +# 335| Block 2 +# 335| r335_1(glval) = VariableAddress[i] : +# 335| r335_2(int) = Load[i] : &:r335_1, m334_3 +# 335| r335_3(int) = Constant[5] : +# 335| r335_4(bool) = CompareEQ : r335_2, r335_3 +# 335| v335_5(void) = ConditionalBranch : r335_4 +#-----| False -> Block 3 +#-----| True -> Block 4 + +# 334| Block 3 +# 334| v334_9(void) = NoOp : +#-----| Goto (back edge) -> Block 1 + +# 333| Block 4 +# 333| v333_5(void) = Unreached : + +# 341| int Dereference(int*) +# 341| Block 0 +# 341| v341_1(void) = EnterFunction : +# 341| m341_2(unknown) = AliasedDefinition : +# 341| m341_3(unknown) = InitializeNonLocal : +# 341| m341_4(unknown) = Chi : total:m341_2, partial:m341_3 +# 341| r341_5(glval) = VariableAddress[p] : +# 341| m341_6(int *) = InitializeParameter[p] : &:r341_5 +# 341| r341_7(int *) = Load[p] : &:r341_5, m341_6 +# 341| m341_8(unknown) = InitializeIndirection[p] : &:r341_7 +# 342| r342_1(int) = Constant[1] : +# 342| r342_2(glval) = VariableAddress[p] : +# 342| r342_3(int *) = Load[p] : &:r342_2, m341_6 +# 342| r342_4(glval) = CopyValue : r342_3 +# 342| m342_5(int) = Store[?] : &:r342_4, r342_1 +# 342| m342_6(unknown) = Chi : total:m341_8, partial:m342_5 +# 343| r343_1(glval) = VariableAddress[#return] : +# 343| r343_2(glval) = VariableAddress[p] : +# 343| r343_3(int *) = Load[p] : &:r343_2, m341_6 +# 343| r343_4(int) = Load[?] : &:r343_3, m342_5 +# 343| m343_5(int) = Store[#return] : &:r343_1, r343_4 +# 341| v341_9(void) = ReturnIndirection[p] : &:r341_7, m342_6 +# 341| r341_10(glval) = VariableAddress[#return] : +# 341| v341_11(void) = ReturnValue : &:r341_10, m343_5 +# 341| v341_12(void) = AliasedUse : m341_3 +# 341| v341_13(void) = ExitFunction : + +# 348| int* AddressOf() +# 348| Block 0 +# 348| v348_1(void) = EnterFunction : +# 348| m348_2(unknown) = AliasedDefinition : +# 348| m348_3(unknown) = InitializeNonLocal : +# 348| m348_4(unknown) = Chi : total:m348_2, partial:m348_3 +# 349| r349_1(glval) = VariableAddress[#return] : +# 349| r349_2(glval) = VariableAddress[g] : +# 349| r349_3(int *) = CopyValue : r349_2 +# 349| m349_4(int *) = Store[#return] : &:r349_1, r349_3 +# 348| r348_5(glval) = VariableAddress[#return] : +# 348| v348_6(void) = ReturnValue : &:r348_5, m349_4 +# 348| v348_7(void) = AliasedUse : m348_3 +# 348| v348_8(void) = ExitFunction : + +# 352| void Break(int) +# 352| Block 0 +# 352| v352_1(void) = EnterFunction : +# 352| m352_2(unknown) = AliasedDefinition : +# 352| m352_3(unknown) = InitializeNonLocal : +# 352| m352_4(unknown) = Chi : total:m352_2, partial:m352_3 +# 352| r352_5(glval) = VariableAddress[n] : +# 352| m352_6(int) = InitializeParameter[n] : &:r352_5 +#-----| Goto -> Block 1 + +# 353| Block 1 +# 353| m353_1(int) = Phi : from 0:m352_6, from 4:m356_5 +# 353| r353_2(glval) = VariableAddress[n] : +# 353| r353_3(int) = Load[n] : &:r353_2, m353_1 +# 353| r353_4(int) = Constant[0] : +# 353| r353_5(bool) = CompareGT : r353_3, r353_4 +# 353| v353_6(void) = ConditionalBranch : r353_5 +#-----| False -> Block 5 +#-----| True -> Block 2 + +# 354| Block 2 +# 354| r354_1(glval) = VariableAddress[n] : +# 354| r354_2(int) = Load[n] : &:r354_1, m353_1 +# 354| r354_3(int) = Constant[1] : +# 354| r354_4(bool) = CompareEQ : r354_2, r354_3 +# 354| v354_5(void) = ConditionalBranch : r354_4 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 355| Block 3 +# 355| v355_1(void) = NoOp : +#-----| Goto -> Block 5 + +# 356| Block 4 +# 356| r356_1(int) = Constant[1] : +# 356| r356_2(glval) = VariableAddress[n] : +# 356| r356_3(int) = Load[n] : &:r356_2, m353_1 +# 356| r356_4(int) = Sub : r356_3, r356_1 +# 356| m356_5(int) = Store[n] : &:r356_2, r356_4 +#-----| Goto (back edge) -> Block 1 + +# 357| Block 5 +# 357| v357_1(void) = NoOp : +# 358| v358_1(void) = NoOp : +# 352| v352_7(void) = ReturnVoid : +# 352| v352_8(void) = AliasedUse : m352_3 +# 352| v352_9(void) = ExitFunction : + +# 360| void Continue(int) +# 360| Block 0 +# 360| v360_1(void) = EnterFunction : +# 360| m360_2(unknown) = AliasedDefinition : +# 360| m360_3(unknown) = InitializeNonLocal : +# 360| m360_4(unknown) = Chi : total:m360_2, partial:m360_3 +# 360| r360_5(glval) = VariableAddress[n] : +# 360| m360_6(int) = InitializeParameter[n] : &:r360_5 +#-----| Goto -> Block 1 + +# 362| Block 1 +# 362| m362_1(int) = Phi : from 0:m360_6, from 4:m361_1 +# 362| r362_2(glval) = VariableAddress[n] : +# 362| r362_3(int) = Load[n] : &:r362_2, m362_1 +# 362| r362_4(int) = Constant[1] : +# 362| r362_5(bool) = CompareEQ : r362_3, r362_4 +# 362| v362_6(void) = ConditionalBranch : r362_5 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 363| Block 2 +# 363| v363_1(void) = NoOp : +#-----| Goto -> Block 4 + +# 365| Block 3 +# 365| r365_1(int) = Constant[1] : +# 365| r365_2(glval) = VariableAddress[n] : +# 365| r365_3(int) = Load[n] : &:r365_2, m362_1 +# 365| r365_4(int) = Sub : r365_3, r365_1 +# 365| m365_5(int) = Store[n] : &:r365_2, r365_4 +#-----| Goto -> Block 4 + +# 361| Block 4 +# 361| m361_1(int) = Phi : from 2:m362_1, from 3:m365_5 +# 361| v361_2(void) = NoOp : +# 366| r366_1(glval) = VariableAddress[n] : +# 366| r366_2(int) = Load[n] : &:r366_1, m361_1 +# 366| r366_3(int) = Constant[0] : +# 366| r366_4(bool) = CompareGT : r366_2, r366_3 +# 366| v366_5(void) = ConditionalBranch : r366_4 +#-----| False -> Block 5 +#-----| True (back edge) -> Block 1 + +# 367| Block 5 +# 367| v367_1(void) = NoOp : +# 360| v360_7(void) = ReturnVoid : +# 360| v360_8(void) = AliasedUse : m360_3 +# 360| v360_9(void) = ExitFunction : + +# 372| void Call() +# 372| Block 0 +# 372| v372_1(void) = EnterFunction : +# 372| m372_2(unknown) = AliasedDefinition : +# 372| m372_3(unknown) = InitializeNonLocal : +# 372| m372_4(unknown) = Chi : total:m372_2, partial:m372_3 +# 373| r373_1(glval) = FunctionAddress[VoidFunc] : +# 373| v373_2(void) = Call[VoidFunc] : func:r373_1 +# 373| m373_3(unknown) = ^CallSideEffect : ~m372_4 +# 373| m373_4(unknown) = Chi : total:m372_4, partial:m373_3 +# 374| v374_1(void) = NoOp : +# 372| v372_5(void) = ReturnVoid : +# 372| v372_6(void) = AliasedUse : ~m373_4 +# 372| v372_7(void) = ExitFunction : + +# 376| int CallAdd(int, int) +# 376| Block 0 +# 376| v376_1(void) = EnterFunction : +# 376| m376_2(unknown) = AliasedDefinition : +# 376| m376_3(unknown) = InitializeNonLocal : +# 376| m376_4(unknown) = Chi : total:m376_2, partial:m376_3 +# 376| r376_5(glval) = VariableAddress[x] : +# 376| m376_6(int) = InitializeParameter[x] : &:r376_5 +# 376| r376_7(glval) = VariableAddress[y] : +# 376| m376_8(int) = InitializeParameter[y] : &:r376_7 +# 377| r377_1(glval) = VariableAddress[#return] : +# 377| r377_2(glval) = FunctionAddress[Add] : +# 377| r377_3(glval) = VariableAddress[x] : +# 377| r377_4(int) = Load[x] : &:r377_3, m376_6 +# 377| r377_5(glval) = VariableAddress[y] : +# 377| r377_6(int) = Load[y] : &:r377_5, m376_8 +# 377| r377_7(int) = Call[Add] : func:r377_2, 0:r377_4, 1:r377_6 +# 377| m377_8(unknown) = ^CallSideEffect : ~m376_4 +# 377| m377_9(unknown) = Chi : total:m376_4, partial:m377_8 +# 377| m377_10(int) = Store[#return] : &:r377_1, r377_7 +# 376| r376_9(glval) = VariableAddress[#return] : +# 376| v376_10(void) = ReturnValue : &:r376_9, m377_10 +# 376| v376_11(void) = AliasedUse : ~m377_9 +# 376| v376_12(void) = ExitFunction : + +# 380| int Comma(int, int) +# 380| Block 0 +# 380| v380_1(void) = EnterFunction : +# 380| m380_2(unknown) = AliasedDefinition : +# 380| m380_3(unknown) = InitializeNonLocal : +# 380| m380_4(unknown) = Chi : total:m380_2, partial:m380_3 +# 380| r380_5(glval) = VariableAddress[x] : +# 380| m380_6(int) = InitializeParameter[x] : &:r380_5 +# 380| r380_7(glval) = VariableAddress[y] : +# 380| m380_8(int) = InitializeParameter[y] : &:r380_7 +# 381| r381_1(glval) = VariableAddress[#return] : +# 381| r381_2(glval) = FunctionAddress[VoidFunc] : +# 381| v381_3(void) = Call[VoidFunc] : func:r381_2 +# 381| m381_4(unknown) = ^CallSideEffect : ~m380_4 +# 381| m381_5(unknown) = Chi : total:m380_4, partial:m381_4 +# 381| r381_6(glval) = FunctionAddress[CallAdd] : +# 381| r381_7(glval) = VariableAddress[x] : +# 381| r381_8(int) = Load[x] : &:r381_7, m380_6 +# 381| r381_9(glval) = VariableAddress[y] : +# 381| r381_10(int) = Load[y] : &:r381_9, m380_8 +# 381| r381_11(int) = Call[CallAdd] : func:r381_6, 0:r381_8, 1:r381_10 +# 381| m381_12(unknown) = ^CallSideEffect : ~m381_5 +# 381| m381_13(unknown) = Chi : total:m381_5, partial:m381_12 +# 381| r381_14(int) = CopyValue : r381_11 +# 381| m381_15(int) = Store[#return] : &:r381_1, r381_14 +# 380| r380_9(glval) = VariableAddress[#return] : +# 380| v380_10(void) = ReturnValue : &:r380_9, m381_15 +# 380| v380_11(void) = AliasedUse : ~m381_13 +# 380| v380_12(void) = ExitFunction : + +# 384| void Switch(int) +# 384| Block 0 +# 384| v384_1(void) = EnterFunction : +# 384| m384_2(unknown) = AliasedDefinition : +# 384| m384_3(unknown) = InitializeNonLocal : +# 384| m384_4(unknown) = Chi : total:m384_2, partial:m384_3 +# 384| r384_5(glval) = VariableAddress[x] : +# 384| m384_6(int) = InitializeParameter[x] : &:r384_5 +# 385| r385_1(glval) = VariableAddress[y] : +# 385| m385_2(int) = Uninitialized[y] : &:r385_1 +# 386| r386_1(glval) = VariableAddress[x] : +# 386| r386_2(int) = Load[x] : &:r386_1, m384_6 +# 386| v386_3(void) = Switch : r386_2 +#-----| Case[-1] -> Block 1 +#-----| Case[1] -> Block 2 +#-----| Case[2] -> Block 3 +#-----| Case[3] -> Block 4 +#-----| Case[4] -> Block 5 +#-----| Default -> Block 6 + +# 389| Block 1 +# 389| v389_1(void) = NoOp : +# 390| r390_1(int) = Constant[-1] : +# 390| r390_2(glval) = VariableAddress[y] : +# 390| m390_3(int) = Store[y] : &:r390_2, r390_1 +# 391| v391_1(void) = NoOp : +#-----| Goto -> Block 7 + +# 393| Block 2 +# 393| v393_1(void) = NoOp : +#-----| Goto -> Block 3 + +# 394| Block 3 +# 394| v394_1(void) = NoOp : +# 395| r395_1(int) = Constant[1] : +# 395| r395_2(glval) = VariableAddress[y] : +# 395| m395_3(int) = Store[y] : &:r395_2, r395_1 +# 396| v396_1(void) = NoOp : +#-----| Goto -> Block 7 + +# 398| Block 4 +# 398| v398_1(void) = NoOp : +# 399| r399_1(int) = Constant[3] : +# 399| r399_2(glval) = VariableAddress[y] : +# 399| m399_3(int) = Store[y] : &:r399_2, r399_1 +#-----| Goto -> Block 5 + +# 400| Block 5 +# 400| v400_1(void) = NoOp : +# 401| r401_1(int) = Constant[4] : +# 401| r401_2(glval) = VariableAddress[y] : +# 401| m401_3(int) = Store[y] : &:r401_2, r401_1 +# 402| v402_1(void) = NoOp : +#-----| Goto -> Block 7 + +# 404| Block 6 +# 404| v404_1(void) = NoOp : +# 405| r405_1(int) = Constant[0] : +# 405| r405_2(glval) = VariableAddress[y] : +# 405| m405_3(int) = Store[y] : &:r405_2, r405_1 +# 406| v406_1(void) = NoOp : +#-----| Goto -> Block 7 + +# 409| Block 7 +# 409| v409_1(void) = NoOp : +# 410| v410_1(void) = NoOp : +# 384| v384_7(void) = ReturnVoid : +# 384| v384_8(void) = AliasedUse : m384_3 +# 384| v384_9(void) = ExitFunction : + +# 422| Point ReturnStruct(Point) +# 422| Block 0 +# 422| v422_1(void) = EnterFunction : +# 422| m422_2(unknown) = AliasedDefinition : +# 422| m422_3(unknown) = InitializeNonLocal : +# 422| m422_4(unknown) = Chi : total:m422_2, partial:m422_3 +# 422| r422_5(glval) = VariableAddress[pt] : +# 422| m422_6(Point) = InitializeParameter[pt] : &:r422_5 +# 423| r423_1(glval) = VariableAddress[#return] : +# 423| r423_2(glval) = VariableAddress[pt] : +# 423| r423_3(Point) = Load[pt] : &:r423_2, m422_6 +# 423| m423_4(Point) = Store[#return] : &:r423_1, r423_3 +# 422| r422_7(glval) = VariableAddress[#return] : +# 422| v422_8(void) = ReturnValue : &:r422_7, m423_4 +# 422| v422_9(void) = AliasedUse : m422_3 +# 422| v422_10(void) = ExitFunction : + +# 426| void FieldAccess() +# 426| Block 0 +# 426| v426_1(void) = EnterFunction : +# 426| m426_2(unknown) = AliasedDefinition : +# 426| m426_3(unknown) = InitializeNonLocal : +# 426| m426_4(unknown) = Chi : total:m426_2, partial:m426_3 +# 427| r427_1(glval) = VariableAddress[pt] : +# 427| m427_2(Point) = Uninitialized[pt] : &:r427_1 +# 428| r428_1(int) = Constant[5] : +# 428| r428_2(glval) = VariableAddress[pt] : +# 428| r428_3(glval) = FieldAddress[x] : r428_2 +# 428| m428_4(int) = Store[?] : &:r428_3, r428_1 +# 428| m428_5(Point) = Chi : total:m427_2, partial:m428_4 +# 429| r429_1(glval) = VariableAddress[pt] : +# 429| r429_2(glval) = FieldAddress[x] : r429_1 +# 429| r429_3(int) = Load[?] : &:r429_2, m428_4 +# 429| r429_4(glval) = VariableAddress[pt] : +# 429| r429_5(glval) = FieldAddress[y] : r429_4 +# 429| m429_6(int) = Store[?] : &:r429_5, r429_3 +# 429| m429_7(Point) = Chi : total:m428_5, partial:m429_6 +# 430| r430_1(glval) = VariableAddress[p] : +# 430| r430_2(glval) = VariableAddress[pt] : +# 430| r430_3(glval) = FieldAddress[y] : r430_2 +# 430| r430_4(int *) = CopyValue : r430_3 +# 430| m430_5(int *) = Store[p] : &:r430_1, r430_4 +# 431| v431_1(void) = NoOp : +# 426| v426_5(void) = ReturnVoid : +# 426| v426_6(void) = AliasedUse : m426_3 +# 426| v426_7(void) = ExitFunction : + +# 433| void LogicalOr(bool, bool) +# 433| Block 0 +# 433| v433_1(void) = EnterFunction : +# 433| m433_2(unknown) = AliasedDefinition : +# 433| m433_3(unknown) = InitializeNonLocal : +# 433| m433_4(unknown) = Chi : total:m433_2, partial:m433_3 +# 433| r433_5(glval) = VariableAddress[a] : +# 433| m433_6(bool) = InitializeParameter[a] : &:r433_5 +# 433| r433_7(glval) = VariableAddress[b] : +# 433| m433_8(bool) = InitializeParameter[b] : &:r433_7 +# 434| r434_1(glval) = VariableAddress[x] : +# 434| m434_2(int) = Uninitialized[x] : &:r434_1 +# 435| r435_1(glval) = VariableAddress[a] : +# 435| r435_2(bool) = Load[a] : &:r435_1, m433_6 +# 435| v435_3(void) = ConditionalBranch : r435_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 435| Block 1 +# 435| r435_4(glval) = VariableAddress[b] : +# 435| r435_5(bool) = Load[b] : &:r435_4, m433_8 +# 435| v435_6(void) = ConditionalBranch : r435_5 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 436| Block 2 +# 436| r436_1(int) = Constant[7] : +# 436| r436_2(glval) = VariableAddress[x] : +# 436| m436_3(int) = Store[x] : &:r436_2, r436_1 +#-----| Goto -> Block 3 + +# 439| Block 3 +# 439| r439_1(glval) = VariableAddress[a] : +# 439| r439_2(bool) = Load[a] : &:r439_1, m433_6 +# 439| v439_3(void) = ConditionalBranch : r439_2 +#-----| False -> Block 4 +#-----| True -> Block 5 + +# 439| Block 4 +# 439| r439_4(glval) = VariableAddress[b] : +# 439| r439_5(bool) = Load[b] : &:r439_4, m433_8 +# 439| v439_6(void) = ConditionalBranch : r439_5 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 440| Block 5 +# 440| r440_1(int) = Constant[1] : +# 440| r440_2(glval) = VariableAddress[x] : +# 440| m440_3(int) = Store[x] : &:r440_2, r440_1 +#-----| Goto -> Block 7 + +# 443| Block 6 +# 443| r443_1(int) = Constant[5] : +# 443| r443_2(glval) = VariableAddress[x] : +# 443| m443_3(int) = Store[x] : &:r443_2, r443_1 +#-----| Goto -> Block 7 + +# 445| Block 7 +# 445| v445_1(void) = NoOp : +# 433| v433_9(void) = ReturnVoid : +# 433| v433_10(void) = AliasedUse : m433_3 +# 433| v433_11(void) = ExitFunction : + +# 447| void LogicalAnd(bool, bool) +# 447| Block 0 +# 447| v447_1(void) = EnterFunction : +# 447| m447_2(unknown) = AliasedDefinition : +# 447| m447_3(unknown) = InitializeNonLocal : +# 447| m447_4(unknown) = Chi : total:m447_2, partial:m447_3 +# 447| r447_5(glval) = VariableAddress[a] : +# 447| m447_6(bool) = InitializeParameter[a] : &:r447_5 +# 447| r447_7(glval) = VariableAddress[b] : +# 447| m447_8(bool) = InitializeParameter[b] : &:r447_7 +# 448| r448_1(glval) = VariableAddress[x] : +# 448| m448_2(int) = Uninitialized[x] : &:r448_1 +# 449| r449_1(glval) = VariableAddress[a] : +# 449| r449_2(bool) = Load[a] : &:r449_1, m447_6 +# 449| v449_3(void) = ConditionalBranch : r449_2 +#-----| False -> Block 3 +#-----| True -> Block 1 + +# 449| Block 1 +# 449| r449_4(glval) = VariableAddress[b] : +# 449| r449_5(bool) = Load[b] : &:r449_4, m447_8 +# 449| v449_6(void) = ConditionalBranch : r449_5 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 450| Block 2 +# 450| r450_1(int) = Constant[7] : +# 450| r450_2(glval) = VariableAddress[x] : +# 450| m450_3(int) = Store[x] : &:r450_2, r450_1 +#-----| Goto -> Block 3 + +# 453| Block 3 +# 453| r453_1(glval) = VariableAddress[a] : +# 453| r453_2(bool) = Load[a] : &:r453_1, m447_6 +# 453| v453_3(void) = ConditionalBranch : r453_2 +#-----| False -> Block 6 +#-----| True -> Block 4 + +# 453| Block 4 +# 453| r453_4(glval) = VariableAddress[b] : +# 453| r453_5(bool) = Load[b] : &:r453_4, m447_8 +# 453| v453_6(void) = ConditionalBranch : r453_5 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 454| Block 5 +# 454| r454_1(int) = Constant[1] : +# 454| r454_2(glval) = VariableAddress[x] : +# 454| m454_3(int) = Store[x] : &:r454_2, r454_1 +#-----| Goto -> Block 7 + +# 457| Block 6 +# 457| r457_1(int) = Constant[5] : +# 457| r457_2(glval) = VariableAddress[x] : +# 457| m457_3(int) = Store[x] : &:r457_2, r457_1 +#-----| Goto -> Block 7 + +# 459| Block 7 +# 459| v459_1(void) = NoOp : +# 447| v447_9(void) = ReturnVoid : +# 447| v447_10(void) = AliasedUse : m447_3 +# 447| v447_11(void) = ExitFunction : + +# 461| void LogicalNot(bool, bool) +# 461| Block 0 +# 461| v461_1(void) = EnterFunction : +# 461| m461_2(unknown) = AliasedDefinition : +# 461| m461_3(unknown) = InitializeNonLocal : +# 461| m461_4(unknown) = Chi : total:m461_2, partial:m461_3 +# 461| r461_5(glval) = VariableAddress[a] : +# 461| m461_6(bool) = InitializeParameter[a] : &:r461_5 +# 461| r461_7(glval) = VariableAddress[b] : +# 461| m461_8(bool) = InitializeParameter[b] : &:r461_7 +# 462| r462_1(glval) = VariableAddress[x] : +# 462| m462_2(int) = Uninitialized[x] : &:r462_1 +# 463| r463_1(glval) = VariableAddress[a] : +# 463| r463_2(bool) = Load[a] : &:r463_1, m461_6 +# 463| v463_3(void) = ConditionalBranch : r463_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 464| Block 1 +# 464| r464_1(int) = Constant[1] : +# 464| r464_2(glval) = VariableAddress[x] : +# 464| m464_3(int) = Store[x] : &:r464_2, r464_1 +#-----| Goto -> Block 2 + +# 467| Block 2 +# 467| r467_1(glval) = VariableAddress[a] : +# 467| r467_2(bool) = Load[a] : &:r467_1, m461_6 +# 467| v467_3(void) = ConditionalBranch : r467_2 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 467| Block 3 +# 467| r467_4(glval) = VariableAddress[b] : +# 467| r467_5(bool) = Load[b] : &:r467_4, m461_8 +# 467| v467_6(void) = ConditionalBranch : r467_5 +#-----| False -> Block 4 +#-----| True -> Block 5 + +# 468| Block 4 +# 468| r468_1(int) = Constant[2] : +# 468| r468_2(glval) = VariableAddress[x] : +# 468| m468_3(int) = Store[x] : &:r468_2, r468_1 +#-----| Goto -> Block 6 + +# 471| Block 5 +# 471| r471_1(int) = Constant[3] : +# 471| r471_2(glval) = VariableAddress[x] : +# 471| m471_3(int) = Store[x] : &:r471_2, r471_1 +#-----| Goto -> Block 6 + +# 473| Block 6 +# 473| v473_1(void) = NoOp : +# 461| v461_9(void) = ReturnVoid : +# 461| v461_10(void) = AliasedUse : m461_3 +# 461| v461_11(void) = ExitFunction : + +# 475| void ConditionValues(bool, bool) +# 475| Block 0 +# 475| v475_1(void) = EnterFunction : +# 475| m475_2(unknown) = AliasedDefinition : +# 475| m475_3(unknown) = InitializeNonLocal : +# 475| m475_4(unknown) = Chi : total:m475_2, partial:m475_3 +# 475| r475_5(glval) = VariableAddress[a] : +# 475| m475_6(bool) = InitializeParameter[a] : &:r475_5 +# 475| r475_7(glval) = VariableAddress[b] : +# 475| m475_8(bool) = InitializeParameter[b] : &:r475_7 +# 476| r476_1(glval) = VariableAddress[x] : +# 476| m476_2(bool) = Uninitialized[x] : &:r476_1 +# 477| r477_1(glval) = VariableAddress[a] : +# 477| r477_2(bool) = Load[a] : &:r477_1, m475_6 +# 477| v477_3(void) = ConditionalBranch : r477_2 +#-----| False -> Block 1 +#-----| True -> Block 4 + +# 477| Block 1 +# 477| r477_4(glval) = VariableAddress[#temp477:9] : +# 477| r477_5(bool) = Constant[0] : +# 477| m477_6(bool) = Store[#temp477:9] : &:r477_4, r477_5 +#-----| Goto -> Block 2 + +# 477| Block 2 +# 477| m477_7(bool) = Phi : from 1:m477_6, from 3:m477_14 +# 477| r477_8(glval) = VariableAddress[#temp477:9] : +# 477| r477_9(bool) = Load[#temp477:9] : &:r477_8, m477_7 +# 477| r477_10(glval) = VariableAddress[x] : +# 477| m477_11(bool) = Store[x] : &:r477_10, r477_9 +# 478| r478_1(glval) = VariableAddress[a] : +# 478| r478_2(bool) = Load[a] : &:r478_1, m475_6 +# 478| v478_3(void) = ConditionalBranch : r478_2 +#-----| False -> Block 8 +#-----| True -> Block 7 + +# 477| Block 3 +# 477| r477_12(glval) = VariableAddress[#temp477:9] : +# 477| r477_13(bool) = Constant[1] : +# 477| m477_14(bool) = Store[#temp477:9] : &:r477_12, r477_13 +#-----| Goto -> Block 2 + +# 477| Block 4 +# 477| r477_15(glval) = VariableAddress[b] : +# 477| r477_16(bool) = Load[b] : &:r477_15, m475_8 +# 477| v477_17(void) = ConditionalBranch : r477_16 +#-----| False -> Block 1 +#-----| True -> Block 3 + +# 478| Block 5 +# 478| r478_4(glval) = VariableAddress[#temp478:9] : +# 478| r478_5(bool) = Constant[0] : +# 478| m478_6(bool) = Store[#temp478:9] : &:r478_4, r478_5 +#-----| Goto -> Block 6 + +# 478| Block 6 +# 478| m478_7(bool) = Phi : from 5:m478_6, from 7:m478_14 +# 478| r478_8(glval) = VariableAddress[#temp478:9] : +# 478| r478_9(bool) = Load[#temp478:9] : &:r478_8, m478_7 +# 478| r478_10(glval) = VariableAddress[x] : +# 478| m478_11(bool) = Store[x] : &:r478_10, r478_9 +# 479| r479_1(glval) = VariableAddress[a] : +# 479| r479_2(bool) = Load[a] : &:r479_1, m475_6 +# 479| v479_3(void) = ConditionalBranch : r479_2 +#-----| False -> Block 12 +#-----| True -> Block 11 + +# 478| Block 7 +# 478| r478_12(glval) = VariableAddress[#temp478:9] : +# 478| r478_13(bool) = Constant[1] : +# 478| m478_14(bool) = Store[#temp478:9] : &:r478_12, r478_13 +#-----| Goto -> Block 6 + +# 478| Block 8 +# 478| r478_15(glval) = VariableAddress[b] : +# 478| r478_16(bool) = Load[b] : &:r478_15, m475_8 +# 478| v478_17(void) = ConditionalBranch : r478_16 +#-----| False -> Block 5 +#-----| True -> Block 7 + +# 479| Block 9 +# 479| r479_4(glval) = VariableAddress[#temp479:11] : +# 479| r479_5(bool) = Constant[0] : +# 479| m479_6(bool) = Store[#temp479:11] : &:r479_4, r479_5 +#-----| Goto -> Block 10 + +# 479| Block 10 +# 479| m479_7(bool) = Phi : from 9:m479_6, from 11:m479_15 +# 479| r479_8(glval) = VariableAddress[#temp479:11] : +# 479| r479_9(bool) = Load[#temp479:11] : &:r479_8, m479_7 +# 479| r479_10(bool) = LogicalNot : r479_9 +# 479| r479_11(glval) = VariableAddress[x] : +# 479| m479_12(bool) = Store[x] : &:r479_11, r479_10 +# 480| v480_1(void) = NoOp : +# 475| v475_9(void) = ReturnVoid : +# 475| v475_10(void) = AliasedUse : m475_3 +# 475| v475_11(void) = ExitFunction : + +# 479| Block 11 +# 479| r479_13(glval) = VariableAddress[#temp479:11] : +# 479| r479_14(bool) = Constant[1] : +# 479| m479_15(bool) = Store[#temp479:11] : &:r479_13, r479_14 +#-----| Goto -> Block 10 + +# 479| Block 12 +# 479| r479_16(glval) = VariableAddress[b] : +# 479| r479_17(bool) = Load[b] : &:r479_16, m475_8 +# 479| v479_18(void) = ConditionalBranch : r479_17 +#-----| False -> Block 9 +#-----| True -> Block 11 + +# 482| void Conditional(bool, int, int) +# 482| Block 0 +# 482| v482_1(void) = EnterFunction : +# 482| m482_2(unknown) = AliasedDefinition : +# 482| m482_3(unknown) = InitializeNonLocal : +# 482| m482_4(unknown) = Chi : total:m482_2, partial:m482_3 +# 482| r482_5(glval) = VariableAddress[a] : +# 482| m482_6(bool) = InitializeParameter[a] : &:r482_5 +# 482| r482_7(glval) = VariableAddress[x] : +# 482| m482_8(int) = InitializeParameter[x] : &:r482_7 +# 482| r482_9(glval) = VariableAddress[y] : +# 482| m482_10(int) = InitializeParameter[y] : &:r482_9 +# 483| r483_1(glval) = VariableAddress[z] : +# 483| r483_2(glval) = VariableAddress[a] : +# 483| r483_3(bool) = Load[a] : &:r483_2, m482_6 +# 483| v483_4(void) = ConditionalBranch : r483_3 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 483| Block 1 +# 483| m483_5(int) = Phi : from 2:m483_12, from 3:m483_16 +# 483| r483_6(glval) = VariableAddress[#temp483:13] : +# 483| r483_7(int) = Load[#temp483:13] : &:r483_6, m483_5 +# 483| m483_8(int) = Store[z] : &:r483_1, r483_7 +# 484| v484_1(void) = NoOp : +# 482| v482_11(void) = ReturnVoid : +# 482| v482_12(void) = AliasedUse : m482_3 +# 482| v482_13(void) = ExitFunction : + +# 483| Block 2 +# 483| r483_9(glval) = VariableAddress[x] : +# 483| r483_10(int) = Load[x] : &:r483_9, m482_8 +# 483| r483_11(glval) = VariableAddress[#temp483:13] : +# 483| m483_12(int) = Store[#temp483:13] : &:r483_11, r483_10 +#-----| Goto -> Block 1 + +# 483| Block 3 +# 483| r483_13(glval) = VariableAddress[y] : +# 483| r483_14(int) = Load[y] : &:r483_13, m482_10 +# 483| r483_15(glval) = VariableAddress[#temp483:13] : +# 483| m483_16(int) = Store[#temp483:13] : &:r483_15, r483_14 +#-----| Goto -> Block 1 + +# 486| void Conditional_LValue(bool) +# 486| Block 0 +# 486| v486_1(void) = EnterFunction : +# 486| m486_2(unknown) = AliasedDefinition : +# 486| m486_3(unknown) = InitializeNonLocal : +# 486| m486_4(unknown) = Chi : total:m486_2, partial:m486_3 +# 486| r486_5(glval) = VariableAddress[a] : +# 486| m486_6(bool) = InitializeParameter[a] : &:r486_5 +# 487| r487_1(glval) = VariableAddress[x] : +# 487| m487_2(int) = Uninitialized[x] : &:r487_1 +# 488| r488_1(glval) = VariableAddress[y] : +# 488| m488_2(int) = Uninitialized[y] : &:r488_1 +# 489| r489_1(int) = Constant[5] : +# 489| r489_2(glval) = VariableAddress[a] : +# 489| r489_3(bool) = Load[a] : &:r489_2, m486_6 +# 489| v489_4(void) = ConditionalBranch : r489_3 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 489| Block 1 +# 489| m489_5(glval) = Phi : from 2:m489_12, from 3:m489_15 +# 489| r489_6(glval) = VariableAddress[#temp489:6] : +# 489| r489_7(glval) = Load[#temp489:6] : &:r489_6, m489_5 +# 489| m489_8(int) = Store[?] : &:r489_7, r489_1 +# 489| m489_9(unknown) = Chi : total:m486_4, partial:m489_8 +# 490| v490_1(void) = NoOp : +# 486| v486_7(void) = ReturnVoid : +# 486| v486_8(void) = AliasedUse : ~m489_9 +# 486| v486_9(void) = ExitFunction : + +# 489| Block 2 +# 489| r489_10(glval) = VariableAddress[x] : +# 489| r489_11(glval) = VariableAddress[#temp489:6] : +# 489| m489_12(glval) = Store[#temp489:6] : &:r489_11, r489_10 +#-----| Goto -> Block 1 + +# 489| Block 3 +# 489| r489_13(glval) = VariableAddress[y] : +# 489| r489_14(glval) = VariableAddress[#temp489:6] : +# 489| m489_15(glval) = Store[#temp489:6] : &:r489_14, r489_13 +#-----| Goto -> Block 1 + +# 492| void Conditional_Void(bool) +# 492| Block 0 +# 492| v492_1(void) = EnterFunction : +# 492| m492_2(unknown) = AliasedDefinition : +# 492| m492_3(unknown) = InitializeNonLocal : +# 492| m492_4(unknown) = Chi : total:m492_2, partial:m492_3 +# 492| r492_5(glval) = VariableAddress[a] : +# 492| m492_6(bool) = InitializeParameter[a] : &:r492_5 +# 493| r493_1(glval) = VariableAddress[a] : +# 493| r493_2(bool) = Load[a] : &:r493_1, m492_6 +# 493| v493_3(void) = ConditionalBranch : r493_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 493| Block 1 +# 493| r493_4(glval) = FunctionAddress[VoidFunc] : +# 493| v493_5(void) = Call[VoidFunc] : func:r493_4 +# 493| m493_6(unknown) = ^CallSideEffect : ~m492_4 +# 493| m493_7(unknown) = Chi : total:m492_4, partial:m493_6 +#-----| Goto -> Block 3 + +# 493| Block 2 +# 493| r493_8(glval) = FunctionAddress[VoidFunc] : +# 493| v493_9(void) = Call[VoidFunc] : func:r493_8 +# 493| m493_10(unknown) = ^CallSideEffect : ~m492_4 +# 493| m493_11(unknown) = Chi : total:m492_4, partial:m493_10 +#-----| Goto -> Block 3 + +# 494| Block 3 +# 494| m494_1(unknown) = Phi : from 1:~m493_7, from 2:~m493_11 +# 494| v494_2(void) = NoOp : +# 492| v492_7(void) = ReturnVoid : +# 492| v492_8(void) = AliasedUse : ~m494_1 +# 492| v492_9(void) = ExitFunction : + +# 496| void Nullptr() +# 496| Block 0 +# 496| v496_1(void) = EnterFunction : +# 496| m496_2(unknown) = AliasedDefinition : +# 496| m496_3(unknown) = InitializeNonLocal : +# 496| m496_4(unknown) = Chi : total:m496_2, partial:m496_3 +# 497| r497_1(glval) = VariableAddress[p] : +# 497| r497_2(int *) = Constant[0] : +# 497| m497_3(int *) = Store[p] : &:r497_1, r497_2 +# 498| r498_1(glval) = VariableAddress[q] : +# 498| r498_2(int *) = Constant[0] : +# 498| m498_3(int *) = Store[q] : &:r498_1, r498_2 +# 499| r499_1(int *) = Constant[0] : +# 499| r499_2(glval) = VariableAddress[p] : +# 499| m499_3(int *) = Store[p] : &:r499_2, r499_1 +# 500| r500_1(int *) = Constant[0] : +# 500| r500_2(glval) = VariableAddress[q] : +# 500| m500_3(int *) = Store[q] : &:r500_2, r500_1 +# 501| v501_1(void) = NoOp : +# 496| v496_5(void) = ReturnVoid : +# 496| v496_6(void) = AliasedUse : m496_3 +# 496| v496_7(void) = ExitFunction : + +# 503| void InitList(int, float) +# 503| Block 0 +# 503| v503_1(void) = EnterFunction : +# 503| m503_2(unknown) = AliasedDefinition : +# 503| m503_3(unknown) = InitializeNonLocal : +# 503| m503_4(unknown) = Chi : total:m503_2, partial:m503_3 +# 503| r503_5(glval) = VariableAddress[x] : +# 503| m503_6(int) = InitializeParameter[x] : &:r503_5 +# 503| r503_7(glval) = VariableAddress[f] : +# 503| m503_8(float) = InitializeParameter[f] : &:r503_7 +# 504| r504_1(glval) = VariableAddress[pt1] : +# 504| m504_2(Point) = Uninitialized[pt1] : &:r504_1 +# 504| r504_3(glval) = FieldAddress[x] : r504_1 +# 504| r504_4(glval) = VariableAddress[x] : +# 504| r504_5(int) = Load[x] : &:r504_4, m503_6 +# 504| m504_6(int) = Store[?] : &:r504_3, r504_5 +# 504| m504_7(Point) = Chi : total:m504_2, partial:m504_6 +# 504| r504_8(glval) = FieldAddress[y] : r504_1 +# 504| r504_9(glval) = VariableAddress[f] : +# 504| r504_10(float) = Load[f] : &:r504_9, m503_8 +# 504| r504_11(int) = Convert : r504_10 +# 504| m504_12(int) = Store[?] : &:r504_8, r504_11 +# 504| m504_13(Point) = Chi : total:m504_7, partial:m504_12 +# 505| r505_1(glval) = VariableAddress[pt2] : +# 505| m505_2(Point) = Uninitialized[pt2] : &:r505_1 +# 505| r505_3(glval) = FieldAddress[x] : r505_1 +# 505| r505_4(glval) = VariableAddress[x] : +# 505| r505_5(int) = Load[x] : &:r505_4, m503_6 +# 505| m505_6(int) = Store[?] : &:r505_3, r505_5 +# 505| m505_7(Point) = Chi : total:m505_2, partial:m505_6 +# 505| r505_8(glval) = FieldAddress[y] : r505_1 +# 505| r505_9(int) = Constant[0] : +# 505| m505_10(int) = Store[?] : &:r505_8, r505_9 +# 505| m505_11(Point) = Chi : total:m505_7, partial:m505_10 +# 506| r506_1(glval) = VariableAddress[pt3] : +# 506| m506_2(Point) = Uninitialized[pt3] : &:r506_1 +# 506| r506_3(glval) = FieldAddress[x] : r506_1 +# 506| r506_4(int) = Constant[0] : +# 506| m506_5(int) = Store[?] : &:r506_3, r506_4 +# 506| m506_6(Point) = Chi : total:m506_2, partial:m506_5 +# 506| r506_7(glval) = FieldAddress[y] : r506_1 +# 506| r506_8(int) = Constant[0] : +# 506| m506_9(int) = Store[?] : &:r506_7, r506_8 +# 506| m506_10(Point) = Chi : total:m506_6, partial:m506_9 +# 508| r508_1(glval) = VariableAddress[x1] : +# 508| r508_2(int) = Constant[1] : +# 508| m508_3(int) = Store[x1] : &:r508_1, r508_2 +# 509| r509_1(glval) = VariableAddress[x2] : +# 509| r509_2(int) = Constant[0] : +# 509| m509_3(int) = Store[x2] : &:r509_1, r509_2 +# 510| v510_1(void) = NoOp : +# 503| v503_9(void) = ReturnVoid : +# 503| v503_10(void) = AliasedUse : m503_3 +# 503| v503_11(void) = ExitFunction : + +# 512| void NestedInitList(int, float) +# 512| Block 0 +# 512| v512_1(void) = EnterFunction : +# 512| m512_2(unknown) = AliasedDefinition : +# 512| m512_3(unknown) = InitializeNonLocal : +# 512| m512_4(unknown) = Chi : total:m512_2, partial:m512_3 +# 512| r512_5(glval) = VariableAddress[x] : +# 512| m512_6(int) = InitializeParameter[x] : &:r512_5 +# 512| r512_7(glval) = VariableAddress[f] : +# 512| m512_8(float) = InitializeParameter[f] : &:r512_7 +# 513| r513_1(glval) = VariableAddress[r1] : +# 513| m513_2(Rect) = Uninitialized[r1] : &:r513_1 +# 513| r513_3(glval) = FieldAddress[topLeft] : r513_1 +# 513| r513_4(Point) = Constant[0] : +# 513| m513_5(Point) = Store[?] : &:r513_3, r513_4 +# 513| m513_6(Rect) = Chi : total:m513_2, partial:m513_5 +# 513| r513_7(glval) = FieldAddress[bottomRight] : r513_1 +# 513| r513_8(Point) = Constant[0] : +# 513| m513_9(Point) = Store[?] : &:r513_7, r513_8 +# 513| m513_10(Rect) = Chi : total:m513_6, partial:m513_9 +# 514| r514_1(glval) = VariableAddress[r2] : +# 514| m514_2(Rect) = Uninitialized[r2] : &:r514_1 +# 514| r514_3(glval) = FieldAddress[topLeft] : r514_1 +# 514| r514_4(glval) = FieldAddress[x] : r514_3 +# 514| r514_5(glval) = VariableAddress[x] : +# 514| r514_6(int) = Load[x] : &:r514_5, m512_6 +# 514| m514_7(int) = Store[?] : &:r514_4, r514_6 +# 514| m514_8(Rect) = Chi : total:m514_2, partial:m514_7 +# 514| r514_9(glval) = FieldAddress[y] : r514_3 +# 514| r514_10(glval) = VariableAddress[f] : +# 514| r514_11(float) = Load[f] : &:r514_10, m512_8 +# 514| r514_12(int) = Convert : r514_11 +# 514| m514_13(int) = Store[?] : &:r514_9, r514_12 +# 514| m514_14(Rect) = Chi : total:m514_8, partial:m514_13 +# 514| r514_15(glval) = FieldAddress[bottomRight] : r514_1 +# 514| r514_16(Point) = Constant[0] : +# 514| m514_17(Point) = Store[?] : &:r514_15, r514_16 +# 514| m514_18(Rect) = Chi : total:m514_14, partial:m514_17 +# 515| r515_1(glval) = VariableAddress[r3] : +# 515| m515_2(Rect) = Uninitialized[r3] : &:r515_1 +# 515| r515_3(glval) = FieldAddress[topLeft] : r515_1 +# 515| r515_4(glval) = FieldAddress[x] : r515_3 +# 515| r515_5(glval) = VariableAddress[x] : +# 515| r515_6(int) = Load[x] : &:r515_5, m512_6 +# 515| m515_7(int) = Store[?] : &:r515_4, r515_6 +# 515| m515_8(Rect) = Chi : total:m515_2, partial:m515_7 +# 515| r515_9(glval) = FieldAddress[y] : r515_3 +# 515| r515_10(glval) = VariableAddress[f] : +# 515| r515_11(float) = Load[f] : &:r515_10, m512_8 +# 515| r515_12(int) = Convert : r515_11 +# 515| m515_13(int) = Store[?] : &:r515_9, r515_12 +# 515| m515_14(Rect) = Chi : total:m515_8, partial:m515_13 +# 515| r515_15(glval) = FieldAddress[bottomRight] : r515_1 +# 515| r515_16(glval) = FieldAddress[x] : r515_15 +# 515| r515_17(glval) = VariableAddress[x] : +# 515| r515_18(int) = Load[x] : &:r515_17, m512_6 +# 515| m515_19(int) = Store[?] : &:r515_16, r515_18 +# 515| m515_20(Rect) = Chi : total:m515_14, partial:m515_19 +# 515| r515_21(glval) = FieldAddress[y] : r515_15 +# 515| r515_22(glval) = VariableAddress[f] : +# 515| r515_23(float) = Load[f] : &:r515_22, m512_8 +# 515| r515_24(int) = Convert : r515_23 +# 515| m515_25(int) = Store[?] : &:r515_21, r515_24 +# 515| m515_26(Rect) = Chi : total:m515_20, partial:m515_25 +# 516| r516_1(glval) = VariableAddress[r4] : +# 516| m516_2(Rect) = Uninitialized[r4] : &:r516_1 +# 516| r516_3(glval) = FieldAddress[topLeft] : r516_1 +# 516| r516_4(glval) = FieldAddress[x] : r516_3 +# 516| r516_5(glval) = VariableAddress[x] : +# 516| r516_6(int) = Load[x] : &:r516_5, m512_6 +# 516| m516_7(int) = Store[?] : &:r516_4, r516_6 +# 516| m516_8(Rect) = Chi : total:m516_2, partial:m516_7 +# 516| r516_9(glval) = FieldAddress[y] : r516_3 +# 516| r516_10(int) = Constant[0] : +# 516| m516_11(int) = Store[?] : &:r516_9, r516_10 +# 516| m516_12(Rect) = Chi : total:m516_8, partial:m516_11 +# 516| r516_13(glval) = FieldAddress[bottomRight] : r516_1 +# 516| r516_14(glval) = FieldAddress[x] : r516_13 +# 516| r516_15(glval) = VariableAddress[x] : +# 516| r516_16(int) = Load[x] : &:r516_15, m512_6 +# 516| m516_17(int) = Store[?] : &:r516_14, r516_16 +# 516| m516_18(Rect) = Chi : total:m516_12, partial:m516_17 +# 516| r516_19(glval) = FieldAddress[y] : r516_13 +# 516| r516_20(int) = Constant[0] : +# 516| m516_21(int) = Store[?] : &:r516_19, r516_20 +# 516| m516_22(Rect) = Chi : total:m516_18, partial:m516_21 +# 517| v517_1(void) = NoOp : +# 512| v512_9(void) = ReturnVoid : +# 512| v512_10(void) = AliasedUse : m512_3 +# 512| v512_11(void) = ExitFunction : + +# 519| void ArrayInit(int, float) +# 519| Block 0 +# 519| v519_1(void) = EnterFunction : +# 519| m519_2(unknown) = AliasedDefinition : +# 519| m519_3(unknown) = InitializeNonLocal : +# 519| m519_4(unknown) = Chi : total:m519_2, partial:m519_3 +# 519| r519_5(glval) = VariableAddress[x] : +# 519| m519_6(int) = InitializeParameter[x] : &:r519_5 +# 519| r519_7(glval) = VariableAddress[f] : +# 519| m519_8(float) = InitializeParameter[f] : &:r519_7 +# 520| r520_1(glval) = VariableAddress[a1] : +# 520| m520_2(int[3]) = Uninitialized[a1] : &:r520_1 +# 520| r520_3(int) = Constant[0] : +# 520| r520_4(glval) = PointerAdd[4] : r520_1, r520_3 +# 520| r520_5(unknown[12]) = Constant[0] : +# 520| m520_6(unknown[12]) = Store[?] : &:r520_4, r520_5 +# 521| r521_1(glval) = VariableAddress[a2] : +# 521| m521_2(int[3]) = Uninitialized[a2] : &:r521_1 +# 521| r521_3(int) = Constant[0] : +# 521| r521_4(glval) = PointerAdd[4] : r521_1, r521_3 +# 521| r521_5(glval) = VariableAddress[x] : +# 521| r521_6(int) = Load[x] : &:r521_5, m519_6 +# 521| m521_7(int) = Store[?] : &:r521_4, r521_6 +# 521| m521_8(int[3]) = Chi : total:m521_2, partial:m521_7 +# 521| r521_9(int) = Constant[1] : +# 521| r521_10(glval) = PointerAdd[4] : r521_1, r521_9 +# 521| r521_11(glval) = VariableAddress[f] : +# 521| r521_12(float) = Load[f] : &:r521_11, m519_8 +# 521| r521_13(int) = Convert : r521_12 +# 521| m521_14(int) = Store[?] : &:r521_10, r521_13 +# 521| m521_15(int[3]) = Chi : total:m521_8, partial:m521_14 +# 521| r521_16(int) = Constant[2] : +# 521| r521_17(glval) = PointerAdd[4] : r521_1, r521_16 +# 521| r521_18(int) = Constant[0] : +# 521| m521_19(int) = Store[?] : &:r521_17, r521_18 +# 521| m521_20(int[3]) = Chi : total:m521_15, partial:m521_19 +# 522| r522_1(glval) = VariableAddress[a3] : +# 522| m522_2(int[3]) = Uninitialized[a3] : &:r522_1 +# 522| r522_3(int) = Constant[0] : +# 522| r522_4(glval) = PointerAdd[4] : r522_1, r522_3 +# 522| r522_5(glval) = VariableAddress[x] : +# 522| r522_6(int) = Load[x] : &:r522_5, m519_6 +# 522| m522_7(int) = Store[?] : &:r522_4, r522_6 +# 522| m522_8(int[3]) = Chi : total:m522_2, partial:m522_7 +# 522| r522_9(int) = Constant[1] : +# 522| r522_10(glval) = PointerAdd[4] : r522_1, r522_9 +# 522| r522_11(unknown[8]) = Constant[0] : +# 522| m522_12(unknown[8]) = Store[?] : &:r522_10, r522_11 +# 522| m522_13(int[3]) = Chi : total:m522_8, partial:m522_12 +# 523| v523_1(void) = NoOp : +# 519| v519_9(void) = ReturnVoid : +# 519| v519_10(void) = AliasedUse : m519_3 +# 519| v519_11(void) = ExitFunction : + +# 530| void UnionInit(int, float) +# 530| Block 0 +# 530| v530_1(void) = EnterFunction : +# 530| m530_2(unknown) = AliasedDefinition : +# 530| m530_3(unknown) = InitializeNonLocal : +# 530| m530_4(unknown) = Chi : total:m530_2, partial:m530_3 +# 530| r530_5(glval) = VariableAddress[x] : +# 530| m530_6(int) = InitializeParameter[x] : &:r530_5 +# 530| r530_7(glval) = VariableAddress[f] : +# 530| m530_8(float) = InitializeParameter[f] : &:r530_7 +# 531| r531_1(glval) = VariableAddress[u1] : +# 531| m531_2(U) = Uninitialized[u1] : &:r531_1 +# 531| r531_3(glval) = FieldAddress[d] : r531_1 +# 531| r531_4(glval) = VariableAddress[f] : +# 531| r531_5(float) = Load[f] : &:r531_4, m530_8 +# 531| r531_6(double) = Convert : r531_5 +# 531| m531_7(double) = Store[?] : &:r531_3, r531_6 +# 533| v533_1(void) = NoOp : +# 530| v530_9(void) = ReturnVoid : +# 530| v530_10(void) = AliasedUse : m530_3 +# 530| v530_11(void) = ExitFunction : + +# 535| void EarlyReturn(int, int) +# 535| Block 0 +# 535| v535_1(void) = EnterFunction : +# 535| m535_2(unknown) = AliasedDefinition : +# 535| m535_3(unknown) = InitializeNonLocal : +# 535| m535_4(unknown) = Chi : total:m535_2, partial:m535_3 +# 535| r535_5(glval) = VariableAddress[x] : +# 535| m535_6(int) = InitializeParameter[x] : &:r535_5 +# 535| r535_7(glval) = VariableAddress[y] : +# 535| m535_8(int) = InitializeParameter[y] : &:r535_7 +# 536| r536_1(glval) = VariableAddress[x] : +# 536| r536_2(int) = Load[x] : &:r536_1, m535_6 +# 536| r536_3(glval) = VariableAddress[y] : +# 536| r536_4(int) = Load[y] : &:r536_3, m535_8 +# 536| r536_5(bool) = CompareLT : r536_2, r536_4 +# 536| v536_6(void) = ConditionalBranch : r536_5 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 535| Block 1 +# 535| v535_9(void) = ReturnVoid : +# 535| v535_10(void) = AliasedUse : m535_3 +# 535| v535_11(void) = ExitFunction : + +# 537| Block 2 +# 537| v537_1(void) = NoOp : +#-----| Goto -> Block 1 + +# 540| Block 3 +# 540| r540_1(glval) = VariableAddress[x] : +# 540| r540_2(int) = Load[x] : &:r540_1, m535_6 +# 540| r540_3(glval) = VariableAddress[y] : +# 540| m540_4(int) = Store[y] : &:r540_3, r540_2 +# 541| v541_1(void) = NoOp : +#-----| Goto -> Block 1 + +# 543| int EarlyReturnValue(int, int) +# 543| Block 0 +# 543| v543_1(void) = EnterFunction : +# 543| m543_2(unknown) = AliasedDefinition : +# 543| m543_3(unknown) = InitializeNonLocal : +# 543| m543_4(unknown) = Chi : total:m543_2, partial:m543_3 +# 543| r543_5(glval) = VariableAddress[x] : +# 543| m543_6(int) = InitializeParameter[x] : &:r543_5 +# 543| r543_7(glval) = VariableAddress[y] : +# 543| m543_8(int) = InitializeParameter[y] : &:r543_7 +# 544| r544_1(glval) = VariableAddress[x] : +# 544| r544_2(int) = Load[x] : &:r544_1, m543_6 +# 544| r544_3(glval) = VariableAddress[y] : +# 544| r544_4(int) = Load[y] : &:r544_3, m543_8 +# 544| r544_5(bool) = CompareLT : r544_2, r544_4 +# 544| v544_6(void) = ConditionalBranch : r544_5 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 543| Block 1 +# 543| m543_9(int) = Phi : from 2:m545_4, from 3:m548_7 +# 543| r543_10(glval) = VariableAddress[#return] : +# 543| v543_11(void) = ReturnValue : &:r543_10, m543_9 +# 543| v543_12(void) = AliasedUse : m543_3 +# 543| v543_13(void) = ExitFunction : + +# 545| Block 2 +# 545| r545_1(glval) = VariableAddress[#return] : +# 545| r545_2(glval) = VariableAddress[x] : +# 545| r545_3(int) = Load[x] : &:r545_2, m543_6 +# 545| m545_4(int) = Store[#return] : &:r545_1, r545_3 +#-----| Goto -> Block 1 + +# 548| Block 3 +# 548| r548_1(glval) = VariableAddress[#return] : +# 548| r548_2(glval) = VariableAddress[x] : +# 548| r548_3(int) = Load[x] : &:r548_2, m543_6 +# 548| r548_4(glval) = VariableAddress[y] : +# 548| r548_5(int) = Load[y] : &:r548_4, m543_8 +# 548| r548_6(int) = Add : r548_3, r548_5 +# 548| m548_7(int) = Store[#return] : &:r548_1, r548_6 +#-----| Goto -> Block 1 + +# 551| int CallViaFuncPtr(int(*)(int)) +# 551| Block 0 +# 551| v551_1(void) = EnterFunction : +# 551| m551_2(unknown) = AliasedDefinition : +# 551| m551_3(unknown) = InitializeNonLocal : +# 551| m551_4(unknown) = Chi : total:m551_2, partial:m551_3 +# 551| r551_5(glval<..(*)(..)>) = VariableAddress[pfn] : +# 551| m551_6(..(*)(..)) = InitializeParameter[pfn] : &:r551_5 +# 552| r552_1(glval) = VariableAddress[#return] : +# 552| r552_2(glval<..(*)(..)>) = VariableAddress[pfn] : +# 552| r552_3(..(*)(..)) = Load[pfn] : &:r552_2, m551_6 +# 552| r552_4(int) = Constant[5] : +# 552| r552_5(int) = Call[?] : func:r552_3, 0:r552_4 +# 552| m552_6(unknown) = ^CallSideEffect : ~m551_4 +# 552| m552_7(unknown) = Chi : total:m551_4, partial:m552_6 +# 552| m552_8(int) = Store[#return] : &:r552_1, r552_5 +# 551| r551_7(glval) = VariableAddress[#return] : +# 551| v551_8(void) = ReturnValue : &:r551_7, m552_8 +# 551| v551_9(void) = AliasedUse : ~m552_7 +# 551| v551_10(void) = ExitFunction : + +# 560| int EnumSwitch(E) +# 560| Block 0 +# 560| v560_1(void) = EnterFunction : +# 560| m560_2(unknown) = AliasedDefinition : +# 560| m560_3(unknown) = InitializeNonLocal : +# 560| m560_4(unknown) = Chi : total:m560_2, partial:m560_3 +# 560| r560_5(glval) = VariableAddress[e] : +# 560| m560_6(E) = InitializeParameter[e] : &:r560_5 +# 561| r561_1(glval) = VariableAddress[e] : +# 561| r561_2(E) = Load[e] : &:r561_1, m560_6 +# 561| r561_3(int) = Convert : r561_2 +# 561| v561_4(void) = Switch : r561_3 +#-----| Case[0] -> Block 2 +#-----| Case[1] -> Block 3 +#-----| Default -> Block 4 + +# 560| Block 1 +# 560| m560_7(int) = Phi : from 2:m563_3, from 3:m565_3, from 4:m567_3 +# 560| r560_8(glval) = VariableAddress[#return] : +# 560| v560_9(void) = ReturnValue : &:r560_8, m560_7 +# 560| v560_10(void) = AliasedUse : m560_3 +# 560| v560_11(void) = ExitFunction : + +# 562| Block 2 +# 562| v562_1(void) = NoOp : +# 563| r563_1(glval) = VariableAddress[#return] : +# 563| r563_2(int) = Constant[0] : +# 563| m563_3(int) = Store[#return] : &:r563_1, r563_2 +#-----| Goto -> Block 1 + +# 564| Block 3 +# 564| v564_1(void) = NoOp : +# 565| r565_1(glval) = VariableAddress[#return] : +# 565| r565_2(int) = Constant[1] : +# 565| m565_3(int) = Store[#return] : &:r565_1, r565_2 +#-----| Goto -> Block 1 + +# 566| Block 4 +# 566| v566_1(void) = NoOp : +# 567| r567_1(glval) = VariableAddress[#return] : +# 567| r567_2(int) = Constant[-1] : +# 567| m567_3(int) = Store[#return] : &:r567_1, r567_2 +#-----| Goto -> Block 1 + +# 571| void InitArray() +# 571| Block 0 +# 571| v571_1(void) = EnterFunction : +# 571| m571_2(unknown) = AliasedDefinition : +# 571| m571_3(unknown) = InitializeNonLocal : +# 571| m571_4(unknown) = Chi : total:m571_2, partial:m571_3 +# 572| r572_1(glval) = VariableAddress[a_pad] : +# 572| r572_2(glval) = StringConstant[""] : +# 572| r572_3(char[32]) = Load[?] : &:r572_2, ~m571_3 +# 572| m572_4(char[32]) = Store[a_pad] : &:r572_1, r572_3 +# 573| r573_1(glval) = VariableAddress[a_nopad] : +# 573| r573_2(glval) = StringConstant["foo"] : +# 573| r573_3(char[4]) = Load[?] : &:r573_2, ~m571_3 +# 573| m573_4(char[4]) = Store[a_nopad] : &:r573_1, r573_3 +# 574| r574_1(glval) = VariableAddress[a_infer] : +# 574| r574_2(glval) = StringConstant["blah"] : +# 574| r574_3(char[5]) = Load[?] : &:r574_2, ~m571_3 +# 574| m574_4(char[5]) = Store[a_infer] : &:r574_1, r574_3 +# 575| r575_1(glval) = VariableAddress[b] : +# 575| m575_2(char[2]) = Uninitialized[b] : &:r575_1 +# 576| r576_1(glval) = VariableAddress[c] : +# 576| m576_2(char[2]) = Uninitialized[c] : &:r576_1 +# 576| r576_3(int) = Constant[0] : +# 576| r576_4(glval) = PointerAdd[1] : r576_1, r576_3 +# 576| r576_5(unknown[2]) = Constant[0] : +# 576| m576_6(unknown[2]) = Store[?] : &:r576_4, r576_5 +# 577| r577_1(glval) = VariableAddress[d] : +# 577| m577_2(char[2]) = Uninitialized[d] : &:r577_1 +# 577| r577_3(int) = Constant[0] : +# 577| r577_4(glval) = PointerAdd[1] : r577_1, r577_3 +# 577| r577_5(char) = Constant[0] : +# 577| m577_6(char) = Store[?] : &:r577_4, r577_5 +# 577| m577_7(char[2]) = Chi : total:m577_2, partial:m577_6 +# 577| r577_8(int) = Constant[1] : +# 577| r577_9(glval) = PointerAdd[1] : r577_1, r577_8 +# 577| r577_10(char) = Constant[0] : +# 577| m577_11(char) = Store[?] : &:r577_9, r577_10 +# 577| m577_12(char[2]) = Chi : total:m577_7, partial:m577_11 +# 578| r578_1(glval) = VariableAddress[e] : +# 578| m578_2(char[2]) = Uninitialized[e] : &:r578_1 +# 578| r578_3(int) = Constant[0] : +# 578| r578_4(glval) = PointerAdd[1] : r578_1, r578_3 +# 578| r578_5(char) = Constant[0] : +# 578| m578_6(char) = Store[?] : &:r578_4, r578_5 +# 578| m578_7(char[2]) = Chi : total:m578_2, partial:m578_6 +# 578| r578_8(int) = Constant[1] : +# 578| r578_9(glval) = PointerAdd[1] : r578_1, r578_8 +# 578| r578_10(char) = Constant[1] : +# 578| m578_11(char) = Store[?] : &:r578_9, r578_10 +# 578| m578_12(char[2]) = Chi : total:m578_7, partial:m578_11 +# 579| r579_1(glval) = VariableAddress[f] : +# 579| m579_2(char[3]) = Uninitialized[f] : &:r579_1 +# 579| r579_3(int) = Constant[0] : +# 579| r579_4(glval) = PointerAdd[1] : r579_1, r579_3 +# 579| r579_5(char) = Constant[0] : +# 579| m579_6(char) = Store[?] : &:r579_4, r579_5 +# 579| m579_7(char[3]) = Chi : total:m579_2, partial:m579_6 +# 579| r579_8(int) = Constant[1] : +# 579| r579_9(glval) = PointerAdd[1] : r579_1, r579_8 +# 579| r579_10(unknown[2]) = Constant[0] : +# 579| m579_11(unknown[2]) = Store[?] : &:r579_9, r579_10 +# 579| m579_12(char[3]) = Chi : total:m579_7, partial:m579_11 +# 580| v580_1(void) = NoOp : +# 571| v571_5(void) = ReturnVoid : +# 571| v571_6(void) = AliasedUse : m571_3 +# 571| v571_7(void) = ExitFunction : + +# 584| void VarArgs() +# 584| Block 0 +# 584| v584_1(void) = EnterFunction : +# 584| m584_2(unknown) = AliasedDefinition : +# 584| m584_3(unknown) = InitializeNonLocal : +# 584| m584_4(unknown) = Chi : total:m584_2, partial:m584_3 +# 585| r585_1(glval) = FunctionAddress[VarArgFunction] : +# 585| r585_2(glval) = StringConstant["%d %s"] : +# 585| r585_3(char *) = Convert : r585_2 +# 585| r585_4(int) = Constant[1] : +# 585| r585_5(glval) = StringConstant["string"] : +# 585| r585_6(char *) = Convert : r585_5 +# 585| v585_7(void) = Call[VarArgFunction] : func:r585_1, 0:r585_3, 1:r585_4, 2:r585_6 +# 585| m585_8(unknown) = ^CallSideEffect : ~m584_4 +# 585| m585_9(unknown) = Chi : total:m584_4, partial:m585_8 +# 585| v585_10(void) = ^BufferReadSideEffect[0] : &:r585_3, ~m584_3 +# 585| v585_11(void) = ^BufferReadSideEffect[2] : &:r585_6, ~m584_3 +# 585| m585_12(unknown) = ^BufferMayWriteSideEffect[2] : &:r585_6 +# 585| m585_13(unknown) = Chi : total:m585_9, partial:m585_12 +# 586| v586_1(void) = NoOp : +# 584| v584_5(void) = ReturnVoid : +# 584| v584_6(void) = AliasedUse : ~m585_13 +# 584| v584_7(void) = ExitFunction : + +# 590| void SetFuncPtr() +# 590| Block 0 +# 590| v590_1(void) = EnterFunction : +# 590| m590_2(unknown) = AliasedDefinition : +# 590| m590_3(unknown) = InitializeNonLocal : +# 590| m590_4(unknown) = Chi : total:m590_2, partial:m590_3 +# 591| r591_1(glval<..(*)(..)>) = VariableAddress[pfn] : +# 591| r591_2(..(*)(..)) = FunctionAddress[FuncPtrTarget] : +# 591| m591_3(..(*)(..)) = Store[pfn] : &:r591_1, r591_2 +# 592| r592_1(glval<..()(..)>) = FunctionAddress[FuncPtrTarget] : +# 592| r592_2(..(*)(..)) = CopyValue : r592_1 +# 592| r592_3(glval<..(*)(..)>) = VariableAddress[pfn] : +# 592| m592_4(..(*)(..)) = Store[pfn] : &:r592_3, r592_2 +# 593| r593_1(..(*)(..)) = FunctionAddress[FuncPtrTarget] : +# 593| r593_2(..(*)(..)) = CopyValue : r593_1 +# 593| r593_3(glval<..(*)(..)>) = VariableAddress[pfn] : +# 593| m593_4(..(*)(..)) = Store[pfn] : &:r593_3, r593_2 +# 594| r594_1(glval<..()(..)>) = FunctionAddress[FuncPtrTarget] : +# 594| r594_2(..(*)(..)) = CopyValue : r594_1 +# 594| r594_3(..(*)(..)) = CopyValue : r594_2 +# 594| r594_4(..(*)(..)) = CopyValue : r594_3 +# 594| r594_5(..(*)(..)) = CopyValue : r594_4 +# 594| r594_6(glval<..(*)(..)>) = VariableAddress[pfn] : +# 594| m594_7(..(*)(..)) = Store[pfn] : &:r594_6, r594_5 +# 595| v595_1(void) = NoOp : +# 590| v590_5(void) = ReturnVoid : +# 590| v590_6(void) = AliasedUse : m590_3 +# 590| v590_7(void) = ExitFunction : + +# 615| void DeclareObject() +# 615| Block 0 +# 615| v615_1(void) = EnterFunction : +# 615| m615_2(unknown) = AliasedDefinition : +# 615| m615_3(unknown) = InitializeNonLocal : +# 615| m615_4(unknown) = Chi : total:m615_2, partial:m615_3 +# 616| r616_1(glval) = VariableAddress[s1] : +# 616| m616_2(String) = Uninitialized[s1] : &:r616_1 +# 616| r616_3(glval) = FunctionAddress[String] : +# 616| v616_4(void) = Call[String] : func:r616_3, this:r616_1 +# 616| m616_5(unknown) = ^CallSideEffect : ~m615_4 +# 616| m616_6(unknown) = Chi : total:m615_4, partial:m616_5 +# 616| m616_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r616_1 +# 616| m616_8(String) = Chi : total:m616_2, partial:m616_7 +# 617| r617_1(glval) = VariableAddress[s2] : +# 617| m617_2(String) = Uninitialized[s2] : &:r617_1 +# 617| r617_3(glval) = FunctionAddress[String] : +# 617| r617_4(glval) = StringConstant["hello"] : +# 617| r617_5(char *) = Convert : r617_4 +# 617| v617_6(void) = Call[String] : func:r617_3, this:r617_1, 0:r617_5 +# 617| m617_7(unknown) = ^CallSideEffect : ~m616_6 +# 617| m617_8(unknown) = Chi : total:m616_6, partial:m617_7 +# 617| v617_9(void) = ^BufferReadSideEffect[0] : &:r617_5, ~m615_3 +# 617| m617_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r617_1 +# 617| m617_11(String) = Chi : total:m617_2, partial:m617_10 +# 618| r618_1(glval) = VariableAddress[s3] : +# 618| r618_2(glval) = FunctionAddress[ReturnObject] : +# 618| r618_3(String) = Call[ReturnObject] : func:r618_2 +# 618| m618_4(unknown) = ^CallSideEffect : ~m617_8 +# 618| m618_5(unknown) = Chi : total:m617_8, partial:m618_4 +# 618| m618_6(String) = Store[s3] : &:r618_1, r618_3 +# 619| r619_1(glval) = VariableAddress[s4] : +# 619| m619_2(String) = Uninitialized[s4] : &:r619_1 +# 619| r619_3(glval) = FunctionAddress[String] : +# 619| r619_4(glval) = StringConstant["test"] : +# 619| r619_5(char *) = Convert : r619_4 +# 619| v619_6(void) = Call[String] : func:r619_3, this:r619_1, 0:r619_5 +# 619| m619_7(unknown) = ^CallSideEffect : ~m618_5 +# 619| m619_8(unknown) = Chi : total:m618_5, partial:m619_7 +# 619| v619_9(void) = ^BufferReadSideEffect[0] : &:r619_5, ~m615_3 +# 619| m619_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r619_1 +# 619| m619_11(String) = Chi : total:m619_2, partial:m619_10 +# 620| v620_1(void) = NoOp : +# 615| v615_5(void) = ReturnVoid : +# 615| v615_6(void) = AliasedUse : ~m619_8 +# 615| v615_7(void) = ExitFunction : + +# 622| void CallMethods(String&, String*, String) +# 622| Block 0 +# 622| v622_1(void) = EnterFunction : +# 622| m622_2(unknown) = AliasedDefinition : +# 622| m622_3(unknown) = InitializeNonLocal : +# 622| m622_4(unknown) = Chi : total:m622_2, partial:m622_3 +# 622| r622_5(glval) = VariableAddress[r] : +# 622| m622_6(String &) = InitializeParameter[r] : &:r622_5 +# 622| r622_7(String &) = Load[r] : &:r622_5, m622_6 +# 622| m622_8(unknown) = InitializeIndirection[r] : &:r622_7 +# 622| r622_9(glval) = VariableAddress[p] : +# 622| m622_10(String *) = InitializeParameter[p] : &:r622_9 +# 622| r622_11(String *) = Load[p] : &:r622_9, m622_10 +# 622| m622_12(unknown) = InitializeIndirection[p] : &:r622_11 +# 622| r622_13(glval) = VariableAddress[s] : +# 622| m622_14(String) = InitializeParameter[s] : &:r622_13 +# 623| r623_1(glval) = VariableAddress[r] : +# 623| r623_2(String &) = Load[r] : &:r623_1, m622_6 +# 623| r623_3(glval) = CopyValue : r623_2 +# 623| r623_4(glval) = Convert : r623_3 +# 623| r623_5(glval) = FunctionAddress[c_str] : +# 623| r623_6(char *) = Call[c_str] : func:r623_5, this:r623_4 +# 623| m623_7(unknown) = ^CallSideEffect : ~m622_4 +# 623| m623_8(unknown) = Chi : total:m622_4, partial:m623_7 +# 623| v623_9(void) = ^IndirectReadSideEffect[-1] : &:r623_4, ~m622_8 +# 624| r624_1(glval) = VariableAddress[p] : +# 624| r624_2(String *) = Load[p] : &:r624_1, m622_10 +# 624| r624_3(String *) = Convert : r624_2 +# 624| r624_4(glval) = FunctionAddress[c_str] : +# 624| r624_5(char *) = Call[c_str] : func:r624_4, this:r624_3 +# 624| m624_6(unknown) = ^CallSideEffect : ~m623_8 +# 624| m624_7(unknown) = Chi : total:m623_8, partial:m624_6 +# 624| v624_8(void) = ^IndirectReadSideEffect[-1] : &:r624_3, ~m622_12 +# 625| r625_1(glval) = VariableAddress[s] : +# 625| r625_2(glval) = Convert : r625_1 +# 625| r625_3(glval) = FunctionAddress[c_str] : +# 625| r625_4(char *) = Call[c_str] : func:r625_3, this:r625_2 +# 625| m625_5(unknown) = ^CallSideEffect : ~m624_7 +# 625| m625_6(unknown) = Chi : total:m624_7, partial:m625_5 +# 625| v625_7(void) = ^IndirectReadSideEffect[-1] : &:r625_2, m622_14 +# 626| v626_1(void) = NoOp : +# 622| v622_15(void) = ReturnIndirection[r] : &:r622_7, m622_8 +# 622| v622_16(void) = ReturnIndirection[p] : &:r622_11, m622_12 +# 622| v622_17(void) = ReturnVoid : +# 622| v622_18(void) = AliasedUse : ~m625_6 +# 622| v622_19(void) = ExitFunction : + +# 628| void C::~C() +# 628| Block 0 +# 628| v628_1(void) = EnterFunction : +# 628| m628_2(unknown) = AliasedDefinition : +# 628| m628_3(unknown) = InitializeNonLocal : +# 628| m628_4(unknown) = Chi : total:m628_2, partial:m628_3 +# 628| r628_5(glval) = VariableAddress[#this] : +# 628| m628_6(glval) = InitializeParameter[#this] : &:r628_5 +# 628| r628_7(glval) = Load[#this] : &:r628_5, m628_6 +# 628| m628_8(C) = InitializeIndirection[#this] : &:r628_7 +#-----| v0_1(void) = NoOp : +# 628| r628_9(glval) = FieldAddress[m_f] : m628_6 +# 628| r628_10(glval) = FunctionAddress[~String] : +# 628| v628_11(void) = Call[~String] : func:r628_10, this:r628_9 +# 628| m628_12(unknown) = ^CallSideEffect : ~m628_4 +# 628| m628_13(unknown) = Chi : total:m628_4, partial:m628_12 +# 628| r628_14(glval) = FieldAddress[m_b] : m628_6 +# 628| r628_15(glval) = FunctionAddress[~String] : +# 628| v628_16(void) = Call[~String] : func:r628_15, this:r628_14 +# 628| m628_17(unknown) = ^CallSideEffect : ~m628_13 +# 628| m628_18(unknown) = Chi : total:m628_13, partial:m628_17 +# 628| v628_19(void) = ReturnIndirection[#this] : &:r628_7, m628_8 +# 628| v628_20(void) = ReturnVoid : +# 628| v628_21(void) = AliasedUse : ~m628_18 +# 628| v628_22(void) = ExitFunction : + +# 630| int C::StaticMemberFunction(int) +# 630| Block 0 +# 630| v630_1(void) = EnterFunction : +# 630| m630_2(unknown) = AliasedDefinition : +# 630| m630_3(unknown) = InitializeNonLocal : +# 630| m630_4(unknown) = Chi : total:m630_2, partial:m630_3 +# 630| r630_5(glval) = VariableAddress[x] : +# 630| m630_6(int) = InitializeParameter[x] : &:r630_5 +# 631| r631_1(glval) = VariableAddress[#return] : +# 631| r631_2(glval) = VariableAddress[x] : +# 631| r631_3(int) = Load[x] : &:r631_2, m630_6 +# 631| m631_4(int) = Store[#return] : &:r631_1, r631_3 +# 630| r630_7(glval) = VariableAddress[#return] : +# 630| v630_8(void) = ReturnValue : &:r630_7, m631_4 +# 630| v630_9(void) = AliasedUse : m630_3 +# 630| v630_10(void) = ExitFunction : + +# 634| int C::InstanceMemberFunction(int) +# 634| Block 0 +# 634| v634_1(void) = EnterFunction : +# 634| m634_2(unknown) = AliasedDefinition : +# 634| m634_3(unknown) = InitializeNonLocal : +# 634| m634_4(unknown) = Chi : total:m634_2, partial:m634_3 +# 634| r634_5(glval) = VariableAddress[#this] : +# 634| m634_6(glval) = InitializeParameter[#this] : &:r634_5 +# 634| r634_7(glval) = Load[#this] : &:r634_5, m634_6 +# 634| m634_8(C) = InitializeIndirection[#this] : &:r634_7 +# 634| r634_9(glval) = VariableAddress[x] : +# 634| m634_10(int) = InitializeParameter[x] : &:r634_9 +# 635| r635_1(glval) = VariableAddress[#return] : +# 635| r635_2(glval) = VariableAddress[x] : +# 635| r635_3(int) = Load[x] : &:r635_2, m634_10 +# 635| m635_4(int) = Store[#return] : &:r635_1, r635_3 +# 634| v634_11(void) = ReturnIndirection[#this] : &:r634_7, m634_8 +# 634| r634_12(glval) = VariableAddress[#return] : +# 634| v634_13(void) = ReturnValue : &:r634_12, m635_4 +# 634| v634_14(void) = AliasedUse : m634_3 +# 634| v634_15(void) = ExitFunction : + +# 638| int C::VirtualMemberFunction(int) +# 638| Block 0 +# 638| v638_1(void) = EnterFunction : +# 638| m638_2(unknown) = AliasedDefinition : +# 638| m638_3(unknown) = InitializeNonLocal : +# 638| m638_4(unknown) = Chi : total:m638_2, partial:m638_3 +# 638| r638_5(glval) = VariableAddress[#this] : +# 638| m638_6(glval) = InitializeParameter[#this] : &:r638_5 +# 638| r638_7(glval) = Load[#this] : &:r638_5, m638_6 +# 638| m638_8(C) = InitializeIndirection[#this] : &:r638_7 +# 638| r638_9(glval) = VariableAddress[x] : +# 638| m638_10(int) = InitializeParameter[x] : &:r638_9 +# 639| r639_1(glval) = VariableAddress[#return] : +# 639| r639_2(glval) = VariableAddress[x] : +# 639| r639_3(int) = Load[x] : &:r639_2, m638_10 +# 639| m639_4(int) = Store[#return] : &:r639_1, r639_3 +# 638| v638_11(void) = ReturnIndirection[#this] : &:r638_7, m638_8 +# 638| r638_12(glval) = VariableAddress[#return] : +# 638| v638_13(void) = ReturnValue : &:r638_12, m639_4 +# 638| v638_14(void) = AliasedUse : m638_3 +# 638| v638_15(void) = ExitFunction : + +# 642| void C::FieldAccess() +# 642| Block 0 +# 642| v642_1(void) = EnterFunction : +# 642| m642_2(unknown) = AliasedDefinition : +# 642| m642_3(unknown) = InitializeNonLocal : +# 642| m642_4(unknown) = Chi : total:m642_2, partial:m642_3 +# 642| r642_5(glval) = VariableAddress[#this] : +# 642| m642_6(glval) = InitializeParameter[#this] : &:r642_5 +# 642| r642_7(glval) = Load[#this] : &:r642_5, m642_6 +# 642| m642_8(C) = InitializeIndirection[#this] : &:r642_7 +# 643| r643_1(int) = Constant[0] : +# 643| r643_2(glval) = VariableAddress[#this] : +# 643| r643_3(C *) = Load[#this] : &:r643_2, m642_6 +# 643| r643_4(glval) = FieldAddress[m_a] : r643_3 +# 643| m643_5(int) = Store[?] : &:r643_4, r643_1 +# 643| m643_6(unknown) = Chi : total:m642_8, partial:m643_5 +# 644| r644_1(int) = Constant[1] : +# 644| r644_2(glval) = VariableAddress[#this] : +# 644| r644_3(C *) = Load[#this] : &:r644_2, m642_6 +# 644| r644_4(glval) = CopyValue : r644_3 +# 644| r644_5(glval) = FieldAddress[m_a] : r644_4 +# 644| m644_6(int) = Store[?] : &:r644_5, r644_1 +# 644| m644_7(unknown) = Chi : total:m643_6, partial:m644_6 +# 645| r645_1(int) = Constant[2] : +# 645| r645_2(glval) = VariableAddress[#this] : +# 645| r645_3(C *) = Load[#this] : &:r645_2, m642_6 +# 645| r645_4(glval) = FieldAddress[m_a] : r645_3 +# 645| m645_5(int) = Store[?] : &:r645_4, r645_1 +# 645| m645_6(unknown) = Chi : total:m644_7, partial:m645_5 +# 646| r646_1(glval) = VariableAddress[x] : +# 646| m646_2(int) = Uninitialized[x] : &:r646_1 +# 647| r647_1(glval) = VariableAddress[#this] : +# 647| r647_2(C *) = Load[#this] : &:r647_1, m642_6 +# 647| r647_3(glval) = FieldAddress[m_a] : r647_2 +# 647| r647_4(int) = Load[?] : &:r647_3, m645_5 +# 647| r647_5(glval) = VariableAddress[x] : +# 647| m647_6(int) = Store[x] : &:r647_5, r647_4 +# 648| r648_1(glval) = VariableAddress[#this] : +# 648| r648_2(C *) = Load[#this] : &:r648_1, m642_6 +# 648| r648_3(glval) = CopyValue : r648_2 +# 648| r648_4(glval) = FieldAddress[m_a] : r648_3 +# 648| r648_5(int) = Load[?] : &:r648_4, m645_5 +# 648| r648_6(glval) = VariableAddress[x] : +# 648| m648_7(int) = Store[x] : &:r648_6, r648_5 +# 649| r649_1(glval) = VariableAddress[#this] : +# 649| r649_2(C *) = Load[#this] : &:r649_1, m642_6 +# 649| r649_3(glval) = FieldAddress[m_a] : r649_2 +# 649| r649_4(int) = Load[?] : &:r649_3, m645_5 +# 649| r649_5(glval) = VariableAddress[x] : +# 649| m649_6(int) = Store[x] : &:r649_5, r649_4 +# 650| v650_1(void) = NoOp : +# 642| v642_9(void) = ReturnIndirection[#this] : &:r642_7, m645_6 +# 642| v642_10(void) = ReturnVoid : +# 642| v642_11(void) = AliasedUse : m642_3 +# 642| v642_12(void) = ExitFunction : + +# 652| void C::MethodCalls() +# 652| Block 0 +# 652| v652_1(void) = EnterFunction : +# 652| m652_2(unknown) = AliasedDefinition : +# 652| m652_3(unknown) = InitializeNonLocal : +# 652| m652_4(unknown) = Chi : total:m652_2, partial:m652_3 +# 652| r652_5(glval) = VariableAddress[#this] : +# 652| m652_6(glval) = InitializeParameter[#this] : &:r652_5 +# 652| r652_7(glval) = Load[#this] : &:r652_5, m652_6 +# 652| m652_8(C) = InitializeIndirection[#this] : &:r652_7 +# 653| r653_1(glval) = VariableAddress[#this] : +# 653| r653_2(C *) = Load[#this] : &:r653_1, m652_6 +# 653| r653_3(glval) = FunctionAddress[InstanceMemberFunction] : +# 653| r653_4(int) = Constant[0] : +# 653| r653_5(int) = Call[InstanceMemberFunction] : func:r653_3, this:r653_2, 0:r653_4 +# 653| m653_6(unknown) = ^CallSideEffect : ~m652_4 +# 653| m653_7(unknown) = Chi : total:m652_4, partial:m653_6 +# 653| v653_8(void) = ^IndirectReadSideEffect[-1] : &:r653_2, ~m652_8 +# 653| m653_9(C) = ^IndirectMayWriteSideEffect[-1] : &:r653_2 +# 653| m653_10(unknown) = Chi : total:m652_8, partial:m653_9 +# 654| r654_1(glval) = VariableAddress[#this] : +# 654| r654_2(C *) = Load[#this] : &:r654_1, m652_6 +# 654| r654_3(glval) = CopyValue : r654_2 +# 654| r654_4(glval) = FunctionAddress[InstanceMemberFunction] : +# 654| r654_5(int) = Constant[1] : +# 654| r654_6(int) = Call[InstanceMemberFunction] : func:r654_4, this:r654_3, 0:r654_5 +# 654| m654_7(unknown) = ^CallSideEffect : ~m653_7 +# 654| m654_8(unknown) = Chi : total:m653_7, partial:m654_7 +# 654| v654_9(void) = ^IndirectReadSideEffect[-1] : &:r654_3, ~m653_10 +# 654| m654_10(C) = ^IndirectMayWriteSideEffect[-1] : &:r654_3 +# 654| m654_11(unknown) = Chi : total:m653_10, partial:m654_10 +# 655| r655_1(glval) = VariableAddress[#this] : +# 655| r655_2(C *) = Load[#this] : &:r655_1, m652_6 +# 655| r655_3(glval) = FunctionAddress[InstanceMemberFunction] : +# 655| r655_4(int) = Constant[2] : +# 655| r655_5(int) = Call[InstanceMemberFunction] : func:r655_3, this:r655_2, 0:r655_4 +# 655| m655_6(unknown) = ^CallSideEffect : ~m654_8 +# 655| m655_7(unknown) = Chi : total:m654_8, partial:m655_6 +# 655| v655_8(void) = ^IndirectReadSideEffect[-1] : &:r655_2, ~m654_11 +# 655| m655_9(C) = ^IndirectMayWriteSideEffect[-1] : &:r655_2 +# 655| m655_10(unknown) = Chi : total:m654_11, partial:m655_9 +# 656| v656_1(void) = NoOp : +# 652| v652_9(void) = ReturnIndirection[#this] : &:r652_7, m655_10 +# 652| v652_10(void) = ReturnVoid : +# 652| v652_11(void) = AliasedUse : ~m655_7 +# 652| v652_12(void) = ExitFunction : + +# 658| void C::C() +# 658| Block 0 +# 658| v658_1(void) = EnterFunction : +# 658| m658_2(unknown) = AliasedDefinition : +# 658| m658_3(unknown) = InitializeNonLocal : +# 658| m658_4(unknown) = Chi : total:m658_2, partial:m658_3 +# 658| r658_5(glval) = VariableAddress[#this] : +# 658| m658_6(glval) = InitializeParameter[#this] : &:r658_5 +# 658| r658_7(glval) = Load[#this] : &:r658_5, m658_6 +# 658| m658_8(C) = InitializeIndirection[#this] : &:r658_7 +# 659| r659_1(glval) = FieldAddress[m_a] : m658_6 +# 659| r659_2(int) = Constant[1] : +# 659| m659_3(int) = Store[?] : &:r659_1, r659_2 +# 659| m659_4(unknown) = Chi : total:m658_8, partial:m659_3 +# 663| r663_1(glval) = FieldAddress[m_b] : m658_6 +# 663| r663_2(glval) = FunctionAddress[String] : +# 663| v663_3(void) = Call[String] : func:r663_2, this:r663_1 +# 663| m663_4(unknown) = ^CallSideEffect : ~m658_4 +# 663| m663_5(unknown) = Chi : total:m658_4, partial:m663_4 +# 663| m663_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r663_1 +# 663| m663_7(unknown) = Chi : total:m659_4, partial:m663_6 +# 660| r660_1(glval) = FieldAddress[m_c] : m658_6 +# 660| r660_2(char) = Constant[3] : +# 660| m660_3(char) = Store[?] : &:r660_1, r660_2 +# 660| m660_4(unknown) = Chi : total:m663_7, partial:m660_3 +# 661| r661_1(glval) = FieldAddress[m_e] : m658_6 +# 661| r661_2(void *) = Constant[0] : +# 661| m661_3(void *) = Store[?] : &:r661_1, r661_2 +# 661| m661_4(unknown) = Chi : total:m660_4, partial:m661_3 +# 662| r662_1(glval) = FieldAddress[m_f] : m658_6 +# 662| r662_2(glval) = FunctionAddress[String] : +# 662| r662_3(glval) = StringConstant["test"] : +# 662| r662_4(char *) = Convert : r662_3 +# 662| v662_5(void) = Call[String] : func:r662_2, this:r662_1, 0:r662_4 +# 662| m662_6(unknown) = ^CallSideEffect : ~m663_5 +# 662| m662_7(unknown) = Chi : total:m663_5, partial:m662_6 +# 662| v662_8(void) = ^BufferReadSideEffect[0] : &:r662_4, ~m658_3 +# 662| m662_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r662_1 +# 662| m662_10(unknown) = Chi : total:m661_4, partial:m662_9 +# 664| v664_1(void) = NoOp : +# 658| v658_9(void) = ReturnIndirection[#this] : &:r658_7, m662_10 +# 658| v658_10(void) = ReturnVoid : +# 658| v658_11(void) = AliasedUse : ~m662_7 +# 658| v658_12(void) = ExitFunction : + +# 675| int DerefReference(int&) +# 675| Block 0 +# 675| v675_1(void) = EnterFunction : +# 675| m675_2(unknown) = AliasedDefinition : +# 675| m675_3(unknown) = InitializeNonLocal : +# 675| m675_4(unknown) = Chi : total:m675_2, partial:m675_3 +# 675| r675_5(glval) = VariableAddress[r] : +# 675| m675_6(int &) = InitializeParameter[r] : &:r675_5 +# 675| r675_7(int &) = Load[r] : &:r675_5, m675_6 +# 675| m675_8(unknown) = InitializeIndirection[r] : &:r675_7 +# 676| r676_1(glval) = VariableAddress[#return] : +# 676| r676_2(glval) = VariableAddress[r] : +# 676| r676_3(int &) = Load[r] : &:r676_2, m675_6 +# 676| r676_4(int) = Load[?] : &:r676_3, ~m675_8 +# 676| m676_5(int) = Store[#return] : &:r676_1, r676_4 +# 675| v675_9(void) = ReturnIndirection[r] : &:r675_7, m675_8 +# 675| r675_10(glval) = VariableAddress[#return] : +# 675| v675_11(void) = ReturnValue : &:r675_10, m676_5 +# 675| v675_12(void) = AliasedUse : m675_3 +# 675| v675_13(void) = ExitFunction : + +# 679| int& TakeReference() +# 679| Block 0 +# 679| v679_1(void) = EnterFunction : +# 679| m679_2(unknown) = AliasedDefinition : +# 679| m679_3(unknown) = InitializeNonLocal : +# 679| m679_4(unknown) = Chi : total:m679_2, partial:m679_3 +# 680| r680_1(glval) = VariableAddress[#return] : +# 680| r680_2(glval) = VariableAddress[g] : +# 680| r680_3(int &) = CopyValue : r680_2 +# 680| m680_4(int &) = Store[#return] : &:r680_1, r680_3 +# 679| r679_5(glval) = VariableAddress[#return] : +# 679| v679_6(void) = ReturnValue : &:r679_5, m680_4 +# 679| v679_7(void) = AliasedUse : m679_3 +# 679| v679_8(void) = ExitFunction : + +# 685| void InitReference(int) +# 685| Block 0 +# 685| v685_1(void) = EnterFunction : +# 685| m685_2(unknown) = AliasedDefinition : +# 685| m685_3(unknown) = InitializeNonLocal : +# 685| m685_4(unknown) = Chi : total:m685_2, partial:m685_3 +# 685| r685_5(glval) = VariableAddress[x] : +# 685| m685_6(int) = InitializeParameter[x] : &:r685_5 +# 686| r686_1(glval) = VariableAddress[r] : +# 686| r686_2(glval) = VariableAddress[x] : +# 686| r686_3(int &) = CopyValue : r686_2 +# 686| m686_4(int &) = Store[r] : &:r686_1, r686_3 +# 687| r687_1(glval) = VariableAddress[r2] : +# 687| r687_2(glval) = VariableAddress[r] : +# 687| r687_3(int &) = Load[r] : &:r687_2, m686_4 +# 687| r687_4(glval) = CopyValue : r687_3 +# 687| r687_5(int &) = CopyValue : r687_4 +# 687| m687_6(int &) = Store[r2] : &:r687_1, r687_5 +# 688| r688_1(glval) = VariableAddress[r3] : +# 688| r688_2(glval) = FunctionAddress[ReturnReference] : +# 688| r688_3(String &) = Call[ReturnReference] : func:r688_2 +# 688| m688_4(unknown) = ^CallSideEffect : ~m685_4 +# 688| m688_5(unknown) = Chi : total:m685_4, partial:m688_4 +# 688| r688_6(glval) = CopyValue : r688_3 +# 688| r688_7(glval) = Convert : r688_6 +# 688| r688_8(String &) = CopyValue : r688_7 +# 688| m688_9(String &) = Store[r3] : &:r688_1, r688_8 +# 689| v689_1(void) = NoOp : +# 685| v685_7(void) = ReturnVoid : +# 685| v685_8(void) = AliasedUse : ~m688_5 +# 685| v685_9(void) = ExitFunction : + +# 691| void ArrayReferences() +# 691| Block 0 +# 691| v691_1(void) = EnterFunction : +# 691| m691_2(unknown) = AliasedDefinition : +# 691| m691_3(unknown) = InitializeNonLocal : +# 691| m691_4(unknown) = Chi : total:m691_2, partial:m691_3 +# 692| r692_1(glval) = VariableAddress[a] : +# 692| m692_2(int[10]) = Uninitialized[a] : &:r692_1 +# 693| r693_1(glval) = VariableAddress[ra] : +# 693| r693_2(glval) = VariableAddress[a] : +# 693| r693_3(int(&)[10]) = CopyValue : r693_2 +# 693| m693_4(int(&)[10]) = Store[ra] : &:r693_1, r693_3 +# 694| r694_1(glval) = VariableAddress[x] : +# 694| r694_2(glval) = VariableAddress[ra] : +# 694| r694_3(int(&)[10]) = Load[ra] : &:r694_2, m693_4 +# 694| r694_4(glval) = CopyValue : r694_3 +# 694| r694_5(int *) = Convert : r694_4 +# 694| r694_6(int) = Constant[5] : +# 694| r694_7(glval) = PointerAdd[4] : r694_5, r694_6 +# 694| r694_8(int) = Load[?] : &:r694_7, ~m692_2 +# 694| m694_9(int) = Store[x] : &:r694_1, r694_8 +# 695| v695_1(void) = NoOp : +# 691| v691_5(void) = ReturnVoid : +# 691| v691_6(void) = AliasedUse : m691_3 +# 691| v691_7(void) = ExitFunction : + +# 697| void FunctionReferences() +# 697| Block 0 +# 697| v697_1(void) = EnterFunction : +# 697| m697_2(unknown) = AliasedDefinition : +# 697| m697_3(unknown) = InitializeNonLocal : +# 697| m697_4(unknown) = Chi : total:m697_2, partial:m697_3 +# 698| r698_1(glval<..(&)(..)>) = VariableAddress[rfn] : +# 698| r698_2(glval<..()(..)>) = FunctionAddress[FuncPtrTarget] : +# 698| r698_3(..(&)(..)) = CopyValue : r698_2 +# 698| m698_4(..(&)(..)) = Store[rfn] : &:r698_1, r698_3 +# 699| r699_1(glval<..(*)(..)>) = VariableAddress[pfn] : +# 699| r699_2(glval<..(&)(..)>) = VariableAddress[rfn] : +# 699| r699_3(..(&)(..)) = Load[rfn] : &:r699_2, m698_4 +# 699| r699_4(..(*)(..)) = CopyValue : r699_3 +# 699| m699_5(..(*)(..)) = Store[pfn] : &:r699_1, r699_4 +# 700| r700_1(glval<..(&)(..)>) = VariableAddress[rfn] : +# 700| r700_2(..(&)(..)) = Load[rfn] : &:r700_1, m698_4 +# 700| r700_3(..(*)(..)) = CopyValue : r700_2 +# 700| r700_4(int) = Constant[5] : +# 700| r700_5(int) = Call[?] : func:r700_3, 0:r700_4 +# 700| m700_6(unknown) = ^CallSideEffect : ~m697_4 +# 700| m700_7(unknown) = Chi : total:m697_4, partial:m700_6 +# 701| v701_1(void) = NoOp : +# 697| v697_5(void) = ReturnVoid : +# 697| v697_6(void) = AliasedUse : ~m700_7 +# 697| v697_7(void) = ExitFunction : + +# 704| int min(int, int) +# 704| Block 0 +# 704| v704_1(void) = EnterFunction : +# 704| m704_2(unknown) = AliasedDefinition : +# 704| m704_3(unknown) = InitializeNonLocal : +# 704| m704_4(unknown) = Chi : total:m704_2, partial:m704_3 +# 704| r704_5(glval) = VariableAddress[x] : +# 704| m704_6(int) = InitializeParameter[x] : &:r704_5 +# 704| r704_7(glval) = VariableAddress[y] : +# 704| m704_8(int) = InitializeParameter[y] : &:r704_7 +# 705| r705_1(glval) = VariableAddress[#return] : +# 705| r705_2(glval) = VariableAddress[x] : +# 705| r705_3(int) = Load[x] : &:r705_2, m704_6 +# 705| r705_4(glval) = VariableAddress[y] : +# 705| r705_5(int) = Load[y] : &:r705_4, m704_8 +# 705| r705_6(bool) = CompareLT : r705_3, r705_5 +# 705| v705_7(void) = ConditionalBranch : r705_6 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 705| Block 1 +# 705| m705_8(int) = Phi : from 2:m705_15, from 3:m705_19 +# 705| r705_9(glval) = VariableAddress[#temp705:10] : +# 705| r705_10(int) = Load[#temp705:10] : &:r705_9, m705_8 +# 705| m705_11(int) = Store[#return] : &:r705_1, r705_10 +# 704| r704_9(glval) = VariableAddress[#return] : +# 704| v704_10(void) = ReturnValue : &:r704_9, m705_11 +# 704| v704_11(void) = AliasedUse : m704_3 +# 704| v704_12(void) = ExitFunction : + +# 705| Block 2 +# 705| r705_12(glval) = VariableAddress[x] : +# 705| r705_13(int) = Load[x] : &:r705_12, m704_6 +# 705| r705_14(glval) = VariableAddress[#temp705:10] : +# 705| m705_15(int) = Store[#temp705:10] : &:r705_14, r705_13 +#-----| Goto -> Block 1 + +# 705| Block 3 +# 705| r705_16(glval) = VariableAddress[y] : +# 705| r705_17(int) = Load[y] : &:r705_16, m704_8 +# 705| r705_18(glval) = VariableAddress[#temp705:10] : +# 705| m705_19(int) = Store[#temp705:10] : &:r705_18, r705_17 +#-----| Goto -> Block 1 + +# 708| int CallMin(int, int) +# 708| Block 0 +# 708| v708_1(void) = EnterFunction : +# 708| m708_2(unknown) = AliasedDefinition : +# 708| m708_3(unknown) = InitializeNonLocal : +# 708| m708_4(unknown) = Chi : total:m708_2, partial:m708_3 +# 708| r708_5(glval) = VariableAddress[x] : +# 708| m708_6(int) = InitializeParameter[x] : &:r708_5 +# 708| r708_7(glval) = VariableAddress[y] : +# 708| m708_8(int) = InitializeParameter[y] : &:r708_7 +# 709| r709_1(glval) = VariableAddress[#return] : +# 709| r709_2(glval) = FunctionAddress[min] : +# 709| r709_3(glval) = VariableAddress[x] : +# 709| r709_4(int) = Load[x] : &:r709_3, m708_6 +# 709| r709_5(glval) = VariableAddress[y] : +# 709| r709_6(int) = Load[y] : &:r709_5, m708_8 +# 709| r709_7(int) = Call[min] : func:r709_2, 0:r709_4, 1:r709_6 +# 709| m709_8(unknown) = ^CallSideEffect : ~m708_4 +# 709| m709_9(unknown) = Chi : total:m708_4, partial:m709_8 +# 709| m709_10(int) = Store[#return] : &:r709_1, r709_7 +# 708| r708_9(glval) = VariableAddress[#return] : +# 708| v708_10(void) = ReturnValue : &:r708_9, m709_10 +# 708| v708_11(void) = AliasedUse : ~m709_9 +# 708| v708_12(void) = ExitFunction : + +# 715| long Outer::Func(void*, char) +# 715| Block 0 +# 715| v715_1(void) = EnterFunction : +# 715| m715_2(unknown) = AliasedDefinition : +# 715| m715_3(unknown) = InitializeNonLocal : +# 715| m715_4(unknown) = Chi : total:m715_2, partial:m715_3 +# 715| r715_5(glval) = VariableAddress[x] : +# 715| m715_6(void *) = InitializeParameter[x] : &:r715_5 +# 715| r715_7(void *) = Load[x] : &:r715_5, m715_6 +# 715| m715_8(unknown) = InitializeIndirection[x] : &:r715_7 +# 715| r715_9(glval) = VariableAddress[y] : +# 715| m715_10(char) = InitializeParameter[y] : &:r715_9 +# 716| r716_1(glval) = VariableAddress[#return] : +# 716| r716_2(glval) = VariableAddress[#temp716:12] : +# 716| r716_3(long) = Constant[0] : +# 716| m716_4(long) = Store[#temp716:12] : &:r716_2, r716_3 +# 716| r716_5(long) = Load[#temp716:12] : &:r716_2, m716_4 +# 716| m716_6(long) = Store[#return] : &:r716_1, r716_5 +# 715| v715_11(void) = ReturnIndirection[x] : &:r715_7, m715_8 +# 715| r715_12(glval) = VariableAddress[#return] : +# 715| v715_13(void) = ReturnValue : &:r715_12, m716_6 +# 715| v715_14(void) = AliasedUse : m715_3 +# 715| v715_15(void) = ExitFunction : + +# 720| double CallNestedTemplateFunc() +# 720| Block 0 +# 720| v720_1(void) = EnterFunction : +# 720| m720_2(unknown) = AliasedDefinition : +# 720| m720_3(unknown) = InitializeNonLocal : +# 720| m720_4(unknown) = Chi : total:m720_2, partial:m720_3 +# 721| r721_1(glval) = VariableAddress[#return] : +# 721| r721_2(glval) = FunctionAddress[Func] : +# 721| r721_3(void *) = Constant[0] : +# 721| r721_4(char) = Constant[111] : +# 721| r721_5(long) = Call[Func] : func:r721_2, 0:r721_3, 1:r721_4 +# 721| m721_6(unknown) = ^CallSideEffect : ~m720_4 +# 721| m721_7(unknown) = Chi : total:m720_4, partial:m721_6 +# 721| v721_8(void) = ^BufferReadSideEffect[0] : &:r721_3, ~m721_7 +# 721| m721_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r721_3 +# 721| m721_10(unknown) = Chi : total:m721_7, partial:m721_9 +# 721| r721_11(double) = Convert : r721_5 +# 721| m721_12(double) = Store[#return] : &:r721_1, r721_11 +# 720| r720_5(glval) = VariableAddress[#return] : +# 720| v720_6(void) = ReturnValue : &:r720_5, m721_12 +# 720| v720_7(void) = AliasedUse : ~m721_10 +# 720| v720_8(void) = ExitFunction : + +# 724| void TryCatch(bool) +# 724| Block 0 +# 724| v724_1(void) = EnterFunction : +# 724| m724_2(unknown) = AliasedDefinition : +# 724| m724_3(unknown) = InitializeNonLocal : +# 724| m724_4(unknown) = Chi : total:m724_2, partial:m724_3 +# 724| r724_5(glval) = VariableAddress[b] : +# 724| m724_6(bool) = InitializeParameter[b] : &:r724_5 +# 726| r726_1(glval) = VariableAddress[x] : +# 726| r726_2(int) = Constant[5] : +# 726| m726_3(int) = Store[x] : &:r726_1, r726_2 +# 727| r727_1(glval) = VariableAddress[b] : +# 727| r727_2(bool) = Load[b] : &:r727_1, m724_6 +# 727| v727_3(void) = ConditionalBranch : r727_2 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 724| Block 1 +# 724| m724_7(unknown) = Phi : from 2:~m724_10, from 11:~m724_4 +# 724| v724_8(void) = AliasedUse : ~m724_7 +# 724| v724_9(void) = ExitFunction : + +# 724| Block 2 +# 724| m724_10(unknown) = Phi : from 7:~m736_8, from 10:~m724_4 +# 724| v724_11(void) = Unwind : +#-----| Goto -> Block 1 + +# 728| Block 3 +# 728| r728_1(glval) = VariableAddress[#throw728:7] : +# 728| r728_2(glval) = StringConstant["string literal"] : +# 728| r728_3(char *) = Convert : r728_2 +# 728| m728_4(char *) = Store[#throw728:7] : &:r728_1, r728_3 +# 728| v728_5(void) = ThrowValue : &:r728_1, m728_4 +#-----| Exception -> Block 6 + +# 730| Block 4 +# 730| r730_1(glval) = VariableAddress[x] : +# 730| r730_2(int) = Load[x] : &:r730_1, m726_3 +# 730| r730_3(int) = Constant[2] : +# 730| r730_4(bool) = CompareLT : r730_2, r730_3 +# 730| v730_5(void) = ConditionalBranch : r730_4 +#-----| False -> Block 5 +#-----| True -> Block 12 + +# 733| Block 5 +# 733| r733_1(int) = Constant[7] : +# 733| r733_2(glval) = VariableAddress[x] : +# 733| m733_3(int) = Store[x] : &:r733_2, r733_1 +#-----| Goto -> Block 11 + +# 735| Block 6 +# 735| v735_1(void) = CatchByType[const char *] : +#-----| Exception -> Block 8 +#-----| Goto -> Block 7 + +# 735| Block 7 +# 735| r735_2(glval) = VariableAddress[s] : +# 735| m735_3(char *) = InitializeParameter[s] : &:r735_2 +# 735| r735_4(char *) = Load[s] : &:r735_2, m735_3 +# 735| m735_5(unknown) = InitializeIndirection[s] : &:r735_4 +# 736| r736_1(glval) = VariableAddress[#throw736:5] : +# 736| m736_2(String) = Uninitialized[#throw736:5] : &:r736_1 +# 736| r736_3(glval) = FunctionAddress[String] : +# 736| r736_4(glval) = VariableAddress[s] : +# 736| r736_5(char *) = Load[s] : &:r736_4, m735_3 +# 736| v736_6(void) = Call[String] : func:r736_3, this:r736_1, 0:r736_5 +# 736| m736_7(unknown) = ^CallSideEffect : ~m724_4 +# 736| m736_8(unknown) = Chi : total:m724_4, partial:m736_7 +# 736| v736_9(void) = ^BufferReadSideEffect[0] : &:r736_5, ~m735_5 +# 736| m736_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r736_1 +# 736| m736_11(String) = Chi : total:m736_2, partial:m736_10 +# 736| v736_12(void) = ThrowValue : &:r736_1, m736_11 +#-----| Exception -> Block 2 + +# 738| Block 8 +# 738| v738_1(void) = CatchByType[const String &] : +#-----| Exception -> Block 10 +#-----| Goto -> Block 9 + +# 738| Block 9 +# 738| r738_2(glval) = VariableAddress[e] : +# 738| m738_3(String &) = InitializeParameter[e] : &:r738_2 +# 738| r738_4(String &) = Load[e] : &:r738_2, m738_3 +# 738| m738_5(unknown) = InitializeIndirection[e] : &:r738_4 +# 738| v738_6(void) = NoOp : +#-----| Goto -> Block 11 + +# 740| Block 10 +# 740| v740_1(void) = CatchAny : +# 741| v741_1(void) = ReThrow : +#-----| Exception -> Block 2 + +# 743| Block 11 +# 743| v743_1(void) = NoOp : +# 724| v724_12(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 724| Block 12 +# 724| v724_13(void) = Unreached : + +# 745| Base& Base::operator=(Base const&) +# 745| Block 0 +# 745| v745_1(void) = EnterFunction : +# 745| m745_2(unknown) = AliasedDefinition : +# 745| m745_3(unknown) = InitializeNonLocal : +# 745| m745_4(unknown) = Chi : total:m745_2, partial:m745_3 +# 745| r745_5(glval) = VariableAddress[#this] : +# 745| m745_6(glval) = InitializeParameter[#this] : &:r745_5 +# 745| r745_7(glval) = Load[#this] : &:r745_5, m745_6 +# 745| m745_8(Base) = InitializeIndirection[#this] : &:r745_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(Base &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(Base &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 745| r745_9(glval) = VariableAddress[#this] : +# 745| r745_10(Base *) = Load[#this] : &:r745_9, m745_6 +# 745| r745_11(glval) = FieldAddress[base_s] : r745_10 +# 745| r745_12(String *) = CopyValue : r745_11 +# 745| r745_13(glval) = FunctionAddress[operator=] : +# 745| r745_14(glval) = VariableAddress[(unnamed parameter 0)] : +# 745| r745_15(Base &) = Load[(unnamed parameter 0)] : &:r745_14, m0_2 +#-----| r0_5(glval) = CopyValue : r745_15 +# 745| r745_16(glval) = FieldAddress[base_s] : r0_5 +#-----| r0_6(String &) = CopyValue : r745_16 +# 745| r745_17(String &) = Call[operator=] : func:r745_13, this:r745_12, 0:r0_6 +# 745| m745_18(unknown) = ^CallSideEffect : ~m745_4 +# 745| m745_19(unknown) = Chi : total:m745_4, partial:m745_18 +# 745| v745_20(void) = ^IndirectReadSideEffect[-1] : &:r745_12, ~m745_8 +#-----| v0_7(void) = ^BufferReadSideEffect[0] : &:r0_6, ~m0_4 +# 745| m745_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_12 +# 745| m745_22(unknown) = Chi : total:m745_8, partial:m745_21 +#-----| r0_8(glval) = CopyValue : r745_17 +#-----| r0_9(glval) = VariableAddress[#return] : +#-----| r0_10(glval) = VariableAddress[#this] : +#-----| r0_11(Base *) = Load[#this] : &:r0_10, m745_6 +#-----| r0_12(glval) = CopyValue : r0_11 +#-----| r0_13(Base &) = CopyValue : r0_12 +#-----| m0_14(Base &) = Store[#return] : &:r0_9, r0_13 +# 745| v745_23(void) = ReturnIndirection[#this] : &:r745_7, m745_22 +#-----| v0_15(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 745| r745_24(glval) = VariableAddress[#return] : +# 745| v745_25(void) = ReturnValue : &:r745_24, m0_14 +# 745| v745_26(void) = AliasedUse : ~m745_19 +# 745| v745_27(void) = ExitFunction : + +# 745| void Base::Base(Base const&) +# 745| Block 0 +# 745| v745_1(void) = EnterFunction : +# 745| m745_2(unknown) = AliasedDefinition : +# 745| m745_3(unknown) = InitializeNonLocal : +# 745| m745_4(unknown) = Chi : total:m745_2, partial:m745_3 +# 745| r745_5(glval) = VariableAddress[#this] : +# 745| m745_6(glval) = InitializeParameter[#this] : &:r745_5 +# 745| r745_7(glval) = Load[#this] : &:r745_5, m745_6 +# 745| m745_8(Base) = InitializeIndirection[#this] : &:r745_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(Base &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(Base &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 745| r745_9(glval) = FieldAddress[base_s] : m745_6 +# 745| r745_10(glval) = FunctionAddress[String] : +# 745| v745_11(void) = Call[String] : func:r745_10, this:r745_9 +# 745| m745_12(unknown) = ^CallSideEffect : ~m745_4 +# 745| m745_13(unknown) = Chi : total:m745_4, partial:m745_12 +# 745| m745_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_9 +# 745| m745_15(unknown) = Chi : total:m745_8, partial:m745_14 +# 745| v745_16(void) = NoOp : +# 745| v745_17(void) = ReturnIndirection[#this] : &:r745_7, m745_15 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 745| v745_18(void) = ReturnVoid : +# 745| v745_19(void) = AliasedUse : ~m745_13 +# 745| v745_20(void) = ExitFunction : + +# 748| void Base::Base() +# 748| Block 0 +# 748| v748_1(void) = EnterFunction : +# 748| m748_2(unknown) = AliasedDefinition : +# 748| m748_3(unknown) = InitializeNonLocal : +# 748| m748_4(unknown) = Chi : total:m748_2, partial:m748_3 +# 748| r748_5(glval) = VariableAddress[#this] : +# 748| m748_6(glval) = InitializeParameter[#this] : &:r748_5 +# 748| r748_7(glval) = Load[#this] : &:r748_5, m748_6 +# 748| m748_8(Base) = InitializeIndirection[#this] : &:r748_7 +# 748| r748_9(glval) = FieldAddress[base_s] : m748_6 +# 748| r748_10(glval) = FunctionAddress[String] : +# 748| v748_11(void) = Call[String] : func:r748_10, this:r748_9 +# 748| m748_12(unknown) = ^CallSideEffect : ~m748_4 +# 748| m748_13(unknown) = Chi : total:m748_4, partial:m748_12 +# 748| m748_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r748_9 +# 748| m748_15(unknown) = Chi : total:m748_8, partial:m748_14 +# 749| v749_1(void) = NoOp : +# 748| v748_16(void) = ReturnIndirection[#this] : &:r748_7, m748_15 +# 748| v748_17(void) = ReturnVoid : +# 748| v748_18(void) = AliasedUse : ~m748_13 +# 748| v748_19(void) = ExitFunction : + +# 750| void Base::~Base() +# 750| Block 0 +# 750| v750_1(void) = EnterFunction : +# 750| m750_2(unknown) = AliasedDefinition : +# 750| m750_3(unknown) = InitializeNonLocal : +# 750| m750_4(unknown) = Chi : total:m750_2, partial:m750_3 +# 750| r750_5(glval) = VariableAddress[#this] : +# 750| m750_6(glval) = InitializeParameter[#this] : &:r750_5 +# 750| r750_7(glval) = Load[#this] : &:r750_5, m750_6 +# 750| m750_8(Base) = InitializeIndirection[#this] : &:r750_7 +# 751| v751_1(void) = NoOp : +# 751| r751_2(glval) = FieldAddress[base_s] : m750_6 +# 751| r751_3(glval) = FunctionAddress[~String] : +# 751| v751_4(void) = Call[~String] : func:r751_3, this:r751_2 +# 751| m751_5(unknown) = ^CallSideEffect : ~m750_4 +# 751| m751_6(unknown) = Chi : total:m750_4, partial:m751_5 +# 750| v750_9(void) = ReturnIndirection[#this] : &:r750_7, m750_8 +# 750| v750_10(void) = ReturnVoid : +# 750| v750_11(void) = AliasedUse : ~m751_6 +# 750| v750_12(void) = ExitFunction : + +# 754| Middle& Middle::operator=(Middle const&) +# 754| Block 0 +# 754| v754_1(void) = EnterFunction : +# 754| m754_2(unknown) = AliasedDefinition : +# 754| m754_3(unknown) = InitializeNonLocal : +# 754| m754_4(unknown) = Chi : total:m754_2, partial:m754_3 +# 754| r754_5(glval) = VariableAddress[#this] : +# 754| m754_6(glval) = InitializeParameter[#this] : &:r754_5 +# 754| r754_7(glval) = Load[#this] : &:r754_5, m754_6 +# 754| m754_8(Middle) = InitializeIndirection[#this] : &:r754_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(Middle &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(Middle &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 754| r754_9(glval) = VariableAddress[#this] : +# 754| r754_10(Middle *) = Load[#this] : &:r754_9, m754_6 +#-----| r0_5(Base *) = ConvertToNonVirtualBase[Middle : Base] : r754_10 +# 754| r754_11(glval) = FunctionAddress[operator=] : +# 754| r754_12(glval) = VariableAddress[(unnamed parameter 0)] : +# 754| r754_13(Middle &) = Load[(unnamed parameter 0)] : &:r754_12, m0_2 +#-----| r0_6(glval) = CopyValue : r754_13 +# 754| r754_14(Middle *) = CopyValue : r0_6 +#-----| r0_7(Base *) = ConvertToNonVirtualBase[Middle : Base] : r754_14 +# 754| r754_15(glval) = CopyValue : r0_7 +#-----| r0_8(Base &) = CopyValue : r754_15 +# 754| r754_16(Base &) = Call[operator=] : func:r754_11, this:r0_5, 0:r0_8 +# 754| m754_17(unknown) = ^CallSideEffect : ~m754_4 +# 754| m754_18(unknown) = Chi : total:m754_4, partial:m754_17 +#-----| v0_9(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m754_8 +#-----| v0_10(void) = ^BufferReadSideEffect[0] : &:r0_8, ~m0_4 +#-----| m0_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_5 +#-----| m0_12(unknown) = Chi : total:m754_8, partial:m0_11 +#-----| r0_13(glval) = CopyValue : r754_16 +# 754| r754_19(glval) = VariableAddress[#this] : +# 754| r754_20(Middle *) = Load[#this] : &:r754_19, m754_6 +# 754| r754_21(glval) = FieldAddress[middle_s] : r754_20 +# 754| r754_22(String *) = CopyValue : r754_21 +# 754| r754_23(glval) = FunctionAddress[operator=] : +# 754| r754_24(glval) = VariableAddress[(unnamed parameter 0)] : +# 754| r754_25(Middle &) = Load[(unnamed parameter 0)] : &:r754_24, m0_2 +#-----| r0_14(glval) = CopyValue : r754_25 +# 754| r754_26(glval) = FieldAddress[middle_s] : r0_14 +#-----| r0_15(String &) = CopyValue : r754_26 +# 754| r754_27(String &) = Call[operator=] : func:r754_23, this:r754_22, 0:r0_15 +# 754| m754_28(unknown) = ^CallSideEffect : ~m754_18 +# 754| m754_29(unknown) = Chi : total:m754_18, partial:m754_28 +# 754| v754_30(void) = ^IndirectReadSideEffect[-1] : &:r754_22, ~m754_8 +#-----| v0_16(void) = ^BufferReadSideEffect[0] : &:r0_15, ~m0_4 +# 754| m754_31(String) = ^IndirectMayWriteSideEffect[-1] : &:r754_22 +# 754| m754_32(unknown) = Chi : total:m0_12, partial:m754_31 +#-----| r0_17(glval) = CopyValue : r754_27 +#-----| r0_18(glval) = VariableAddress[#return] : +#-----| r0_19(glval) = VariableAddress[#this] : +#-----| r0_20(Middle *) = Load[#this] : &:r0_19, m754_6 +#-----| r0_21(glval) = CopyValue : r0_20 +#-----| r0_22(Middle &) = CopyValue : r0_21 +#-----| m0_23(Middle &) = Store[#return] : &:r0_18, r0_22 +# 754| v754_33(void) = ReturnIndirection[#this] : &:r754_7, m754_32 +#-----| v0_24(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 754| r754_34(glval) = VariableAddress[#return] : +# 754| v754_35(void) = ReturnValue : &:r754_34, m0_23 +# 754| v754_36(void) = AliasedUse : ~m754_29 +# 754| v754_37(void) = ExitFunction : + +# 757| void Middle::Middle() +# 757| Block 0 +# 757| v757_1(void) = EnterFunction : +# 757| m757_2(unknown) = AliasedDefinition : +# 757| m757_3(unknown) = InitializeNonLocal : +# 757| m757_4(unknown) = Chi : total:m757_2, partial:m757_3 +# 757| r757_5(glval) = VariableAddress[#this] : +# 757| m757_6(glval) = InitializeParameter[#this] : &:r757_5 +# 757| r757_7(glval) = Load[#this] : &:r757_5, m757_6 +# 757| m757_8(Middle) = InitializeIndirection[#this] : &:r757_7 +# 757| r757_9(glval) = ConvertToNonVirtualBase[Middle : Base] : m757_6 +# 757| r757_10(glval) = FunctionAddress[Base] : +# 757| v757_11(void) = Call[Base] : func:r757_10, this:r757_9 +# 757| m757_12(unknown) = ^CallSideEffect : ~m757_4 +# 757| m757_13(unknown) = Chi : total:m757_4, partial:m757_12 +# 757| m757_14(Base) = ^IndirectMayWriteSideEffect[-1] : &:r757_9 +# 757| m757_15(unknown) = Chi : total:m757_8, partial:m757_14 +# 757| r757_16(glval) = FieldAddress[middle_s] : m757_6 +# 757| r757_17(glval) = FunctionAddress[String] : +# 757| v757_18(void) = Call[String] : func:r757_17, this:r757_16 +# 757| m757_19(unknown) = ^CallSideEffect : ~m757_13 +# 757| m757_20(unknown) = Chi : total:m757_13, partial:m757_19 +# 757| m757_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r757_16 +# 757| m757_22(unknown) = Chi : total:m757_15, partial:m757_21 +# 758| v758_1(void) = NoOp : +# 757| v757_23(void) = ReturnIndirection[#this] : &:r757_7, m757_22 +# 757| v757_24(void) = ReturnVoid : +# 757| v757_25(void) = AliasedUse : ~m757_20 +# 757| v757_26(void) = ExitFunction : + +# 759| void Middle::~Middle() +# 759| Block 0 +# 759| v759_1(void) = EnterFunction : +# 759| m759_2(unknown) = AliasedDefinition : +# 759| m759_3(unknown) = InitializeNonLocal : +# 759| m759_4(unknown) = Chi : total:m759_2, partial:m759_3 +# 759| r759_5(glval) = VariableAddress[#this] : +# 759| m759_6(glval) = InitializeParameter[#this] : &:r759_5 +# 759| r759_7(glval) = Load[#this] : &:r759_5, m759_6 +# 759| m759_8(Middle) = InitializeIndirection[#this] : &:r759_7 +# 760| v760_1(void) = NoOp : +# 760| r760_2(glval) = FieldAddress[middle_s] : m759_6 +# 760| r760_3(glval) = FunctionAddress[~String] : +# 760| v760_4(void) = Call[~String] : func:r760_3, this:r760_2 +# 760| m760_5(unknown) = ^CallSideEffect : ~m759_4 +# 760| m760_6(unknown) = Chi : total:m759_4, partial:m760_5 +# 760| r760_7(glval) = ConvertToNonVirtualBase[Middle : Base] : m759_6 +# 760| r760_8(glval) = FunctionAddress[~Base] : +# 760| v760_9(void) = Call[~Base] : func:r760_8, this:r760_7 +# 760| m760_10(unknown) = ^CallSideEffect : ~m760_6 +# 760| m760_11(unknown) = Chi : total:m760_6, partial:m760_10 +# 759| v759_9(void) = ReturnIndirection[#this] : &:r759_7, m759_8 +# 759| v759_10(void) = ReturnVoid : +# 759| v759_11(void) = AliasedUse : ~m760_11 +# 759| v759_12(void) = ExitFunction : + +# 763| Derived& Derived::operator=(Derived const&) +# 763| Block 0 +# 763| v763_1(void) = EnterFunction : +# 763| m763_2(unknown) = AliasedDefinition : +# 763| m763_3(unknown) = InitializeNonLocal : +# 763| m763_4(unknown) = Chi : total:m763_2, partial:m763_3 +# 763| r763_5(glval) = VariableAddress[#this] : +# 763| m763_6(glval) = InitializeParameter[#this] : &:r763_5 +# 763| r763_7(glval) = Load[#this] : &:r763_5, m763_6 +# 763| m763_8(Derived) = InitializeIndirection[#this] : &:r763_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(Derived &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(Derived &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 763| r763_9(glval) = VariableAddress[#this] : +# 763| r763_10(Derived *) = Load[#this] : &:r763_9, m763_6 +#-----| r0_5(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r763_10 +# 763| r763_11(glval) = FunctionAddress[operator=] : +# 763| r763_12(glval) = VariableAddress[(unnamed parameter 0)] : +# 763| r763_13(Derived &) = Load[(unnamed parameter 0)] : &:r763_12, m0_2 +#-----| r0_6(glval) = CopyValue : r763_13 +# 763| r763_14(Derived *) = CopyValue : r0_6 +#-----| r0_7(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r763_14 +# 763| r763_15(glval) = CopyValue : r0_7 +#-----| r0_8(Middle &) = CopyValue : r763_15 +# 763| r763_16(Middle &) = Call[operator=] : func:r763_11, this:r0_5, 0:r0_8 +# 763| m763_17(unknown) = ^CallSideEffect : ~m763_4 +# 763| m763_18(unknown) = Chi : total:m763_4, partial:m763_17 +#-----| v0_9(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m763_8 +#-----| v0_10(void) = ^BufferReadSideEffect[0] : &:r0_8, ~m0_4 +#-----| m0_11(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_5 +#-----| m0_12(unknown) = Chi : total:m763_8, partial:m0_11 +#-----| r0_13(glval) = CopyValue : r763_16 +# 763| r763_19(glval) = VariableAddress[#this] : +# 763| r763_20(Derived *) = Load[#this] : &:r763_19, m763_6 +# 763| r763_21(glval) = FieldAddress[derived_s] : r763_20 +# 763| r763_22(String *) = CopyValue : r763_21 +# 763| r763_23(glval) = FunctionAddress[operator=] : +# 763| r763_24(glval) = VariableAddress[(unnamed parameter 0)] : +# 763| r763_25(Derived &) = Load[(unnamed parameter 0)] : &:r763_24, m0_2 +#-----| r0_14(glval) = CopyValue : r763_25 +# 763| r763_26(glval) = FieldAddress[derived_s] : r0_14 +#-----| r0_15(String &) = CopyValue : r763_26 +# 763| r763_27(String &) = Call[operator=] : func:r763_23, this:r763_22, 0:r0_15 +# 763| m763_28(unknown) = ^CallSideEffect : ~m763_18 +# 763| m763_29(unknown) = Chi : total:m763_18, partial:m763_28 +# 763| v763_30(void) = ^IndirectReadSideEffect[-1] : &:r763_22, ~m763_8 +#-----| v0_16(void) = ^BufferReadSideEffect[0] : &:r0_15, ~m0_4 +# 763| m763_31(String) = ^IndirectMayWriteSideEffect[-1] : &:r763_22 +# 763| m763_32(unknown) = Chi : total:m0_12, partial:m763_31 +#-----| r0_17(glval) = CopyValue : r763_27 +#-----| r0_18(glval) = VariableAddress[#return] : +#-----| r0_19(glval) = VariableAddress[#this] : +#-----| r0_20(Derived *) = Load[#this] : &:r0_19, m763_6 +#-----| r0_21(glval) = CopyValue : r0_20 +#-----| r0_22(Derived &) = CopyValue : r0_21 +#-----| m0_23(Derived &) = Store[#return] : &:r0_18, r0_22 +# 763| v763_33(void) = ReturnIndirection[#this] : &:r763_7, m763_32 +#-----| v0_24(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 763| r763_34(glval) = VariableAddress[#return] : +# 763| v763_35(void) = ReturnValue : &:r763_34, m0_23 +# 763| v763_36(void) = AliasedUse : ~m763_29 +# 763| v763_37(void) = ExitFunction : + +# 766| void Derived::Derived() +# 766| Block 0 +# 766| v766_1(void) = EnterFunction : +# 766| m766_2(unknown) = AliasedDefinition : +# 766| m766_3(unknown) = InitializeNonLocal : +# 766| m766_4(unknown) = Chi : total:m766_2, partial:m766_3 +# 766| r766_5(glval) = VariableAddress[#this] : +# 766| m766_6(glval) = InitializeParameter[#this] : &:r766_5 +# 766| r766_7(glval) = Load[#this] : &:r766_5, m766_6 +# 766| m766_8(Derived) = InitializeIndirection[#this] : &:r766_7 +# 766| r766_9(glval) = ConvertToNonVirtualBase[Derived : Middle] : m766_6 +# 766| r766_10(glval) = FunctionAddress[Middle] : +# 766| v766_11(void) = Call[Middle] : func:r766_10, this:r766_9 +# 766| m766_12(unknown) = ^CallSideEffect : ~m766_4 +# 766| m766_13(unknown) = Chi : total:m766_4, partial:m766_12 +# 766| m766_14(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r766_9 +# 766| m766_15(unknown) = Chi : total:m766_8, partial:m766_14 +# 766| r766_16(glval) = FieldAddress[derived_s] : m766_6 +# 766| r766_17(glval) = FunctionAddress[String] : +# 766| v766_18(void) = Call[String] : func:r766_17, this:r766_16 +# 766| m766_19(unknown) = ^CallSideEffect : ~m766_13 +# 766| m766_20(unknown) = Chi : total:m766_13, partial:m766_19 +# 766| m766_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r766_16 +# 766| m766_22(unknown) = Chi : total:m766_15, partial:m766_21 +# 767| v767_1(void) = NoOp : +# 766| v766_23(void) = ReturnIndirection[#this] : &:r766_7, m766_22 +# 766| v766_24(void) = ReturnVoid : +# 766| v766_25(void) = AliasedUse : ~m766_20 +# 766| v766_26(void) = ExitFunction : + +# 768| void Derived::~Derived() +# 768| Block 0 +# 768| v768_1(void) = EnterFunction : +# 768| m768_2(unknown) = AliasedDefinition : +# 768| m768_3(unknown) = InitializeNonLocal : +# 768| m768_4(unknown) = Chi : total:m768_2, partial:m768_3 +# 768| r768_5(glval) = VariableAddress[#this] : +# 768| m768_6(glval) = InitializeParameter[#this] : &:r768_5 +# 768| r768_7(glval) = Load[#this] : &:r768_5, m768_6 +# 768| m768_8(Derived) = InitializeIndirection[#this] : &:r768_7 +# 769| v769_1(void) = NoOp : +# 769| r769_2(glval) = FieldAddress[derived_s] : m768_6 +# 769| r769_3(glval) = FunctionAddress[~String] : +# 769| v769_4(void) = Call[~String] : func:r769_3, this:r769_2 +# 769| m769_5(unknown) = ^CallSideEffect : ~m768_4 +# 769| m769_6(unknown) = Chi : total:m768_4, partial:m769_5 +# 769| r769_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : m768_6 +# 769| r769_8(glval) = FunctionAddress[~Middle] : +# 769| v769_9(void) = Call[~Middle] : func:r769_8, this:r769_7 +# 769| m769_10(unknown) = ^CallSideEffect : ~m769_6 +# 769| m769_11(unknown) = Chi : total:m769_6, partial:m769_10 +# 768| v768_9(void) = ReturnIndirection[#this] : &:r768_7, m768_8 +# 768| v768_10(void) = ReturnVoid : +# 768| v768_11(void) = AliasedUse : ~m769_11 +# 768| v768_12(void) = ExitFunction : + +# 775| void MiddleVB1::MiddleVB1() +# 775| Block 0 +# 775| v775_1(void) = EnterFunction : +# 775| m775_2(unknown) = AliasedDefinition : +# 775| m775_3(unknown) = InitializeNonLocal : +# 775| m775_4(unknown) = Chi : total:m775_2, partial:m775_3 +# 775| r775_5(glval) = VariableAddress[#this] : +# 775| m775_6(glval) = InitializeParameter[#this] : &:r775_5 +# 775| r775_7(glval) = Load[#this] : &:r775_5, m775_6 +# 775| m775_8(MiddleVB1) = InitializeIndirection[#this] : &:r775_7 +# 775| r775_9(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : m775_6 +# 775| r775_10(glval) = FunctionAddress[Base] : +# 775| v775_11(void) = Call[Base] : func:r775_10, this:r775_9 +# 775| m775_12(unknown) = ^CallSideEffect : ~m775_4 +# 775| m775_13(unknown) = Chi : total:m775_4, partial:m775_12 +# 775| m775_14(Base) = ^IndirectMayWriteSideEffect[-1] : &:r775_9 +# 775| m775_15(unknown) = Chi : total:m775_13, partial:m775_14 +# 775| r775_16(glval) = FieldAddress[middlevb1_s] : m775_6 +# 775| r775_17(glval) = FunctionAddress[String] : +# 775| v775_18(void) = Call[String] : func:r775_17, this:r775_16 +# 775| m775_19(unknown) = ^CallSideEffect : ~m775_15 +# 775| m775_20(unknown) = Chi : total:m775_15, partial:m775_19 +# 775| m775_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r775_16 +# 775| m775_22(unknown) = Chi : total:m775_8, partial:m775_21 +# 776| v776_1(void) = NoOp : +# 775| v775_23(void) = ReturnIndirection[#this] : &:r775_7, m775_22 +# 775| v775_24(void) = ReturnVoid : +# 775| v775_25(void) = AliasedUse : ~m775_20 +# 775| v775_26(void) = ExitFunction : + +# 777| void MiddleVB1::~MiddleVB1() +# 777| Block 0 +# 777| v777_1(void) = EnterFunction : +# 777| m777_2(unknown) = AliasedDefinition : +# 777| m777_3(unknown) = InitializeNonLocal : +# 777| m777_4(unknown) = Chi : total:m777_2, partial:m777_3 +# 777| r777_5(glval) = VariableAddress[#this] : +# 777| m777_6(glval) = InitializeParameter[#this] : &:r777_5 +# 777| r777_7(glval) = Load[#this] : &:r777_5, m777_6 +# 777| m777_8(MiddleVB1) = InitializeIndirection[#this] : &:r777_7 +# 778| v778_1(void) = NoOp : +# 778| r778_2(glval) = FieldAddress[middlevb1_s] : m777_6 +# 778| r778_3(glval) = FunctionAddress[~String] : +# 778| v778_4(void) = Call[~String] : func:r778_3, this:r778_2 +# 778| m778_5(unknown) = ^CallSideEffect : ~m777_4 +# 778| m778_6(unknown) = Chi : total:m777_4, partial:m778_5 +# 778| r778_7(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : m777_6 +# 778| r778_8(glval) = FunctionAddress[~Base] : +# 778| v778_9(void) = Call[~Base] : func:r778_8, this:r778_7 +# 778| m778_10(unknown) = ^CallSideEffect : ~m778_6 +# 778| m778_11(unknown) = Chi : total:m778_6, partial:m778_10 +# 777| v777_9(void) = ReturnIndirection[#this] : &:r777_7, m777_8 +# 777| v777_10(void) = ReturnVoid : +# 777| v777_11(void) = AliasedUse : ~m778_11 +# 777| v777_12(void) = ExitFunction : + +# 784| void MiddleVB2::MiddleVB2() +# 784| Block 0 +# 784| v784_1(void) = EnterFunction : +# 784| m784_2(unknown) = AliasedDefinition : +# 784| m784_3(unknown) = InitializeNonLocal : +# 784| m784_4(unknown) = Chi : total:m784_2, partial:m784_3 +# 784| r784_5(glval) = VariableAddress[#this] : +# 784| m784_6(glval) = InitializeParameter[#this] : &:r784_5 +# 784| r784_7(glval) = Load[#this] : &:r784_5, m784_6 +# 784| m784_8(MiddleVB2) = InitializeIndirection[#this] : &:r784_7 +# 784| r784_9(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : m784_6 +# 784| r784_10(glval) = FunctionAddress[Base] : +# 784| v784_11(void) = Call[Base] : func:r784_10, this:r784_9 +# 784| m784_12(unknown) = ^CallSideEffect : ~m784_4 +# 784| m784_13(unknown) = Chi : total:m784_4, partial:m784_12 +# 784| m784_14(Base) = ^IndirectMayWriteSideEffect[-1] : &:r784_9 +# 784| m784_15(unknown) = Chi : total:m784_13, partial:m784_14 +# 784| r784_16(glval) = FieldAddress[middlevb2_s] : m784_6 +# 784| r784_17(glval) = FunctionAddress[String] : +# 784| v784_18(void) = Call[String] : func:r784_17, this:r784_16 +# 784| m784_19(unknown) = ^CallSideEffect : ~m784_15 +# 784| m784_20(unknown) = Chi : total:m784_15, partial:m784_19 +# 784| m784_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r784_16 +# 784| m784_22(unknown) = Chi : total:m784_8, partial:m784_21 +# 785| v785_1(void) = NoOp : +# 784| v784_23(void) = ReturnIndirection[#this] : &:r784_7, m784_22 +# 784| v784_24(void) = ReturnVoid : +# 784| v784_25(void) = AliasedUse : ~m784_20 +# 784| v784_26(void) = ExitFunction : + +# 786| void MiddleVB2::~MiddleVB2() +# 786| Block 0 +# 786| v786_1(void) = EnterFunction : +# 786| m786_2(unknown) = AliasedDefinition : +# 786| m786_3(unknown) = InitializeNonLocal : +# 786| m786_4(unknown) = Chi : total:m786_2, partial:m786_3 +# 786| r786_5(glval) = VariableAddress[#this] : +# 786| m786_6(glval) = InitializeParameter[#this] : &:r786_5 +# 786| r786_7(glval) = Load[#this] : &:r786_5, m786_6 +# 786| m786_8(MiddleVB2) = InitializeIndirection[#this] : &:r786_7 +# 787| v787_1(void) = NoOp : +# 787| r787_2(glval) = FieldAddress[middlevb2_s] : m786_6 +# 787| r787_3(glval) = FunctionAddress[~String] : +# 787| v787_4(void) = Call[~String] : func:r787_3, this:r787_2 +# 787| m787_5(unknown) = ^CallSideEffect : ~m786_4 +# 787| m787_6(unknown) = Chi : total:m786_4, partial:m787_5 +# 787| r787_7(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : m786_6 +# 787| r787_8(glval) = FunctionAddress[~Base] : +# 787| v787_9(void) = Call[~Base] : func:r787_8, this:r787_7 +# 787| m787_10(unknown) = ^CallSideEffect : ~m787_6 +# 787| m787_11(unknown) = Chi : total:m787_6, partial:m787_10 +# 786| v786_9(void) = ReturnIndirection[#this] : &:r786_7, m786_8 +# 786| v786_10(void) = ReturnVoid : +# 786| v786_11(void) = AliasedUse : ~m787_11 +# 786| v786_12(void) = ExitFunction : + +# 793| void DerivedVB::DerivedVB() +# 793| Block 0 +# 793| v793_1(void) = EnterFunction : +# 793| m793_2(unknown) = AliasedDefinition : +# 793| m793_3(unknown) = InitializeNonLocal : +# 793| m793_4(unknown) = Chi : total:m793_2, partial:m793_3 +# 793| r793_5(glval) = VariableAddress[#this] : +# 793| m793_6(glval) = InitializeParameter[#this] : &:r793_5 +# 793| r793_7(glval) = Load[#this] : &:r793_5, m793_6 +# 793| m793_8(DerivedVB) = InitializeIndirection[#this] : &:r793_7 +# 793| r793_9(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : m793_6 +# 793| r793_10(glval) = FunctionAddress[Base] : +# 793| v793_11(void) = Call[Base] : func:r793_10, this:r793_9 +# 793| m793_12(unknown) = ^CallSideEffect : ~m793_4 +# 793| m793_13(unknown) = Chi : total:m793_4, partial:m793_12 +# 793| m793_14(Base) = ^IndirectMayWriteSideEffect[-1] : &:r793_9 +# 793| m793_15(unknown) = Chi : total:m793_13, partial:m793_14 +# 793| r793_16(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : m793_6 +# 793| r793_17(glval) = FunctionAddress[MiddleVB1] : +# 793| v793_18(void) = Call[MiddleVB1] : func:r793_17, this:r793_16 +# 793| m793_19(unknown) = ^CallSideEffect : ~m793_15 +# 793| m793_20(unknown) = Chi : total:m793_15, partial:m793_19 +# 793| m793_21(MiddleVB1) = ^IndirectMayWriteSideEffect[-1] : &:r793_16 +# 793| m793_22(unknown) = Chi : total:m793_8, partial:m793_21 +# 793| r793_23(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : m793_6 +# 793| r793_24(glval) = FunctionAddress[MiddleVB2] : +# 793| v793_25(void) = Call[MiddleVB2] : func:r793_24, this:r793_23 +# 793| m793_26(unknown) = ^CallSideEffect : ~m793_20 +# 793| m793_27(unknown) = Chi : total:m793_20, partial:m793_26 +# 793| m793_28(MiddleVB2) = ^IndirectMayWriteSideEffect[-1] : &:r793_23 +# 793| m793_29(unknown) = Chi : total:m793_22, partial:m793_28 +# 793| r793_30(glval) = FieldAddress[derivedvb_s] : m793_6 +# 793| r793_31(glval) = FunctionAddress[String] : +# 793| v793_32(void) = Call[String] : func:r793_31, this:r793_30 +# 793| m793_33(unknown) = ^CallSideEffect : ~m793_27 +# 793| m793_34(unknown) = Chi : total:m793_27, partial:m793_33 +# 793| m793_35(String) = ^IndirectMayWriteSideEffect[-1] : &:r793_30 +# 793| m793_36(unknown) = Chi : total:m793_29, partial:m793_35 +# 794| v794_1(void) = NoOp : +# 793| v793_37(void) = ReturnIndirection[#this] : &:r793_7, m793_36 +# 793| v793_38(void) = ReturnVoid : +# 793| v793_39(void) = AliasedUse : ~m793_34 +# 793| v793_40(void) = ExitFunction : + +# 795| void DerivedVB::~DerivedVB() +# 795| Block 0 +# 795| v795_1(void) = EnterFunction : +# 795| m795_2(unknown) = AliasedDefinition : +# 795| m795_3(unknown) = InitializeNonLocal : +# 795| m795_4(unknown) = Chi : total:m795_2, partial:m795_3 +# 795| r795_5(glval) = VariableAddress[#this] : +# 795| m795_6(glval) = InitializeParameter[#this] : &:r795_5 +# 795| r795_7(glval) = Load[#this] : &:r795_5, m795_6 +# 795| m795_8(DerivedVB) = InitializeIndirection[#this] : &:r795_7 +# 796| v796_1(void) = NoOp : +# 796| r796_2(glval) = FieldAddress[derivedvb_s] : m795_6 +# 796| r796_3(glval) = FunctionAddress[~String] : +# 796| v796_4(void) = Call[~String] : func:r796_3, this:r796_2 +# 796| m796_5(unknown) = ^CallSideEffect : ~m795_4 +# 796| m796_6(unknown) = Chi : total:m795_4, partial:m796_5 +# 796| r796_7(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : m795_6 +# 796| r796_8(glval) = FunctionAddress[~MiddleVB2] : +# 796| v796_9(void) = Call[~MiddleVB2] : func:r796_8, this:r796_7 +# 796| m796_10(unknown) = ^CallSideEffect : ~m796_6 +# 796| m796_11(unknown) = Chi : total:m796_6, partial:m796_10 +# 796| r796_12(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : m795_6 +# 796| r796_13(glval) = FunctionAddress[~MiddleVB1] : +# 796| v796_14(void) = Call[~MiddleVB1] : func:r796_13, this:r796_12 +# 796| m796_15(unknown) = ^CallSideEffect : ~m796_11 +# 796| m796_16(unknown) = Chi : total:m796_11, partial:m796_15 +# 796| r796_17(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : m795_6 +# 796| r796_18(glval) = FunctionAddress[~Base] : +# 796| v796_19(void) = Call[~Base] : func:r796_18, this:r796_17 +# 796| m796_20(unknown) = ^CallSideEffect : ~m796_16 +# 796| m796_21(unknown) = Chi : total:m796_16, partial:m796_20 +# 795| v795_9(void) = ReturnIndirection[#this] : &:r795_7, m795_8 +# 795| v795_10(void) = ReturnVoid : +# 795| v795_11(void) = AliasedUse : ~m796_21 +# 795| v795_12(void) = ExitFunction : + +# 799| void HierarchyConversions() +# 799| Block 0 +# 799| v799_1(void) = EnterFunction : +# 799| m799_2(unknown) = AliasedDefinition : +# 799| m799_3(unknown) = InitializeNonLocal : +# 799| m799_4(unknown) = Chi : total:m799_2, partial:m799_3 +# 800| r800_1(glval) = VariableAddress[b] : +# 800| m800_2(Base) = Uninitialized[b] : &:r800_1 +# 800| r800_3(glval) = FunctionAddress[Base] : +# 800| v800_4(void) = Call[Base] : func:r800_3, this:r800_1 +# 800| m800_5(unknown) = ^CallSideEffect : ~m799_4 +# 800| m800_6(unknown) = Chi : total:m799_4, partial:m800_5 +# 800| m800_7(Base) = ^IndirectMayWriteSideEffect[-1] : &:r800_1 +# 800| m800_8(Base) = Chi : total:m800_2, partial:m800_7 +# 801| r801_1(glval) = VariableAddress[m] : +# 801| m801_2(Middle) = Uninitialized[m] : &:r801_1 +# 801| r801_3(glval) = FunctionAddress[Middle] : +# 801| v801_4(void) = Call[Middle] : func:r801_3, this:r801_1 +# 801| m801_5(unknown) = ^CallSideEffect : ~m800_6 +# 801| m801_6(unknown) = Chi : total:m800_6, partial:m801_5 +# 801| m801_7(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r801_1 +# 801| m801_8(Middle) = Chi : total:m801_2, partial:m801_7 +# 802| r802_1(glval) = VariableAddress[d] : +# 802| m802_2(Derived) = Uninitialized[d] : &:r802_1 +# 802| r802_3(glval) = FunctionAddress[Derived] : +# 802| v802_4(void) = Call[Derived] : func:r802_3, this:r802_1 +# 802| m802_5(unknown) = ^CallSideEffect : ~m801_6 +# 802| m802_6(unknown) = Chi : total:m801_6, partial:m802_5 +# 802| m802_7(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r802_1 +# 802| m802_8(Derived) = Chi : total:m802_2, partial:m802_7 +# 804| r804_1(glval) = VariableAddress[pb] : +# 804| r804_2(glval) = VariableAddress[b] : +# 804| r804_3(Base *) = CopyValue : r804_2 +# 804| m804_4(Base *) = Store[pb] : &:r804_1, r804_3 +# 805| r805_1(glval) = VariableAddress[pm] : +# 805| r805_2(glval) = VariableAddress[m] : +# 805| r805_3(Middle *) = CopyValue : r805_2 +# 805| m805_4(Middle *) = Store[pm] : &:r805_1, r805_3 +# 806| r806_1(glval) = VariableAddress[pd] : +# 806| r806_2(glval) = VariableAddress[d] : +# 806| r806_3(Derived *) = CopyValue : r806_2 +# 806| m806_4(Derived *) = Store[pd] : &:r806_1, r806_3 +# 808| r808_1(glval) = VariableAddress[b] : +# 808| r808_2(glval) = FunctionAddress[operator=] : +# 808| r808_3(glval) = VariableAddress[m] : +# 808| r808_4(glval) = ConvertToNonVirtualBase[Middle : Base] : r808_3 +# 808| r808_5(Base &) = CopyValue : r808_4 +# 808| r808_6(Base &) = Call[operator=] : func:r808_2, this:r808_1, 0:r808_5 +# 808| m808_7(unknown) = ^CallSideEffect : ~m802_6 +# 808| m808_8(unknown) = Chi : total:m802_6, partial:m808_7 +# 808| v808_9(void) = ^IndirectReadSideEffect[-1] : &:r808_1, m800_8 +# 808| v808_10(void) = ^BufferReadSideEffect[0] : &:r808_5, ~m801_8 +# 808| m808_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r808_1 +# 808| m808_12(Base) = Chi : total:m800_8, partial:m808_11 +# 808| r808_13(glval) = CopyValue : r808_6 +# 809| r809_1(glval) = VariableAddress[b] : +# 809| r809_2(glval) = FunctionAddress[operator=] : +# 809| r809_3(glval) = VariableAddress[#temp809:7] : +# 809| m809_4(Base) = Uninitialized[#temp809:7] : &:r809_3 +# 809| r809_5(glval) = FunctionAddress[Base] : +# 809| r809_6(glval) = VariableAddress[m] : +# 809| r809_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_6 +# 809| r809_8(Base &) = CopyValue : r809_7 +# 809| v809_9(void) = Call[Base] : func:r809_5, this:r809_3, 0:r809_8 +# 809| m809_10(unknown) = ^CallSideEffect : ~m808_8 +# 809| m809_11(unknown) = Chi : total:m808_8, partial:m809_10 +# 809| v809_12(void) = ^BufferReadSideEffect[0] : &:r809_8, ~m801_8 +# 809| m809_13(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_3 +# 809| m809_14(Base) = Chi : total:m809_4, partial:m809_13 +# 809| r809_15(glval) = Convert : r809_3 +# 809| r809_16(Base &) = CopyValue : r809_15 +# 809| r809_17(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_16 +# 809| m809_18(unknown) = ^CallSideEffect : ~m809_11 +# 809| m809_19(unknown) = Chi : total:m809_11, partial:m809_18 +# 809| v809_20(void) = ^IndirectReadSideEffect[-1] : &:r809_1, m808_12 +# 809| v809_21(void) = ^BufferReadSideEffect[0] : &:r809_16, ~m809_14 +# 809| m809_22(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 +# 809| m809_23(Base) = Chi : total:m808_12, partial:m809_22 +# 809| r809_24(glval) = CopyValue : r809_17 +# 810| r810_1(glval) = VariableAddress[b] : +# 810| r810_2(glval) = FunctionAddress[operator=] : +# 810| r810_3(glval) = VariableAddress[#temp810:7] : +# 810| m810_4(Base) = Uninitialized[#temp810:7] : &:r810_3 +# 810| r810_5(glval) = FunctionAddress[Base] : +# 810| r810_6(glval) = VariableAddress[m] : +# 810| r810_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_6 +# 810| r810_8(Base &) = CopyValue : r810_7 +# 810| v810_9(void) = Call[Base] : func:r810_5, this:r810_3, 0:r810_8 +# 810| m810_10(unknown) = ^CallSideEffect : ~m809_19 +# 810| m810_11(unknown) = Chi : total:m809_19, partial:m810_10 +# 810| v810_12(void) = ^BufferReadSideEffect[0] : &:r810_8, ~m801_8 +# 810| m810_13(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_3 +# 810| m810_14(Base) = Chi : total:m810_4, partial:m810_13 +# 810| r810_15(glval) = Convert : r810_3 +# 810| r810_16(Base &) = CopyValue : r810_15 +# 810| r810_17(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_16 +# 810| m810_18(unknown) = ^CallSideEffect : ~m810_11 +# 810| m810_19(unknown) = Chi : total:m810_11, partial:m810_18 +# 810| v810_20(void) = ^IndirectReadSideEffect[-1] : &:r810_1, m809_23 +# 810| v810_21(void) = ^BufferReadSideEffect[0] : &:r810_16, ~m810_14 +# 810| m810_22(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 +# 810| m810_23(Base) = Chi : total:m809_23, partial:m810_22 +# 810| r810_24(glval) = CopyValue : r810_17 +# 811| r811_1(glval) = VariableAddress[pm] : +# 811| r811_2(Middle *) = Load[pm] : &:r811_1, m805_4 +# 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2 +# 811| r811_4(glval) = VariableAddress[pb] : +# 811| m811_5(Base *) = Store[pb] : &:r811_4, r811_3 +# 812| r812_1(glval) = VariableAddress[pm] : +# 812| r812_2(Middle *) = Load[pm] : &:r812_1, m805_4 +# 812| r812_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r812_2 +# 812| r812_4(glval) = VariableAddress[pb] : +# 812| m812_5(Base *) = Store[pb] : &:r812_4, r812_3 +# 813| r813_1(glval) = VariableAddress[pm] : +# 813| r813_2(Middle *) = Load[pm] : &:r813_1, m805_4 +# 813| r813_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r813_2 +# 813| r813_4(glval) = VariableAddress[pb] : +# 813| m813_5(Base *) = Store[pb] : &:r813_4, r813_3 +# 814| r814_1(glval) = VariableAddress[pm] : +# 814| r814_2(Middle *) = Load[pm] : &:r814_1, m805_4 +# 814| r814_3(Base *) = Convert : r814_2 +# 814| r814_4(glval) = VariableAddress[pb] : +# 814| m814_5(Base *) = Store[pb] : &:r814_4, r814_3 +# 816| r816_1(glval) = VariableAddress[m] : +# 816| r816_2(glval) = FunctionAddress[operator=] : +# 816| r816_3(glval) = VariableAddress[b] : +# 816| r816_4(glval) = ConvertToDerived[Middle : Base] : r816_3 +# 816| r816_5(glval) = Convert : r816_4 +# 816| r816_6(Middle &) = CopyValue : r816_5 +# 816| r816_7(Middle &) = Call[operator=] : func:r816_2, this:r816_1, 0:r816_6 +# 816| m816_8(unknown) = ^CallSideEffect : ~m810_19 +# 816| m816_9(unknown) = Chi : total:m810_19, partial:m816_8 +# 816| v816_10(void) = ^IndirectReadSideEffect[-1] : &:r816_1, m801_8 +# 816| v816_11(void) = ^BufferReadSideEffect[0] : &:r816_6, ~m810_23 +# 816| m816_12(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r816_1 +# 816| m816_13(Middle) = Chi : total:m801_8, partial:m816_12 +# 816| r816_14(glval) = CopyValue : r816_7 +# 817| r817_1(glval) = VariableAddress[m] : +# 817| r817_2(glval) = FunctionAddress[operator=] : +# 817| r817_3(glval) = VariableAddress[b] : +# 817| r817_4(glval) = ConvertToDerived[Middle : Base] : r817_3 +# 817| r817_5(glval) = Convert : r817_4 +# 817| r817_6(Middle &) = CopyValue : r817_5 +# 817| r817_7(Middle &) = Call[operator=] : func:r817_2, this:r817_1, 0:r817_6 +# 817| m817_8(unknown) = ^CallSideEffect : ~m816_9 +# 817| m817_9(unknown) = Chi : total:m816_9, partial:m817_8 +# 817| v817_10(void) = ^IndirectReadSideEffect[-1] : &:r817_1, m816_13 +# 817| v817_11(void) = ^BufferReadSideEffect[0] : &:r817_6, ~m810_23 +# 817| m817_12(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r817_1 +# 817| m817_13(Middle) = Chi : total:m816_13, partial:m817_12 +# 817| r817_14(glval) = CopyValue : r817_7 +# 818| r818_1(glval) = VariableAddress[pb] : +# 818| r818_2(Base *) = Load[pb] : &:r818_1, m814_5 +# 818| r818_3(Middle *) = ConvertToDerived[Middle : Base] : r818_2 +# 818| r818_4(glval) = VariableAddress[pm] : +# 818| m818_5(Middle *) = Store[pm] : &:r818_4, r818_3 +# 819| r819_1(glval) = VariableAddress[pb] : +# 819| r819_2(Base *) = Load[pb] : &:r819_1, m814_5 +# 819| r819_3(Middle *) = ConvertToDerived[Middle : Base] : r819_2 +# 819| r819_4(glval) = VariableAddress[pm] : +# 819| m819_5(Middle *) = Store[pm] : &:r819_4, r819_3 +# 820| r820_1(glval) = VariableAddress[pb] : +# 820| r820_2(Base *) = Load[pb] : &:r820_1, m814_5 +# 820| r820_3(Middle *) = Convert : r820_2 +# 820| r820_4(glval) = VariableAddress[pm] : +# 820| m820_5(Middle *) = Store[pm] : &:r820_4, r820_3 +# 822| r822_1(glval) = VariableAddress[b] : +# 822| r822_2(glval) = FunctionAddress[operator=] : +# 822| r822_3(glval) = VariableAddress[d] : +# 822| r822_4(glval) = ConvertToNonVirtualBase[Derived : Middle] : r822_3 +# 822| r822_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r822_4 +# 822| r822_6(Base &) = CopyValue : r822_5 +# 822| r822_7(Base &) = Call[operator=] : func:r822_2, this:r822_1, 0:r822_6 +# 822| m822_8(unknown) = ^CallSideEffect : ~m817_9 +# 822| m822_9(unknown) = Chi : total:m817_9, partial:m822_8 +# 822| v822_10(void) = ^IndirectReadSideEffect[-1] : &:r822_1, m810_23 +# 822| v822_11(void) = ^BufferReadSideEffect[0] : &:r822_6, ~m802_8 +# 822| m822_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r822_1 +# 822| m822_13(Base) = Chi : total:m810_23, partial:m822_12 +# 822| r822_14(glval) = CopyValue : r822_7 +# 823| r823_1(glval) = VariableAddress[b] : +# 823| r823_2(glval) = FunctionAddress[operator=] : +# 823| r823_3(glval) = VariableAddress[#temp823:7] : +# 823| m823_4(Base) = Uninitialized[#temp823:7] : &:r823_3 +# 823| r823_5(glval) = FunctionAddress[Base] : +# 823| r823_6(glval) = VariableAddress[d] : +# 823| r823_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_6 +# 823| r823_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_7 +# 823| r823_9(Base &) = CopyValue : r823_8 +# 823| v823_10(void) = Call[Base] : func:r823_5, this:r823_3, 0:r823_9 +# 823| m823_11(unknown) = ^CallSideEffect : ~m822_9 +# 823| m823_12(unknown) = Chi : total:m822_9, partial:m823_11 +# 823| v823_13(void) = ^BufferReadSideEffect[0] : &:r823_9, ~m802_8 +# 823| m823_14(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_3 +# 823| m823_15(Base) = Chi : total:m823_4, partial:m823_14 +# 823| r823_16(glval) = Convert : r823_3 +# 823| r823_17(Base &) = CopyValue : r823_16 +# 823| r823_18(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_17 +# 823| m823_19(unknown) = ^CallSideEffect : ~m823_12 +# 823| m823_20(unknown) = Chi : total:m823_12, partial:m823_19 +# 823| v823_21(void) = ^IndirectReadSideEffect[-1] : &:r823_1, m822_13 +# 823| v823_22(void) = ^BufferReadSideEffect[0] : &:r823_17, ~m823_15 +# 823| m823_23(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 +# 823| m823_24(Base) = Chi : total:m822_13, partial:m823_23 +# 823| r823_25(glval) = CopyValue : r823_18 +# 824| r824_1(glval) = VariableAddress[b] : +# 824| r824_2(glval) = FunctionAddress[operator=] : +# 824| r824_3(glval) = VariableAddress[#temp824:7] : +# 824| m824_4(Base) = Uninitialized[#temp824:7] : &:r824_3 +# 824| r824_5(glval) = FunctionAddress[Base] : +# 824| r824_6(glval) = VariableAddress[d] : +# 824| r824_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_6 +# 824| r824_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_7 +# 824| r824_9(Base &) = CopyValue : r824_8 +# 824| v824_10(void) = Call[Base] : func:r824_5, this:r824_3, 0:r824_9 +# 824| m824_11(unknown) = ^CallSideEffect : ~m823_20 +# 824| m824_12(unknown) = Chi : total:m823_20, partial:m824_11 +# 824| v824_13(void) = ^BufferReadSideEffect[0] : &:r824_9, ~m802_8 +# 824| m824_14(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_3 +# 824| m824_15(Base) = Chi : total:m824_4, partial:m824_14 +# 824| r824_16(glval) = Convert : r824_3 +# 824| r824_17(Base &) = CopyValue : r824_16 +# 824| r824_18(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_17 +# 824| m824_19(unknown) = ^CallSideEffect : ~m824_12 +# 824| m824_20(unknown) = Chi : total:m824_12, partial:m824_19 +# 824| v824_21(void) = ^IndirectReadSideEffect[-1] : &:r824_1, m823_24 +# 824| v824_22(void) = ^BufferReadSideEffect[0] : &:r824_17, ~m824_15 +# 824| m824_23(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 +# 824| m824_24(Base) = Chi : total:m823_24, partial:m824_23 +# 824| r824_25(glval) = CopyValue : r824_18 +# 825| r825_1(glval) = VariableAddress[pd] : +# 825| r825_2(Derived *) = Load[pd] : &:r825_1, m806_4 +# 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2 +# 825| r825_4(Base *) = ConvertToNonVirtualBase[Middle : Base] : r825_3 +# 825| r825_5(glval) = VariableAddress[pb] : +# 825| m825_6(Base *) = Store[pb] : &:r825_5, r825_4 +# 826| r826_1(glval) = VariableAddress[pd] : +# 826| r826_2(Derived *) = Load[pd] : &:r826_1, m806_4 +# 826| r826_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r826_2 +# 826| r826_4(Base *) = ConvertToNonVirtualBase[Middle : Base] : r826_3 +# 826| r826_5(glval) = VariableAddress[pb] : +# 826| m826_6(Base *) = Store[pb] : &:r826_5, r826_4 +# 827| r827_1(glval) = VariableAddress[pd] : +# 827| r827_2(Derived *) = Load[pd] : &:r827_1, m806_4 +# 827| r827_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r827_2 +# 827| r827_4(Base *) = ConvertToNonVirtualBase[Middle : Base] : r827_3 +# 827| r827_5(glval) = VariableAddress[pb] : +# 827| m827_6(Base *) = Store[pb] : &:r827_5, r827_4 +# 828| r828_1(glval) = VariableAddress[pd] : +# 828| r828_2(Derived *) = Load[pd] : &:r828_1, m806_4 +# 828| r828_3(Base *) = Convert : r828_2 +# 828| r828_4(glval) = VariableAddress[pb] : +# 828| m828_5(Base *) = Store[pb] : &:r828_4, r828_3 +# 830| r830_1(glval) = VariableAddress[d] : +# 830| r830_2(glval) = FunctionAddress[operator=] : +# 830| r830_3(glval) = VariableAddress[b] : +# 830| r830_4(glval) = ConvertToDerived[Middle : Base] : r830_3 +# 830| r830_5(glval) = ConvertToDerived[Derived : Middle] : r830_4 +# 830| r830_6(glval) = Convert : r830_5 +# 830| r830_7(Derived &) = CopyValue : r830_6 +# 830| r830_8(Derived &) = Call[operator=] : func:r830_2, this:r830_1, 0:r830_7 +# 830| m830_9(unknown) = ^CallSideEffect : ~m824_20 +# 830| m830_10(unknown) = Chi : total:m824_20, partial:m830_9 +# 830| v830_11(void) = ^IndirectReadSideEffect[-1] : &:r830_1, m802_8 +# 830| v830_12(void) = ^BufferReadSideEffect[0] : &:r830_7, ~m824_24 +# 830| m830_13(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r830_1 +# 830| m830_14(Derived) = Chi : total:m802_8, partial:m830_13 +# 830| r830_15(glval) = CopyValue : r830_8 +# 831| r831_1(glval) = VariableAddress[d] : +# 831| r831_2(glval) = FunctionAddress[operator=] : +# 831| r831_3(glval) = VariableAddress[b] : +# 831| r831_4(glval) = ConvertToDerived[Middle : Base] : r831_3 +# 831| r831_5(glval) = ConvertToDerived[Derived : Middle] : r831_4 +# 831| r831_6(glval) = Convert : r831_5 +# 831| r831_7(Derived &) = CopyValue : r831_6 +# 831| r831_8(Derived &) = Call[operator=] : func:r831_2, this:r831_1, 0:r831_7 +# 831| m831_9(unknown) = ^CallSideEffect : ~m830_10 +# 831| m831_10(unknown) = Chi : total:m830_10, partial:m831_9 +# 831| v831_11(void) = ^IndirectReadSideEffect[-1] : &:r831_1, m830_14 +# 831| v831_12(void) = ^BufferReadSideEffect[0] : &:r831_7, ~m824_24 +# 831| m831_13(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r831_1 +# 831| m831_14(Derived) = Chi : total:m830_14, partial:m831_13 +# 831| r831_15(glval) = CopyValue : r831_8 +# 832| r832_1(glval) = VariableAddress[pb] : +# 832| r832_2(Base *) = Load[pb] : &:r832_1, m828_5 +# 832| r832_3(Middle *) = ConvertToDerived[Middle : Base] : r832_2 +# 832| r832_4(Derived *) = ConvertToDerived[Derived : Middle] : r832_3 +# 832| r832_5(glval) = VariableAddress[pd] : +# 832| m832_6(Derived *) = Store[pd] : &:r832_5, r832_4 +# 833| r833_1(glval) = VariableAddress[pb] : +# 833| r833_2(Base *) = Load[pb] : &:r833_1, m828_5 +# 833| r833_3(Middle *) = ConvertToDerived[Middle : Base] : r833_2 +# 833| r833_4(Derived *) = ConvertToDerived[Derived : Middle] : r833_3 +# 833| r833_5(glval) = VariableAddress[pd] : +# 833| m833_6(Derived *) = Store[pd] : &:r833_5, r833_4 +# 834| r834_1(glval) = VariableAddress[pb] : +# 834| r834_2(Base *) = Load[pb] : &:r834_1, m828_5 +# 834| r834_3(Derived *) = Convert : r834_2 +# 834| r834_4(glval) = VariableAddress[pd] : +# 834| m834_5(Derived *) = Store[pd] : &:r834_4, r834_3 +# 836| r836_1(glval) = VariableAddress[pmv] : +# 836| r836_2(MiddleVB1 *) = Constant[0] : +# 836| m836_3(MiddleVB1 *) = Store[pmv] : &:r836_1, r836_2 +# 837| r837_1(glval) = VariableAddress[pdv] : +# 837| r837_2(DerivedVB *) = Constant[0] : +# 837| m837_3(DerivedVB *) = Store[pdv] : &:r837_1, r837_2 +# 838| r838_1(glval) = VariableAddress[pmv] : +# 838| r838_2(MiddleVB1 *) = Load[pmv] : &:r838_1, m836_3 +# 838| r838_3(Base *) = ConvertToVirtualBase[MiddleVB1 : Base] : r838_2 +# 838| r838_4(glval) = VariableAddress[pb] : +# 838| m838_5(Base *) = Store[pb] : &:r838_4, r838_3 +# 839| r839_1(glval) = VariableAddress[pdv] : +# 839| r839_2(DerivedVB *) = Load[pdv] : &:r839_1, m837_3 +# 839| r839_3(Base *) = ConvertToVirtualBase[DerivedVB : Base] : r839_2 +# 839| r839_4(glval) = VariableAddress[pb] : +# 839| m839_5(Base *) = Store[pb] : &:r839_4, r839_3 +# 840| v840_1(void) = NoOp : +# 799| v799_5(void) = ReturnVoid : +# 799| v799_6(void) = AliasedUse : ~m831_10 +# 799| v799_7(void) = ExitFunction : + +# 842| void PolymorphicBase::PolymorphicBase() +# 842| Block 0 +# 842| v842_1(void) = EnterFunction : +# 842| m842_2(unknown) = AliasedDefinition : +# 842| m842_3(unknown) = InitializeNonLocal : +# 842| m842_4(unknown) = Chi : total:m842_2, partial:m842_3 +# 842| r842_5(glval) = VariableAddress[#this] : +# 842| m842_6(glval) = InitializeParameter[#this] : &:r842_5 +# 842| r842_7(glval) = Load[#this] : &:r842_5, m842_6 +# 842| m842_8(PolymorphicBase) = InitializeIndirection[#this] : &:r842_7 +# 842| v842_9(void) = NoOp : +# 842| v842_10(void) = ReturnIndirection[#this] : &:r842_7, m842_8 +# 842| v842_11(void) = ReturnVoid : +# 842| v842_12(void) = AliasedUse : m842_3 +# 842| v842_13(void) = ExitFunction : + +# 846| void PolymorphicDerived::PolymorphicDerived() +# 846| Block 0 +# 846| v846_1(void) = EnterFunction : +# 846| m846_2(unknown) = AliasedDefinition : +# 846| m846_3(unknown) = InitializeNonLocal : +# 846| m846_4(unknown) = Chi : total:m846_2, partial:m846_3 +# 846| r846_5(glval) = VariableAddress[#this] : +# 846| m846_6(glval) = InitializeParameter[#this] : &:r846_5 +# 846| r846_7(glval) = Load[#this] : &:r846_5, m846_6 +# 846| m846_8(PolymorphicDerived) = InitializeIndirection[#this] : &:r846_7 +# 846| r846_9(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : m846_6 +# 846| r846_10(glval) = FunctionAddress[PolymorphicBase] : +# 846| v846_11(void) = Call[PolymorphicBase] : func:r846_10, this:r846_9 +# 846| m846_12(unknown) = ^CallSideEffect : ~m846_4 +# 846| m846_13(unknown) = Chi : total:m846_4, partial:m846_12 +# 846| m846_14(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r846_9 +# 846| m846_15(unknown) = Chi : total:m846_8, partial:m846_14 +# 846| v846_16(void) = NoOp : +# 846| v846_17(void) = ReturnIndirection[#this] : &:r846_7, m846_15 +# 846| v846_18(void) = ReturnVoid : +# 846| v846_19(void) = AliasedUse : ~m846_13 +# 846| v846_20(void) = ExitFunction : + +# 846| void PolymorphicDerived::~PolymorphicDerived() +# 846| Block 0 +# 846| v846_1(void) = EnterFunction : +# 846| m846_2(unknown) = AliasedDefinition : +# 846| m846_3(unknown) = InitializeNonLocal : +# 846| m846_4(unknown) = Chi : total:m846_2, partial:m846_3 +# 846| r846_5(glval) = VariableAddress[#this] : +# 846| m846_6(glval) = InitializeParameter[#this] : &:r846_5 +# 846| r846_7(glval) = Load[#this] : &:r846_5, m846_6 +# 846| m846_8(PolymorphicDerived) = InitializeIndirection[#this] : &:r846_7 +#-----| v0_1(void) = NoOp : +# 846| r846_9(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : m846_6 +# 846| r846_10(glval) = FunctionAddress[~PolymorphicBase] : +# 846| v846_11(void) = Call[~PolymorphicBase] : func:r846_10, this:r846_9 +# 846| m846_12(unknown) = ^CallSideEffect : ~m846_4 +# 846| m846_13(unknown) = Chi : total:m846_4, partial:m846_12 +# 846| v846_14(void) = ReturnIndirection[#this] : &:r846_7, m846_8 +# 846| v846_15(void) = ReturnVoid : +# 846| v846_16(void) = AliasedUse : ~m846_13 +# 846| v846_17(void) = ExitFunction : + +# 849| void DynamicCast() +# 849| Block 0 +# 849| v849_1(void) = EnterFunction : +# 849| m849_2(unknown) = AliasedDefinition : +# 849| m849_3(unknown) = InitializeNonLocal : +# 849| m849_4(unknown) = Chi : total:m849_2, partial:m849_3 +# 850| r850_1(glval) = VariableAddress[b] : +# 850| m850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 +# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : +# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 +# 850| m850_5(unknown) = ^CallSideEffect : ~m849_4 +# 850| m850_6(unknown) = Chi : total:m849_4, partial:m850_5 +# 850| m850_7(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +# 850| m850_8(PolymorphicBase) = Chi : total:m850_2, partial:m850_7 +# 851| r851_1(glval) = VariableAddress[d] : +# 851| m851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 +# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 +# 851| m851_5(unknown) = ^CallSideEffect : ~m850_6 +# 851| m851_6(unknown) = Chi : total:m850_6, partial:m851_5 +# 851| m851_7(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 +# 851| m851_8(PolymorphicDerived) = Chi : total:m851_2, partial:m851_7 +# 853| r853_1(glval) = VariableAddress[pb] : +# 853| r853_2(glval) = VariableAddress[b] : +# 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 +# 853| m853_4(PolymorphicBase *) = Store[pb] : &:r853_1, r853_3 +# 854| r854_1(glval) = VariableAddress[pd] : +# 854| r854_2(glval) = VariableAddress[d] : +# 854| r854_3(PolymorphicDerived *) = CopyValue : r854_2 +# 854| m854_4(PolymorphicDerived *) = Store[pd] : &:r854_1, r854_3 +# 857| r857_1(glval) = VariableAddress[pd] : +# 857| r857_2(PolymorphicDerived *) = Load[pd] : &:r857_1, m854_4 +# 857| r857_3(PolymorphicBase *) = CheckedConvertOrNull : r857_2 +# 857| r857_4(glval) = VariableAddress[pb] : +# 857| m857_5(PolymorphicBase *) = Store[pb] : &:r857_4, r857_3 +# 858| r858_1(glval) = VariableAddress[rb] : +# 858| r858_2(glval) = VariableAddress[d] : +# 858| r858_3(glval) = CheckedConvertOrThrow : r858_2 +# 858| r858_4(PolymorphicBase &) = CopyValue : r858_3 +# 858| m858_5(PolymorphicBase &) = Store[rb] : &:r858_1, r858_4 +# 860| r860_1(glval) = VariableAddress[pb] : +# 860| r860_2(PolymorphicBase *) = Load[pb] : &:r860_1, m857_5 +# 860| r860_3(PolymorphicDerived *) = CheckedConvertOrNull : r860_2 +# 860| r860_4(glval) = VariableAddress[pd] : +# 860| m860_5(PolymorphicDerived *) = Store[pd] : &:r860_4, r860_3 +# 861| r861_1(glval) = VariableAddress[rd] : +# 861| r861_2(glval) = VariableAddress[b] : +# 861| r861_3(glval) = CheckedConvertOrThrow : r861_2 +# 861| r861_4(PolymorphicDerived &) = CopyValue : r861_3 +# 861| m861_5(PolymorphicDerived &) = Store[rd] : &:r861_1, r861_4 +# 863| r863_1(glval) = VariableAddress[pv] : +# 863| r863_2(glval) = VariableAddress[pb] : +# 863| r863_3(PolymorphicBase *) = Load[pb] : &:r863_2, m857_5 +# 863| r863_4(void *) = CompleteObjectAddress : r863_3 +# 863| m863_5(void *) = Store[pv] : &:r863_1, r863_4 +# 864| r864_1(glval) = VariableAddress[pcv] : +# 864| r864_2(glval) = VariableAddress[pd] : +# 864| r864_3(PolymorphicDerived *) = Load[pd] : &:r864_2, m860_5 +# 864| r864_4(void *) = CompleteObjectAddress : r864_3 +# 864| m864_5(void *) = Store[pcv] : &:r864_1, r864_4 +# 865| v865_1(void) = NoOp : +# 849| v849_5(void) = ReturnVoid : +# 849| v849_6(void) = AliasedUse : ~m851_6 +# 849| v849_7(void) = ExitFunction : + +# 867| void String::String() +# 867| Block 0 +# 867| v867_1(void) = EnterFunction : +# 867| m867_2(unknown) = AliasedDefinition : +# 867| m867_3(unknown) = InitializeNonLocal : +# 867| m867_4(unknown) = Chi : total:m867_2, partial:m867_3 +# 867| r867_5(glval) = VariableAddress[#this] : +# 867| m867_6(glval) = InitializeParameter[#this] : &:r867_5 +# 867| r867_7(glval) = Load[#this] : &:r867_5, m867_6 +# 867| m867_8(String) = InitializeIndirection[#this] : &:r867_7 +# 868| r868_1(glval) = FunctionAddress[String] : +# 868| r868_2(glval) = StringConstant[""] : +# 868| r868_3(char *) = Convert : r868_2 +# 868| v868_4(void) = Call[String] : func:r868_1, this:m867_6, 0:r868_3 +# 868| m868_5(unknown) = ^CallSideEffect : ~m867_4 +# 868| m868_6(unknown) = Chi : total:m867_4, partial:m868_5 +# 868| v868_7(void) = ^BufferReadSideEffect[0] : &:r868_3, ~m867_3 +# 868| m868_8(String) = ^IndirectMayWriteSideEffect[-1] : &:m867_6 +# 868| m868_9(unknown) = Chi : total:m867_8, partial:m868_8 +# 869| v869_1(void) = NoOp : +# 867| v867_9(void) = ReturnIndirection[#this] : &:r867_7, m868_9 +# 867| v867_10(void) = ReturnVoid : +# 867| v867_11(void) = AliasedUse : ~m868_6 +# 867| v867_12(void) = ExitFunction : + +# 871| void ArrayConversions() +# 871| Block 0 +# 871| v871_1(void) = EnterFunction : +# 871| m871_2(unknown) = AliasedDefinition : +# 871| m871_3(unknown) = InitializeNonLocal : +# 871| m871_4(unknown) = Chi : total:m871_2, partial:m871_3 +# 872| r872_1(glval) = VariableAddress[a] : +# 872| m872_2(char[5]) = Uninitialized[a] : &:r872_1 +# 873| r873_1(glval) = VariableAddress[p] : +# 873| r873_2(glval) = VariableAddress[a] : +# 873| r873_3(char *) = Convert : r873_2 +# 873| r873_4(char *) = Convert : r873_3 +# 873| m873_5(char *) = Store[p] : &:r873_1, r873_4 +# 874| r874_1(glval) = StringConstant["test"] : +# 874| r874_2(char *) = Convert : r874_1 +# 874| r874_3(glval) = VariableAddress[p] : +# 874| m874_4(char *) = Store[p] : &:r874_3, r874_2 +# 875| r875_1(glval) = VariableAddress[a] : +# 875| r875_2(char *) = Convert : r875_1 +# 875| r875_3(int) = Constant[0] : +# 875| r875_4(glval) = PointerAdd[1] : r875_2, r875_3 +# 875| r875_5(char *) = CopyValue : r875_4 +# 875| r875_6(char *) = Convert : r875_5 +# 875| r875_7(glval) = VariableAddress[p] : +# 875| m875_8(char *) = Store[p] : &:r875_7, r875_6 +# 876| r876_1(glval) = StringConstant["test"] : +# 876| r876_2(char *) = Convert : r876_1 +# 876| r876_3(int) = Constant[0] : +# 876| r876_4(glval) = PointerAdd[1] : r876_2, r876_3 +# 876| r876_5(char *) = CopyValue : r876_4 +# 876| r876_6(glval) = VariableAddress[p] : +# 876| m876_7(char *) = Store[p] : &:r876_6, r876_5 +# 877| r877_1(glval) = VariableAddress[ra] : +# 877| r877_2(glval) = VariableAddress[a] : +# 877| r877_3(char(&)[5]) = CopyValue : r877_2 +# 877| m877_4(char(&)[5]) = Store[ra] : &:r877_1, r877_3 +# 878| r878_1(glval) = VariableAddress[rs] : +# 878| r878_2(glval) = StringConstant["test"] : +# 878| r878_3(char(&)[5]) = CopyValue : r878_2 +# 878| m878_4(char(&)[5]) = Store[rs] : &:r878_1, r878_3 +# 879| r879_1(glval) = VariableAddress[pa] : +# 879| r879_2(glval) = VariableAddress[a] : +# 879| r879_3(char(*)[5]) = CopyValue : r879_2 +# 879| r879_4(char(*)[5]) = Convert : r879_3 +# 879| m879_5(char(*)[5]) = Store[pa] : &:r879_1, r879_4 +# 880| r880_1(glval) = StringConstant["test"] : +# 880| r880_2(char(*)[5]) = CopyValue : r880_1 +# 880| r880_3(glval) = VariableAddress[pa] : +# 880| m880_4(char(*)[5]) = Store[pa] : &:r880_3, r880_2 +# 881| v881_1(void) = NoOp : +# 871| v871_5(void) = ReturnVoid : +# 871| v871_6(void) = AliasedUse : m871_3 +# 871| v871_7(void) = ExitFunction : + +# 883| void FuncPtrConversions(int(*)(int), void*) +# 883| Block 0 +# 883| v883_1(void) = EnterFunction : +# 883| m883_2(unknown) = AliasedDefinition : +# 883| m883_3(unknown) = InitializeNonLocal : +# 883| m883_4(unknown) = Chi : total:m883_2, partial:m883_3 +# 883| r883_5(glval<..(*)(..)>) = VariableAddress[pfn] : +# 883| m883_6(..(*)(..)) = InitializeParameter[pfn] : &:r883_5 +# 883| r883_7(glval) = VariableAddress[p] : +# 883| m883_8(void *) = InitializeParameter[p] : &:r883_7 +# 883| r883_9(void *) = Load[p] : &:r883_7, m883_8 +# 883| m883_10(unknown) = InitializeIndirection[p] : &:r883_9 +# 884| r884_1(glval<..(*)(..)>) = VariableAddress[pfn] : +# 884| r884_2(..(*)(..)) = Load[pfn] : &:r884_1, m883_6 +# 884| r884_3(void *) = Convert : r884_2 +# 884| r884_4(glval) = VariableAddress[p] : +# 884| m884_5(void *) = Store[p] : &:r884_4, r884_3 +# 885| r885_1(glval) = VariableAddress[p] : +# 885| r885_2(void *) = Load[p] : &:r885_1, m884_5 +# 885| r885_3(..(*)(..)) = Convert : r885_2 +# 885| r885_4(glval<..(*)(..)>) = VariableAddress[pfn] : +# 885| m885_5(..(*)(..)) = Store[pfn] : &:r885_4, r885_3 +# 886| v886_1(void) = NoOp : +# 883| v883_11(void) = ReturnIndirection[p] : &:r883_9, m883_10 +# 883| v883_12(void) = ReturnVoid : +# 883| v883_13(void) = AliasedUse : m883_3 +# 883| v883_14(void) = ExitFunction : + +# 888| void VAListUsage(int, __va_list_tag[1]) +# 888| Block 0 +# 888| v888_1(void) = EnterFunction : +# 888| m888_2(unknown) = AliasedDefinition : +# 888| m888_3(unknown) = InitializeNonLocal : +# 888| m888_4(unknown) = Chi : total:m888_2, partial:m888_3 +# 888| r888_5(glval) = VariableAddress[x] : +# 888| m888_6(int) = InitializeParameter[x] : &:r888_5 +# 888| r888_7(glval<__va_list_tag *>) = VariableAddress[args] : +# 888| m888_8(__va_list_tag *) = InitializeParameter[args] : &:r888_7 +# 888| r888_9(__va_list_tag *) = Load[args] : &:r888_7, m888_8 +# 888| m888_10(unknown) = InitializeIndirection[args] : &:r888_9 +# 889| r889_1(glval<__va_list_tag[1]>) = VariableAddress[args2] : +# 889| m889_2(__va_list_tag[1]) = Uninitialized[args2] : &:r889_1 +# 890| r890_1(glval<__va_list_tag *>) = VariableAddress[args] : +# 890| r890_2(__va_list_tag *) = Load[args] : &:r890_1, m888_8 +# 890| r890_3(__va_list_tag) = Load[?] : &:r890_2, ~m888_10 +# 890| r890_4(glval<__va_list_tag[1]>) = VariableAddress[args2] : +# 890| r890_5(__va_list_tag *) = Convert : r890_4 +# 890| m890_6(__va_list_tag) = Store[?] : &:r890_5, r890_3 +# 891| r891_1(glval) = VariableAddress[d] : +# 891| r891_2(glval<__va_list_tag *>) = VariableAddress[args] : +# 891| r891_3(__va_list_tag *) = Load[args] : &:r891_2, m888_8 +# 891| r891_4(__va_list_tag) = Load[?] : &:r891_3, ~m888_10 +# 891| r891_5(glval) = VarArg : r891_4 +# 891| r891_6(__va_list_tag) = NextVarArg : r891_4 +# 891| m891_7(__va_list_tag) = Store[?] : &:r891_3, r891_6 +# 891| m891_8(unknown) = Chi : total:m888_10, partial:m891_7 +# 891| r891_9(double) = Load[?] : &:r891_5, ~m888_4 +# 891| m891_10(double) = Store[d] : &:r891_1, r891_9 +# 892| r892_1(glval) = VariableAddress[f] : +# 892| r892_2(glval<__va_list_tag *>) = VariableAddress[args] : +# 892| r892_3(__va_list_tag *) = Load[args] : &:r892_2, m888_8 +# 892| r892_4(__va_list_tag) = Load[?] : &:r892_3, m891_7 +# 892| r892_5(glval) = VarArg : r892_4 +# 892| r892_6(__va_list_tag) = NextVarArg : r892_4 +# 892| m892_7(__va_list_tag) = Store[?] : &:r892_3, r892_6 +# 892| m892_8(unknown) = Chi : total:m891_8, partial:m892_7 +# 892| r892_9(int) = Load[?] : &:r892_5, ~m888_4 +# 892| r892_10(float) = Convert : r892_9 +# 892| m892_11(float) = Store[f] : &:r892_1, r892_10 +# 893| r893_1(glval<__va_list_tag[1]>) = VariableAddress[args2] : +# 893| r893_2(__va_list_tag *) = Convert : r893_1 +# 893| v893_3(void) = VarArgsEnd : r893_2 +# 894| v894_1(void) = NoOp : +# 888| v888_11(void) = ReturnIndirection[args] : &:r888_9, m892_8 +# 888| v888_12(void) = ReturnVoid : +# 888| v888_13(void) = AliasedUse : m888_3 +# 888| v888_14(void) = ExitFunction : + +# 896| void VarArgUsage(int) +# 896| Block 0 +# 896| v896_1(void) = EnterFunction : +# 896| m896_2(unknown) = AliasedDefinition : +# 896| m896_3(unknown) = InitializeNonLocal : +# 896| m896_4(unknown) = Chi : total:m896_2, partial:m896_3 +# 896| r896_5(glval) = VariableAddress[x] : +# 896| m896_6(int) = InitializeParameter[x] : &:r896_5 +# 896| r896_7(glval) = VariableAddress[#ellipsis] : +# 896| m896_8(unknown[11]) = InitializeParameter[#ellipsis] : &:r896_7 +# 896| r896_9(unknown[11]) = Load[#ellipsis] : &:r896_7, m896_8 +# 896| mu896_10(unknown) = InitializeIndirection[#ellipsis] : &:r896_9 +# 897| r897_1(glval<__va_list_tag[1]>) = VariableAddress[args] : +# 897| m897_2(__va_list_tag[1]) = Uninitialized[args] : &:r897_1 +# 899| r899_1(glval) = VariableAddress[#ellipsis] : +# 899| r899_2(__va_list_tag) = VarArgsStart : r899_1 +# 899| r899_3(glval<__va_list_tag[1]>) = VariableAddress[args] : +# 899| r899_4(__va_list_tag *) = Convert : r899_3 +# 899| m899_5(__va_list_tag) = Store[?] : &:r899_4, r899_2 +# 900| r900_1(glval<__va_list_tag[1]>) = VariableAddress[args2] : +# 900| m900_2(__va_list_tag[1]) = Uninitialized[args2] : &:r900_1 +# 901| r901_1(glval<__va_list_tag[1]>) = VariableAddress[args] : +# 901| r901_2(__va_list_tag *) = Convert : r901_1 +# 901| r901_3(__va_list_tag) = Load[?] : &:r901_2, m899_5 +# 901| r901_4(glval<__va_list_tag[1]>) = VariableAddress[args2] : +# 901| r901_5(__va_list_tag *) = Convert : r901_4 +# 901| m901_6(__va_list_tag) = Store[?] : &:r901_5, r901_3 +# 902| r902_1(glval) = VariableAddress[d] : +# 902| r902_2(glval<__va_list_tag[1]>) = VariableAddress[args] : +# 902| r902_3(__va_list_tag *) = Convert : r902_2 +# 902| r902_4(__va_list_tag) = Load[?] : &:r902_3, m899_5 +# 902| r902_5(glval) = VarArg : r902_4 +# 902| r902_6(__va_list_tag) = NextVarArg : r902_4 +# 902| m902_7(__va_list_tag) = Store[?] : &:r902_3, r902_6 +# 902| r902_8(double) = Load[?] : &:r902_5, ~m896_4 +# 902| m902_9(double) = Store[d] : &:r902_1, r902_8 +# 903| r903_1(glval) = VariableAddress[f] : +# 903| r903_2(glval<__va_list_tag[1]>) = VariableAddress[args] : +# 903| r903_3(__va_list_tag *) = Convert : r903_2 +# 903| r903_4(__va_list_tag) = Load[?] : &:r903_3, m902_7 +# 903| r903_5(glval) = VarArg : r903_4 +# 903| r903_6(__va_list_tag) = NextVarArg : r903_4 +# 903| m903_7(__va_list_tag) = Store[?] : &:r903_3, r903_6 +# 903| r903_8(int) = Load[?] : &:r903_5, ~m896_4 +# 903| r903_9(float) = Convert : r903_8 +# 903| m903_10(float) = Store[f] : &:r903_1, r903_9 +# 904| r904_1(glval<__va_list_tag[1]>) = VariableAddress[args] : +# 904| r904_2(__va_list_tag *) = Convert : r904_1 +# 904| v904_3(void) = VarArgsEnd : r904_2 +# 905| r905_1(glval) = FunctionAddress[VAListUsage] : +# 905| r905_2(glval) = VariableAddress[x] : +# 905| r905_3(int) = Load[x] : &:r905_2, m896_6 +# 905| r905_4(glval<__va_list_tag[1]>) = VariableAddress[args2] : +# 905| r905_5(__va_list_tag *) = Convert : r905_4 +# 905| v905_6(void) = Call[VAListUsage] : func:r905_1, 0:r905_3, 1:r905_5 +# 905| m905_7(unknown) = ^CallSideEffect : ~m896_4 +# 905| m905_8(unknown) = Chi : total:m896_4, partial:m905_7 +# 905| v905_9(void) = ^BufferReadSideEffect[1] : &:r905_5, ~m901_6 +# 905| m905_10(unknown) = ^BufferMayWriteSideEffect[1] : &:r905_5 +# 905| m905_11(__va_list_tag[1]) = Chi : total:m901_6, partial:m905_10 +# 906| r906_1(glval<__va_list_tag[1]>) = VariableAddress[args2] : +# 906| r906_2(__va_list_tag *) = Convert : r906_1 +# 906| v906_3(void) = VarArgsEnd : r906_2 +# 907| v907_1(void) = NoOp : +# 896| v896_11(void) = ReturnVoid : +# 896| v896_12(void) = AliasedUse : ~m905_8 +# 896| v896_13(void) = ExitFunction : + +# 909| void CastToVoid(int) +# 909| Block 0 +# 909| v909_1(void) = EnterFunction : +# 909| m909_2(unknown) = AliasedDefinition : +# 909| m909_3(unknown) = InitializeNonLocal : +# 909| m909_4(unknown) = Chi : total:m909_2, partial:m909_3 +# 909| r909_5(glval) = VariableAddress[x] : +# 909| m909_6(int) = InitializeParameter[x] : &:r909_5 +# 910| r910_1(glval) = VariableAddress[x] : +# 910| v910_2(void) = Convert : r910_1 +# 911| v911_1(void) = NoOp : +# 909| v909_7(void) = ReturnVoid : +# 909| v909_8(void) = AliasedUse : m909_3 +# 909| v909_9(void) = ExitFunction : + +# 913| void ConstantConditions(int) +# 913| Block 0 +# 913| v913_1(void) = EnterFunction : +# 913| m913_2(unknown) = AliasedDefinition : +# 913| m913_3(unknown) = InitializeNonLocal : +# 913| m913_4(unknown) = Chi : total:m913_2, partial:m913_3 +# 913| r913_5(glval) = VariableAddress[x] : +# 913| m913_6(int) = InitializeParameter[x] : &:r913_5 +# 914| r914_1(glval) = VariableAddress[a] : +# 914| r914_2(bool) = Constant[1] : +# 914| m914_3(bool) = Store[a] : &:r914_1, r914_2 +# 915| r915_1(glval) = VariableAddress[b] : +# 915| r915_2(bool) = Constant[1] : +# 915| v915_3(void) = ConditionalBranch : r915_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 915| Block 1 +# 915| r915_4(glval) = VariableAddress[x] : +# 915| r915_5(int) = Load[x] : &:r915_4, m913_6 +# 915| r915_6(glval) = VariableAddress[#temp915:11] : +# 915| m915_7(int) = Store[#temp915:11] : &:r915_6, r915_5 +# 915| r915_8(glval) = VariableAddress[#temp915:11] : +# 915| r915_9(int) = Load[#temp915:11] : &:r915_8, m915_7 +# 915| m915_10(int) = Store[b] : &:r915_1, r915_9 +# 916| v916_1(void) = NoOp : +# 913| v913_7(void) = ReturnVoid : +# 913| v913_8(void) = AliasedUse : m913_3 +# 913| v913_9(void) = ExitFunction : + +# 913| Block 2 +# 913| v913_10(void) = Unreached : + +# 949| void OperatorNew() +# 949| Block 0 +# 949| v949_1(void) = EnterFunction : +# 949| m949_2(unknown) = AliasedDefinition : +# 949| m949_3(unknown) = InitializeNonLocal : +# 949| m949_4(unknown) = Chi : total:m949_2, partial:m949_3 +# 950| r950_1(glval) = FunctionAddress[operator new] : +# 950| r950_2(unsigned long) = Constant[4] : +# 950| r950_3(void *) = Call[operator new] : func:r950_1, 0:r950_2 +# 950| m950_4(unknown) = ^CallSideEffect : ~m949_4 +# 950| m950_5(unknown) = Chi : total:m949_4, partial:m950_4 +# 950| m950_6(unknown) = ^InitializeDynamicAllocation : &:r950_3 +# 950| r950_7(int *) = Convert : r950_3 +# 951| r951_1(glval) = FunctionAddress[operator new] : +# 951| r951_2(unsigned long) = Constant[4] : +# 951| r951_3(float) = Constant[1.0] : +# 951| r951_4(void *) = Call[operator new] : func:r951_1, 0:r951_2, 1:r951_3 +# 951| m951_5(unknown) = ^CallSideEffect : ~m950_5 +# 951| m951_6(unknown) = Chi : total:m950_5, partial:m951_5 +# 951| m951_7(unknown) = ^InitializeDynamicAllocation : &:r951_4 +# 951| r951_8(int *) = Convert : r951_4 +# 952| r952_1(glval) = FunctionAddress[operator new] : +# 952| r952_2(unsigned long) = Constant[4] : +# 952| r952_3(void *) = Call[operator new] : func:r952_1, 0:r952_2 +# 952| m952_4(unknown) = ^CallSideEffect : ~m951_6 +# 952| m952_5(unknown) = Chi : total:m951_6, partial:m952_4 +# 952| m952_6(unknown) = ^InitializeDynamicAllocation : &:r952_3 +# 952| r952_7(int *) = Convert : r952_3 +# 952| r952_8(int) = Constant[0] : +# 952| m952_9(int) = Store[?] : &:r952_7, r952_8 +# 952| m952_10(unknown) = Chi : total:m952_6, partial:m952_9 +# 953| r953_1(glval) = FunctionAddress[operator new] : +# 953| r953_2(unsigned long) = Constant[8] : +# 953| r953_3(void *) = Call[operator new] : func:r953_1, 0:r953_2 +# 953| m953_4(unknown) = ^CallSideEffect : ~m952_5 +# 953| m953_5(unknown) = Chi : total:m952_5, partial:m953_4 +# 953| m953_6(unknown) = ^InitializeDynamicAllocation : &:r953_3 +# 953| r953_7(String *) = Convert : r953_3 +# 953| r953_8(glval) = FunctionAddress[String] : +# 953| v953_9(void) = Call[String] : func:r953_8, this:r953_7 +# 953| m953_10(unknown) = ^CallSideEffect : ~m953_5 +# 953| m953_11(unknown) = Chi : total:m953_5, partial:m953_10 +# 953| m953_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r953_7 +# 953| m953_13(unknown) = Chi : total:m953_6, partial:m953_12 +# 954| r954_1(glval) = FunctionAddress[operator new] : +# 954| r954_2(unsigned long) = Constant[8] : +# 954| r954_3(float) = Constant[1.0] : +# 954| r954_4(void *) = Call[operator new] : func:r954_1, 0:r954_2, 1:r954_3 +# 954| m954_5(unknown) = ^CallSideEffect : ~m953_11 +# 954| m954_6(unknown) = Chi : total:m953_11, partial:m954_5 +# 954| m954_7(unknown) = ^InitializeDynamicAllocation : &:r954_4 +# 954| r954_8(String *) = Convert : r954_4 +# 954| r954_9(glval) = FunctionAddress[String] : +# 954| r954_10(glval) = StringConstant["hello"] : +# 954| r954_11(char *) = Convert : r954_10 +# 954| v954_12(void) = Call[String] : func:r954_9, this:r954_8, 0:r954_11 +# 954| m954_13(unknown) = ^CallSideEffect : ~m954_6 +# 954| m954_14(unknown) = Chi : total:m954_6, partial:m954_13 +# 954| v954_15(void) = ^BufferReadSideEffect[0] : &:r954_11, ~m949_3 +# 954| m954_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r954_8 +# 954| m954_17(unknown) = Chi : total:m954_7, partial:m954_16 +# 955| r955_1(glval) = FunctionAddress[operator new] : +# 955| r955_2(unsigned long) = Constant[256] : +# 955| r955_3(align_val_t) = Constant[128] : +# 955| r955_4(void *) = Call[operator new] : func:r955_1, 0:r955_2, 1:r955_3 +# 955| m955_5(unknown) = ^CallSideEffect : ~m954_14 +# 955| m955_6(unknown) = Chi : total:m954_14, partial:m955_5 +# 955| m955_7(unknown) = ^InitializeDynamicAllocation : &:r955_4 +# 955| r955_8(Overaligned *) = Convert : r955_4 +# 956| r956_1(glval) = FunctionAddress[operator new] : +# 956| r956_2(unsigned long) = Constant[256] : +# 956| r956_3(align_val_t) = Constant[128] : +# 956| r956_4(float) = Constant[1.0] : +# 956| r956_5(void *) = Call[operator new] : func:r956_1, 0:r956_2, 1:r956_3, 2:r956_4 +# 956| m956_6(unknown) = ^CallSideEffect : ~m955_6 +# 956| m956_7(unknown) = Chi : total:m955_6, partial:m956_6 +# 956| m956_8(unknown) = ^InitializeDynamicAllocation : &:r956_5 +# 956| r956_9(Overaligned *) = Convert : r956_5 +# 956| r956_10(Overaligned) = Constant[0] : +# 956| m956_11(Overaligned) = Store[?] : &:r956_9, r956_10 +# 956| m956_12(unknown) = Chi : total:m956_8, partial:m956_11 +# 957| v957_1(void) = NoOp : +# 949| v949_5(void) = ReturnVoid : +# 949| v949_6(void) = AliasedUse : ~m956_7 +# 949| v949_7(void) = ExitFunction : + +# 959| void OperatorNewArray(int) +# 959| Block 0 +# 959| v959_1(void) = EnterFunction : +# 959| m959_2(unknown) = AliasedDefinition : +# 959| m959_3(unknown) = InitializeNonLocal : +# 959| m959_4(unknown) = Chi : total:m959_2, partial:m959_3 +# 959| r959_5(glval) = VariableAddress[n] : +# 959| m959_6(int) = InitializeParameter[n] : &:r959_5 +# 960| r960_1(glval) = FunctionAddress[operator new[]] : +# 960| r960_2(unsigned long) = Constant[40] : +# 960| r960_3(void *) = Call[operator new[]] : func:r960_1, 0:r960_2 +# 960| m960_4(unknown) = ^CallSideEffect : ~m959_4 +# 960| m960_5(unknown) = Chi : total:m959_4, partial:m960_4 +# 960| m960_6(unknown) = ^InitializeDynamicAllocation : &:r960_3 +# 960| r960_7(int *) = Convert : r960_3 +# 961| r961_1(glval) = FunctionAddress[operator new[]] : +# 961| r961_2(glval) = VariableAddress[n] : +# 961| r961_3(int) = Load[n] : &:r961_2, m959_6 +# 961| r961_4(unsigned long) = Convert : r961_3 +# 961| r961_5(unsigned long) = Constant[4] : +# 961| r961_6(unsigned long) = Mul : r961_4, r961_5 +# 961| r961_7(void *) = Call[operator new[]] : func:r961_1, 0:r961_6 +# 961| m961_8(unknown) = ^CallSideEffect : ~m960_5 +# 961| m961_9(unknown) = Chi : total:m960_5, partial:m961_8 +# 961| m961_10(unknown) = ^InitializeDynamicAllocation : &:r961_7 +# 961| r961_11(int *) = Convert : r961_7 +# 962| r962_1(glval) = FunctionAddress[operator new[]] : +# 962| r962_2(glval) = VariableAddress[n] : +# 962| r962_3(int) = Load[n] : &:r962_2, m959_6 +# 962| r962_4(unsigned long) = Convert : r962_3 +# 962| r962_5(unsigned long) = Constant[4] : +# 962| r962_6(unsigned long) = Mul : r962_4, r962_5 +# 962| r962_7(float) = Constant[1.0] : +# 962| r962_8(void *) = Call[operator new[]] : func:r962_1, 0:r962_6, 1:r962_7 +# 962| m962_9(unknown) = ^CallSideEffect : ~m961_9 +# 962| m962_10(unknown) = Chi : total:m961_9, partial:m962_9 +# 962| m962_11(unknown) = ^InitializeDynamicAllocation : &:r962_8 +# 962| r962_12(int *) = Convert : r962_8 +# 963| r963_1(glval) = FunctionAddress[operator new[]] : +# 963| r963_2(glval) = VariableAddress[n] : +# 963| r963_3(int) = Load[n] : &:r963_2, m959_6 +# 963| r963_4(unsigned long) = Convert : r963_3 +# 963| r963_5(unsigned long) = Constant[8] : +# 963| r963_6(unsigned long) = Mul : r963_4, r963_5 +# 963| r963_7(void *) = Call[operator new[]] : func:r963_1, 0:r963_6 +# 963| m963_8(unknown) = ^CallSideEffect : ~m962_10 +# 963| m963_9(unknown) = Chi : total:m962_10, partial:m963_8 +# 963| m963_10(unknown) = ^InitializeDynamicAllocation : &:r963_7 +# 963| r963_11(String *) = Convert : r963_7 +# 964| r964_1(glval) = FunctionAddress[operator new[]] : +# 964| r964_2(glval) = VariableAddress[n] : +# 964| r964_3(int) = Load[n] : &:r964_2, m959_6 +# 964| r964_4(unsigned long) = Convert : r964_3 +# 964| r964_5(unsigned long) = Constant[256] : +# 964| r964_6(unsigned long) = Mul : r964_4, r964_5 +# 964| r964_7(align_val_t) = Constant[128] : +# 964| r964_8(void *) = Call[operator new[]] : func:r964_1, 0:r964_6, 1:r964_7 +# 964| m964_9(unknown) = ^CallSideEffect : ~m963_9 +# 964| m964_10(unknown) = Chi : total:m963_9, partial:m964_9 +# 964| m964_11(unknown) = ^InitializeDynamicAllocation : &:r964_8 +# 964| r964_12(Overaligned *) = Convert : r964_8 +# 965| r965_1(glval) = FunctionAddress[operator new[]] : +# 965| r965_2(unsigned long) = Constant[2560] : +# 965| r965_3(align_val_t) = Constant[128] : +# 965| r965_4(float) = Constant[1.0] : +# 965| r965_5(void *) = Call[operator new[]] : func:r965_1, 0:r965_2, 1:r965_3, 2:r965_4 +# 965| m965_6(unknown) = ^CallSideEffect : ~m964_10 +# 965| m965_7(unknown) = Chi : total:m964_10, partial:m965_6 +# 965| m965_8(unknown) = ^InitializeDynamicAllocation : &:r965_5 +# 965| r965_9(Overaligned *) = Convert : r965_5 +# 966| r966_1(glval) = FunctionAddress[operator new[]] : +# 966| r966_2(glval) = VariableAddress[n] : +# 966| r966_3(int) = Load[n] : &:r966_2, m959_6 +# 966| r966_4(unsigned long) = Convert : r966_3 +# 966| r966_5(unsigned long) = Constant[1] : +# 966| r966_6(unsigned long) = Mul : r966_4, r966_5 +# 966| r966_7(void *) = Call[operator new[]] : func:r966_1, 0:r966_6 +# 966| m966_8(unknown) = ^CallSideEffect : ~m965_7 +# 966| m966_9(unknown) = Chi : total:m965_7, partial:m966_8 +# 966| m966_10(unknown) = ^InitializeDynamicAllocation : &:r966_7 +# 966| r966_11(DefaultCtorWithDefaultParam *) = Convert : r966_7 +# 967| r967_1(glval) = FunctionAddress[operator new[]] : +# 967| r967_2(glval) = VariableAddress[n] : +# 967| r967_3(int) = Load[n] : &:r967_2, m959_6 +# 967| r967_4(unsigned long) = Convert : r967_3 +# 967| r967_5(unsigned long) = Constant[4] : +# 967| r967_6(unsigned long) = Mul : r967_4, r967_5 +# 967| r967_7(void *) = Call[operator new[]] : func:r967_1, 0:r967_6 +# 967| m967_8(unknown) = ^CallSideEffect : ~m966_9 +# 967| m967_9(unknown) = Chi : total:m966_9, partial:m967_8 +# 967| m967_10(unknown) = ^InitializeDynamicAllocation : &:r967_7 +# 967| r967_11(int *) = Convert : r967_7 +# 968| v968_1(void) = NoOp : +# 959| v959_7(void) = ReturnVoid : +# 959| v959_8(void) = AliasedUse : ~m967_9 +# 959| v959_9(void) = ExitFunction : + +# 970| int designatedInit() +# 970| Block 0 +# 970| v970_1(void) = EnterFunction : +# 970| m970_2(unknown) = AliasedDefinition : +# 970| m970_3(unknown) = InitializeNonLocal : +# 970| m970_4(unknown) = Chi : total:m970_2, partial:m970_3 +# 971| r971_1(glval) = VariableAddress[a1] : +# 971| m971_2(int[1000]) = Uninitialized[a1] : &:r971_1 +# 971| r971_3(int) = Constant[0] : +# 971| r971_4(glval) = PointerAdd[4] : r971_1, r971_3 +# 971| r971_5(unknown[8]) = Constant[0] : +# 971| m971_6(unknown[8]) = Store[?] : &:r971_4, r971_5 +# 971| m971_7(int[1000]) = Chi : total:m971_2, partial:m971_6 +# 971| r971_8(int) = Constant[2] : +# 971| r971_9(glval) = PointerAdd[4] : r971_1, r971_8 +# 971| r971_10(int) = Constant[10002] : +# 971| m971_11(int) = Store[?] : &:r971_9, r971_10 +# 971| m971_12(int[1000]) = Chi : total:m971_7, partial:m971_11 +# 971| r971_13(int) = Constant[3] : +# 971| r971_14(glval) = PointerAdd[4] : r971_1, r971_13 +# 971| r971_15(unknown[3588]) = Constant[0] : +# 971| m971_16(unknown[3588]) = Store[?] : &:r971_14, r971_15 +# 971| m971_17(int[1000]) = Chi : total:m971_12, partial:m971_16 +# 971| r971_18(int) = Constant[900] : +# 971| r971_19(glval) = PointerAdd[4] : r971_1, r971_18 +# 971| r971_20(int) = Constant[10900] : +# 971| m971_21(int) = Store[?] : &:r971_19, r971_20 +# 971| m971_22(int[1000]) = Chi : total:m971_17, partial:m971_21 +# 971| r971_23(int) = Constant[901] : +# 971| r971_24(glval) = PointerAdd[4] : r971_1, r971_23 +# 971| r971_25(unknown[396]) = Constant[0] : +# 971| m971_26(unknown[396]) = Store[?] : &:r971_24, r971_25 +# 971| m971_27(int[1000]) = Chi : total:m971_22, partial:m971_26 +# 972| r972_1(glval) = VariableAddress[#return] : +# 972| r972_2(glval) = VariableAddress[a1] : +# 972| r972_3(int *) = Convert : r972_2 +# 972| r972_4(int) = Constant[900] : +# 972| r972_5(glval) = PointerAdd[4] : r972_3, r972_4 +# 972| r972_6(int) = Load[?] : &:r972_5, m971_21 +# 972| m972_7(int) = Store[#return] : &:r972_1, r972_6 +# 970| r970_5(glval) = VariableAddress[#return] : +# 970| v970_6(void) = ReturnValue : &:r970_5, m972_7 +# 970| v970_7(void) = AliasedUse : m970_3 +# 970| v970_8(void) = ExitFunction : + +# 975| void IfStmtWithDeclaration(int, int) +# 975| Block 0 +# 975| v975_1(void) = EnterFunction : +# 975| m975_2(unknown) = AliasedDefinition : +# 975| m975_3(unknown) = InitializeNonLocal : +# 975| m975_4(unknown) = Chi : total:m975_2, partial:m975_3 +# 975| r975_5(glval) = VariableAddress[x] : +# 975| m975_6(int) = InitializeParameter[x] : &:r975_5 +# 975| r975_7(glval) = VariableAddress[y] : +# 975| m975_8(int) = InitializeParameter[y] : &:r975_7 +# 976| r976_1(glval) = VariableAddress[b] : +# 976| r976_2(glval) = VariableAddress[x] : +# 976| r976_3(int) = Load[x] : &:r976_2, m975_6 +# 976| r976_4(glval) = VariableAddress[y] : +# 976| r976_5(int) = Load[y] : &:r976_4, m975_8 +# 976| r976_6(bool) = CompareLT : r976_3, r976_5 +# 976| m976_7(bool) = Store[b] : &:r976_1, r976_6 +# 976| r976_8(glval) = VariableAddress[b] : +# 976| r976_9(bool) = Load[b] : &:r976_8, m976_7 +# 976| r976_10(bool) = CopyValue : r976_9 +# 976| v976_11(void) = ConditionalBranch : r976_10 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 977| Block 1 +# 977| r977_1(int) = Constant[5] : +# 977| r977_2(glval) = VariableAddress[x] : +# 977| m977_3(int) = Store[x] : &:r977_2, r977_1 +#-----| Goto -> Block 6 + +# 979| Block 2 +# 979| r979_1(glval) = VariableAddress[z] : +# 979| r979_2(glval) = VariableAddress[x] : +# 979| r979_3(int) = Load[x] : &:r979_2, m975_6 +# 979| r979_4(glval) = VariableAddress[y] : +# 979| r979_5(int) = Load[y] : &:r979_4, m975_8 +# 979| r979_6(int) = Add : r979_3, r979_5 +# 979| m979_7(int) = Store[z] : &:r979_1, r979_6 +# 979| r979_8(glval) = VariableAddress[z] : +# 979| r979_9(int) = Load[z] : &:r979_8, m979_7 +# 979| r979_10(int) = Constant[0] : +# 979| r979_11(bool) = CompareNE : r979_9, r979_10 +# 979| r979_12(bool) = CopyValue : r979_11 +# 979| v979_13(void) = ConditionalBranch : r979_12 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 980| Block 3 +# 980| r980_1(int) = Constant[7] : +# 980| r980_2(glval) = VariableAddress[y] : +# 980| m980_3(int) = Store[y] : &:r980_2, r980_1 +#-----| Goto -> Block 6 + +# 982| Block 4 +# 982| r982_1(glval) = VariableAddress[p] : +# 982| r982_2(glval) = VariableAddress[x] : +# 982| r982_3(int *) = CopyValue : r982_2 +# 982| m982_4(int *) = Store[p] : &:r982_1, r982_3 +# 982| r982_5(glval) = VariableAddress[p] : +# 982| r982_6(int *) = Load[p] : &:r982_5, m982_4 +# 982| r982_7(int *) = Constant[0] : +# 982| r982_8(bool) = CompareNE : r982_6, r982_7 +# 982| r982_9(bool) = CopyValue : r982_8 +# 982| v982_10(void) = ConditionalBranch : r982_9 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 983| Block 5 +# 983| r983_1(int) = Constant[2] : +# 983| r983_2(glval) = VariableAddress[p] : +# 983| r983_3(int *) = Load[p] : &:r983_2, m982_4 +# 983| r983_4(glval) = CopyValue : r983_3 +# 983| m983_5(int) = Store[?] : &:r983_4, r983_1 +#-----| Goto -> Block 6 + +# 985| Block 6 +# 985| v985_1(void) = NoOp : +# 975| v975_9(void) = ReturnVoid : +# 975| v975_10(void) = AliasedUse : m975_3 +# 975| v975_11(void) = ExitFunction : + +# 987| void WhileStmtWithDeclaration(int, int) +# 987| Block 0 +# 987| v987_1(void) = EnterFunction : +# 987| m987_2(unknown) = AliasedDefinition : +# 987| m987_3(unknown) = InitializeNonLocal : +# 987| m987_4(unknown) = Chi : total:m987_2, partial:m987_3 +# 987| r987_5(glval) = VariableAddress[x] : +# 987| m987_6(int) = InitializeParameter[x] : &:r987_5 +# 987| r987_7(glval) = VariableAddress[y] : +# 987| m987_8(int) = InitializeParameter[y] : &:r987_7 +#-----| Goto -> Block 1 + +# 988| Block 1 +# 988| r988_1(glval) = VariableAddress[b] : +# 988| r988_2(glval) = VariableAddress[x] : +# 988| r988_3(int) = Load[x] : &:r988_2, m987_6 +# 988| r988_4(glval) = VariableAddress[y] : +# 988| r988_5(int) = Load[y] : &:r988_4, m987_8 +# 988| r988_6(bool) = CompareLT : r988_3, r988_5 +# 988| m988_7(bool) = Store[b] : &:r988_1, r988_6 +# 988| r988_8(glval) = VariableAddress[b] : +# 988| r988_9(bool) = Load[b] : &:r988_8, m988_7 +# 988| r988_10(bool) = CopyValue : r988_9 +# 988| v988_11(void) = ConditionalBranch : r988_10 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 988| Block 2 +# 988| v988_12(void) = NoOp : +#-----| Goto (back edge) -> Block 1 + +# 990| Block 3 +# 990| r990_1(glval) = VariableAddress[z] : +# 990| r990_2(glval) = VariableAddress[x] : +# 990| r990_3(int) = Load[x] : &:r990_2, m987_6 +# 990| r990_4(glval) = VariableAddress[y] : +# 990| r990_5(int) = Load[y] : &:r990_4, m987_8 +# 990| r990_6(int) = Add : r990_3, r990_5 +# 990| m990_7(int) = Store[z] : &:r990_1, r990_6 +# 990| r990_8(glval) = VariableAddress[z] : +# 990| r990_9(int) = Load[z] : &:r990_8, m990_7 +# 990| r990_10(int) = Constant[0] : +# 990| r990_11(bool) = CompareNE : r990_9, r990_10 +# 990| r990_12(bool) = CopyValue : r990_11 +# 990| v990_13(void) = ConditionalBranch : r990_12 +#-----| False -> Block 5 +#-----| True -> Block 4 + +# 990| Block 4 +# 990| v990_14(void) = NoOp : +#-----| Goto (back edge) -> Block 3 + +# 992| Block 5 +# 992| r992_1(glval) = VariableAddress[p] : +# 992| r992_2(glval) = VariableAddress[x] : +# 992| r992_3(int *) = CopyValue : r992_2 +# 992| m992_4(int *) = Store[p] : &:r992_1, r992_3 +# 992| r992_5(glval) = VariableAddress[p] : +# 992| r992_6(int *) = Load[p] : &:r992_5, m992_4 +# 992| r992_7(int *) = Constant[0] : +# 992| r992_8(bool) = CompareNE : r992_6, r992_7 +# 992| r992_9(bool) = CopyValue : r992_8 +# 992| v992_10(void) = ConditionalBranch : r992_9 +#-----| False -> Block 7 +#-----| True -> Block 6 + +# 992| Block 6 +# 992| v992_11(void) = NoOp : +#-----| Goto (back edge) -> Block 5 + +# 994| Block 7 +# 994| v994_1(void) = NoOp : +# 987| v987_9(void) = ReturnVoid : +# 987| v987_10(void) = AliasedUse : m987_3 +# 987| v987_11(void) = ExitFunction : + +# 996| int PointerDecay(int[], int(float)) +# 996| Block 0 +# 996| v996_1(void) = EnterFunction : +# 996| m996_2(unknown) = AliasedDefinition : +# 996| m996_3(unknown) = InitializeNonLocal : +# 996| m996_4(unknown) = Chi : total:m996_2, partial:m996_3 +# 996| r996_5(glval) = VariableAddress[a] : +# 996| m996_6(int *) = InitializeParameter[a] : &:r996_5 +# 996| r996_7(int *) = Load[a] : &:r996_5, m996_6 +# 996| m996_8(unknown) = InitializeIndirection[a] : &:r996_7 +# 996| r996_9(glval<..(*)(..)>) = VariableAddress[fn] : +# 996| m996_10(..(*)(..)) = InitializeParameter[fn] : &:r996_9 +# 997| r997_1(glval) = VariableAddress[#return] : +# 997| r997_2(glval) = VariableAddress[a] : +# 997| r997_3(int *) = Load[a] : &:r997_2, m996_6 +# 997| r997_4(int) = Constant[0] : +# 997| r997_5(glval) = PointerAdd[4] : r997_3, r997_4 +# 997| r997_6(int) = Load[?] : &:r997_5, ~m996_8 +# 997| r997_7(glval<..(*)(..)>) = VariableAddress[fn] : +# 997| r997_8(..(*)(..)) = Load[fn] : &:r997_7, m996_10 +# 997| r997_9(float) = Constant[1.0] : +# 997| r997_10(int) = Call[?] : func:r997_8, 0:r997_9 +# 997| m997_11(unknown) = ^CallSideEffect : ~m996_4 +# 997| m997_12(unknown) = Chi : total:m996_4, partial:m997_11 +# 997| r997_13(int) = Add : r997_6, r997_10 +# 997| m997_14(int) = Store[#return] : &:r997_1, r997_13 +# 996| v996_11(void) = ReturnIndirection[a] : &:r996_7, m996_8 +# 996| r996_12(glval) = VariableAddress[#return] : +# 996| v996_13(void) = ReturnValue : &:r996_12, m997_14 +# 996| v996_14(void) = AliasedUse : ~m997_12 +# 996| v996_15(void) = ExitFunction : + +# 1000| int StmtExpr(int, int, int) +# 1000| Block 0 +# 1000| v1000_1(void) = EnterFunction : +# 1000| m1000_2(unknown) = AliasedDefinition : +# 1000| m1000_3(unknown) = InitializeNonLocal : +# 1000| m1000_4(unknown) = Chi : total:m1000_2, partial:m1000_3 +# 1000| r1000_5(glval) = VariableAddress[b] : +# 1000| m1000_6(int) = InitializeParameter[b] : &:r1000_5 +# 1000| r1000_7(glval) = VariableAddress[y] : +# 1000| m1000_8(int) = InitializeParameter[y] : &:r1000_7 +# 1000| r1000_9(glval) = VariableAddress[z] : +# 1000| m1000_10(int) = InitializeParameter[z] : &:r1000_9 +# 1001| r1001_1(glval) = VariableAddress[x] : +# 1002| r1002_1(glval) = VariableAddress[w] : +# 1002| m1002_2(int) = Uninitialized[w] : &:r1002_1 +# 1003| r1003_1(glval) = VariableAddress[b] : +# 1003| r1003_2(int) = Load[b] : &:r1003_1, m1000_6 +# 1003| r1003_3(int) = Constant[0] : +# 1003| r1003_4(bool) = CompareNE : r1003_2, r1003_3 +# 1003| v1003_5(void) = ConditionalBranch : r1003_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 1004| Block 1 +# 1004| r1004_1(glval) = VariableAddress[y] : +# 1004| r1004_2(int) = Load[y] : &:r1004_1, m1000_8 +# 1004| r1004_3(glval) = VariableAddress[w] : +# 1004| m1004_4(int) = Store[w] : &:r1004_3, r1004_2 +#-----| Goto -> Block 3 + +# 1006| Block 2 +# 1006| r1006_1(glval) = VariableAddress[z] : +# 1006| r1006_2(int) = Load[z] : &:r1006_1, m1000_10 +# 1006| r1006_3(glval) = VariableAddress[w] : +# 1006| m1006_4(int) = Store[w] : &:r1006_3, r1006_2 +#-----| Goto -> Block 3 + +# 1008| Block 3 +# 1008| m1008_1(int) = Phi : from 1:m1004_4, from 2:m1006_4 +# 1008| r1008_2(glval) = VariableAddress[w] : +# 1008| r1008_3(int) = Load[w] : &:r1008_2, m1008_1 +# 1001| r1001_2(int) = CopyValue : r1008_3 +# 1001| m1001_3(int) = Store[x] : &:r1001_1, r1001_2 +# 1011| r1011_1(glval) = VariableAddress[#return] : +# 1011| r1011_2(glval) = VariableAddress[x] : +# 1011| r1011_3(int) = Load[x] : &:r1011_2, m1001_3 +# 1011| r1011_4(int) = CopyValue : r1011_3 +# 1011| m1011_5(int) = Store[#return] : &:r1011_1, r1011_4 +# 1000| r1000_11(glval) = VariableAddress[#return] : +# 1000| v1000_12(void) = ReturnValue : &:r1000_11, m1011_5 +# 1000| v1000_13(void) = AliasedUse : m1000_3 +# 1000| v1000_14(void) = ExitFunction : + +# 1015| void OperatorDelete() +# 1015| Block 0 +# 1015| v1015_1(void) = EnterFunction : +# 1015| m1015_2(unknown) = AliasedDefinition : +# 1015| m1015_3(unknown) = InitializeNonLocal : +# 1015| m1015_4(unknown) = Chi : total:m1015_2, partial:m1015_3 +# 1016| r1016_1(glval) = FunctionAddress[operator delete] : +# 1016| r1016_2(int *) = Constant[0] : +# 1016| v1016_3(void) = Call[operator delete] : func:r1016_1, 0:r1016_2 +# 1016| m1016_4(unknown) = ^CallSideEffect : ~m1015_4 +# 1016| m1016_5(unknown) = Chi : total:m1015_4, partial:m1016_4 +# 1017| r1017_1(glval) = FunctionAddress[operator delete] : +# 1017| r1017_2(String *) = Constant[0] : +# 1017| v1017_3(void) = Call[operator delete] : func:r1017_1, 0:r1017_2 +# 1017| m1017_4(unknown) = ^CallSideEffect : ~m1016_5 +# 1017| m1017_5(unknown) = Chi : total:m1016_5, partial:m1017_4 +# 1018| r1018_1(glval) = FunctionAddress[operator delete] : +# 1018| r1018_2(SizedDealloc *) = Constant[0] : +# 1018| v1018_3(void) = Call[operator delete] : func:r1018_1, 0:r1018_2 +# 1018| m1018_4(unknown) = ^CallSideEffect : ~m1017_5 +# 1018| m1018_5(unknown) = Chi : total:m1017_5, partial:m1018_4 +# 1019| r1019_1(glval) = FunctionAddress[operator delete] : +# 1019| r1019_2(Overaligned *) = Constant[0] : +# 1019| v1019_3(void) = Call[operator delete] : func:r1019_1, 0:r1019_2 +# 1019| m1019_4(unknown) = ^CallSideEffect : ~m1018_5 +# 1019| m1019_5(unknown) = Chi : total:m1018_5, partial:m1019_4 +# 1020| r1020_1(glval) = VirtualDeleteFunctionAddress : +# 1020| r1020_2(PolymorphicBase *) = Constant[0] : +# 1020| v1020_3(void) = Call[?] : func:r1020_1, 0:r1020_2 +# 1020| m1020_4(unknown) = ^CallSideEffect : ~m1019_5 +# 1020| m1020_5(unknown) = Chi : total:m1019_5, partial:m1020_4 +# 1021| v1021_1(void) = NoOp : +# 1015| v1015_5(void) = ReturnVoid : +# 1015| v1015_6(void) = AliasedUse : ~m1020_5 +# 1015| v1015_7(void) = ExitFunction : + +# 1024| void OperatorDeleteArray() +# 1024| Block 0 +# 1024| v1024_1(void) = EnterFunction : +# 1024| m1024_2(unknown) = AliasedDefinition : +# 1024| m1024_3(unknown) = InitializeNonLocal : +# 1024| m1024_4(unknown) = Chi : total:m1024_2, partial:m1024_3 +# 1025| r1025_1(glval) = FunctionAddress[operator delete[]] : +# 1025| r1025_2(int *) = Constant[0] : +# 1025| v1025_3(void) = Call[operator delete[]] : func:r1025_1, 0:r1025_2 +# 1025| m1025_4(unknown) = ^CallSideEffect : ~m1024_4 +# 1025| m1025_5(unknown) = Chi : total:m1024_4, partial:m1025_4 +# 1026| r1026_1(glval) = FunctionAddress[operator delete[]] : +# 1026| r1026_2(String *) = Constant[0] : +# 1026| v1026_3(void) = Call[operator delete[]] : func:r1026_1, 0:r1026_2 +# 1026| m1026_4(unknown) = ^CallSideEffect : ~m1025_5 +# 1026| m1026_5(unknown) = Chi : total:m1025_5, partial:m1026_4 +# 1027| r1027_1(glval) = FunctionAddress[operator delete[]] : +# 1027| r1027_2(SizedDealloc *) = Constant[0] : +# 1027| v1027_3(void) = Call[operator delete[]] : func:r1027_1, 0:r1027_2 +# 1027| m1027_4(unknown) = ^CallSideEffect : ~m1026_5 +# 1027| m1027_5(unknown) = Chi : total:m1026_5, partial:m1027_4 +# 1028| r1028_1(glval) = FunctionAddress[operator delete[]] : +# 1028| r1028_2(Overaligned *) = Constant[0] : +# 1028| v1028_3(void) = Call[operator delete[]] : func:r1028_1, 0:r1028_2 +# 1028| m1028_4(unknown) = ^CallSideEffect : ~m1027_5 +# 1028| m1028_5(unknown) = Chi : total:m1027_5, partial:m1028_4 +# 1029| r1029_1(glval) = FunctionAddress[operator delete[]] : +# 1029| r1029_2(PolymorphicBase *) = Constant[0] : +# 1029| v1029_3(void) = Call[operator delete[]] : func:r1029_1, 0:r1029_2 +# 1029| m1029_4(unknown) = ^CallSideEffect : ~m1028_5 +# 1029| m1029_5(unknown) = Chi : total:m1028_5, partial:m1029_4 +# 1030| v1030_1(void) = NoOp : +# 1024| v1024_5(void) = ReturnVoid : +# 1024| v1024_6(void) = AliasedUse : ~m1029_5 +# 1024| v1024_7(void) = ExitFunction : + +# 1034| void EmptyStructInit() +# 1034| Block 0 +# 1034| v1034_1(void) = EnterFunction : +# 1034| m1034_2(unknown) = AliasedDefinition : +# 1034| m1034_3(unknown) = InitializeNonLocal : +# 1034| m1034_4(unknown) = Chi : total:m1034_2, partial:m1034_3 +# 1035| r1035_1(glval) = VariableAddress[s] : +# 1035| m1035_2(EmptyStruct) = Uninitialized[s] : &:r1035_1 +# 1036| v1036_1(void) = NoOp : +# 1034| v1034_5(void) = ReturnVoid : +# 1034| v1034_6(void) = AliasedUse : m1034_3 +# 1034| v1034_7(void) = ExitFunction : + +# 1038| (lambda [] type at line 1038, col. 12) lam +# 1038| Block 0 +# 1038| v1038_1(void) = EnterFunction : +# 1038| m1038_2(unknown) = AliasedDefinition : +# 1038| r1038_3(glval) = VariableAddress[lam] : +# 1038| r1038_4(glval) = VariableAddress[#temp1038:12] : +# 1038| m1038_5(decltype([...](...){...})) = Uninitialized[#temp1038:12] : &:r1038_4 +# 1038| r1038_6(decltype([...](...){...})) = Load[#temp1038:12] : &:r1038_4, m1038_5 +# 1038| m1038_7(decltype([...](...){...})) = Store[lam] : &:r1038_3, r1038_6 +# 1038| m1038_8(unknown) = Chi : total:m1038_2, partial:m1038_7 +# 1038| v1038_9(void) = ReturnVoid : +# 1038| v1038_10(void) = AliasedUse : ~m1038_8 +# 1038| v1038_11(void) = ExitFunction : + +# 1038| void (lambda [] type at line 1038, col. 12)::operator()() const +# 1038| Block 0 +# 1038| v1038_1(void) = EnterFunction : +# 1038| m1038_2(unknown) = AliasedDefinition : +# 1038| m1038_3(unknown) = InitializeNonLocal : +# 1038| m1038_4(unknown) = Chi : total:m1038_2, partial:m1038_3 +# 1038| r1038_5(glval) = VariableAddress[#this] : +# 1038| m1038_6(glval) = InitializeParameter[#this] : &:r1038_5 +# 1038| r1038_7(glval) = Load[#this] : &:r1038_5, m1038_6 +# 1038| m1038_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1038_7 +# 1038| v1038_9(void) = NoOp : +# 1038| v1038_10(void) = ReturnIndirection[#this] : &:r1038_7, m1038_8 +# 1038| v1038_11(void) = ReturnVoid : +# 1038| v1038_12(void) = AliasedUse : m1038_3 +# 1038| v1038_13(void) = ExitFunction : + +# 1038| void(* (lambda [] type at line 1038, col. 12)::operator void (*)()() const)() +# 1038| Block 0 +# 1038| v1038_1(void) = EnterFunction : +# 1038| m1038_2(unknown) = AliasedDefinition : +# 1038| m1038_3(unknown) = InitializeNonLocal : +# 1038| m1038_4(unknown) = Chi : total:m1038_2, partial:m1038_3 +# 1038| r1038_5(glval) = VariableAddress[#this] : +# 1038| m1038_6(glval) = InitializeParameter[#this] : &:r1038_5 +# 1038| r1038_7(glval) = Load[#this] : &:r1038_5, m1038_6 +# 1038| m1038_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1038_7 +# 1038| r1038_9(glval<..(*)(..)>) = VariableAddress[#return] : +# 1038| r1038_10(..(*)(..)) = FunctionAddress[_FUN] : +# 1038| m1038_11(..(*)(..)) = Store[#return] : &:r1038_9, r1038_10 +# 1038| v1038_12(void) = ReturnIndirection[#this] : &:r1038_7, m1038_8 +# 1038| r1038_13(glval<..(*)(..)>) = VariableAddress[#return] : +# 1038| v1038_14(void) = ReturnValue : &:r1038_13, m1038_11 +# 1038| v1038_15(void) = AliasedUse : m1038_3 +# 1038| v1038_16(void) = ExitFunction : + +# 1040| void Lambda(int, String const&) +# 1040| Block 0 +# 1040| v1040_1(void) = EnterFunction : +# 1040| m1040_2(unknown) = AliasedDefinition : +# 1040| m1040_3(unknown) = InitializeNonLocal : +# 1040| m1040_4(unknown) = Chi : total:m1040_2, partial:m1040_3 +# 1040| r1040_5(glval) = VariableAddress[x] : +# 1040| m1040_6(int) = InitializeParameter[x] : &:r1040_5 +# 1040| r1040_7(glval) = VariableAddress[s] : +# 1040| m1040_8(String &) = InitializeParameter[s] : &:r1040_7 +# 1040| r1040_9(String &) = Load[s] : &:r1040_7, m1040_8 +# 1040| m1040_10(unknown) = InitializeIndirection[s] : &:r1040_9 +# 1041| r1041_1(glval) = VariableAddress[lambda_empty] : +# 1041| r1041_2(glval) = VariableAddress[#temp1041:23] : +# 1041| m1041_3(decltype([...](...){...})) = Uninitialized[#temp1041:23] : &:r1041_2 +# 1041| r1041_4(decltype([...](...){...})) = Load[#temp1041:23] : &:r1041_2, m1041_3 +# 1041| m1041_5(decltype([...](...){...})) = Store[lambda_empty] : &:r1041_1, r1041_4 +# 1042| r1042_1(char) = Constant[65] : +# 1043| r1043_1(glval) = VariableAddress[lambda_ref] : +# 1043| r1043_2(glval) = VariableAddress[#temp1043:20] : +# 1043| m1043_3(decltype([...](...){...})) = Uninitialized[#temp1043:20] : &:r1043_2 +# 1043| r1043_4(glval) = FieldAddress[s] : r1043_2 +# 1043| r1043_5(glval) = VariableAddress[s] : +# 1043| r1043_6(String &) = Load[s] : &:r1043_5, m1040_8 +# 1043| r1043_7(glval) = CopyValue : r1043_6 +# 1043| r1043_8(String &) = CopyValue : r1043_7 +# 1043| m1043_9(String &) = Store[?] : &:r1043_4, r1043_8 +# 1043| m1043_10(decltype([...](...){...})) = Chi : total:m1043_3, partial:m1043_9 +# 1043| r1043_11(glval) = FieldAddress[x] : r1043_2 +# 1043| r1043_12(glval) = VariableAddress[x] : +#-----| r0_1(int &) = CopyValue : r1043_12 +#-----| m0_2(int &) = Store[?] : &:r1043_11, r0_1 +#-----| m0_3(decltype([...](...){...})) = Chi : total:m1043_10, partial:m0_2 +# 1043| r1043_13(decltype([...](...){...})) = Load[#temp1043:20] : &:r1043_2, m0_3 +# 1043| m1043_14(decltype([...](...){...})) = Store[lambda_ref] : &:r1043_1, r1043_13 +# 1044| r1044_1(glval) = VariableAddress[lambda_ref] : +# 1044| r1044_2(glval) = Convert : r1044_1 +# 1044| r1044_3(glval) = FunctionAddress[operator()] : +# 1044| r1044_4(float) = Constant[1.0] : +# 1044| r1044_5(char) = Call[operator()] : func:r1044_3, this:r1044_2, 0:r1044_4 +# 1044| m1044_6(unknown) = ^CallSideEffect : ~m1040_4 +# 1044| m1044_7(unknown) = Chi : total:m1040_4, partial:m1044_6 +# 1044| v1044_8(void) = ^IndirectReadSideEffect[-1] : &:r1044_2, m1043_14 +# 1045| r1045_1(glval) = VariableAddress[lambda_val] : +# 1045| r1045_2(glval) = VariableAddress[#temp1045:20] : +# 1045| m1045_3(decltype([...](...){...})) = Uninitialized[#temp1045:20] : &:r1045_2 +# 1045| r1045_4(glval) = FieldAddress[s] : r1045_2 +# 1045| r1045_5(glval) = FunctionAddress[String] : +# 1045| v1045_6(void) = Call[String] : func:r1045_5, this:r1045_4 +# 1045| m1045_7(unknown) = ^CallSideEffect : ~m1044_7 +# 1045| m1045_8(unknown) = Chi : total:m1044_7, partial:m1045_7 +# 1045| m1045_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_4 +# 1045| m1045_10(decltype([...](...){...})) = Chi : total:m1045_3, partial:m1045_9 +# 1045| r1045_11(glval) = FieldAddress[x] : r1045_2 +# 1045| r1045_12(glval) = VariableAddress[x] : +# 1045| r1045_13(int) = Load[x] : &:r1045_12, m1040_6 +# 1045| m1045_14(int) = Store[?] : &:r1045_11, r1045_13 +# 1045| m1045_15(decltype([...](...){...})) = Chi : total:m1045_10, partial:m1045_14 +# 1045| r1045_16(decltype([...](...){...})) = Load[#temp1045:20] : &:r1045_2, m1045_15 +# 1045| m1045_17(decltype([...](...){...})) = Store[lambda_val] : &:r1045_1, r1045_16 +# 1046| r1046_1(glval) = VariableAddress[lambda_val] : +# 1046| r1046_2(glval) = Convert : r1046_1 +# 1046| r1046_3(glval) = FunctionAddress[operator()] : +# 1046| r1046_4(float) = Constant[2.0] : +# 1046| r1046_5(char) = Call[operator()] : func:r1046_3, this:r1046_2, 0:r1046_4 +# 1046| m1046_6(unknown) = ^CallSideEffect : ~m1045_8 +# 1046| m1046_7(unknown) = Chi : total:m1045_8, partial:m1046_6 +# 1046| v1046_8(void) = ^IndirectReadSideEffect[-1] : &:r1046_2, m1045_17 +# 1047| r1047_1(glval) = VariableAddress[lambda_ref_explicit] : +# 1047| r1047_2(glval) = VariableAddress[#temp1047:29] : +# 1047| m1047_3(decltype([...](...){...})) = Uninitialized[#temp1047:29] : &:r1047_2 +# 1047| r1047_4(glval) = FieldAddress[s] : r1047_2 +# 1047| r1047_5(glval) = VariableAddress[s] : +# 1047| r1047_6(String &) = Load[s] : &:r1047_5, m1040_8 +# 1047| r1047_7(glval) = CopyValue : r1047_6 +# 1047| r1047_8(String &) = CopyValue : r1047_7 +# 1047| m1047_9(String &) = Store[?] : &:r1047_4, r1047_8 +# 1047| r1047_10(decltype([...](...){...})) = Load[#temp1047:29] : &:r1047_2, ~m1047_9 +# 1047| m1047_11(decltype([...](...){...})) = Store[lambda_ref_explicit] : &:r1047_1, r1047_10 +# 1048| r1048_1(glval) = VariableAddress[lambda_ref_explicit] : +# 1048| r1048_2(glval) = Convert : r1048_1 +# 1048| r1048_3(glval) = FunctionAddress[operator()] : +# 1048| r1048_4(float) = Constant[3.0] : +# 1048| r1048_5(char) = Call[operator()] : func:r1048_3, this:r1048_2, 0:r1048_4 +# 1048| m1048_6(unknown) = ^CallSideEffect : ~m1046_7 +# 1048| m1048_7(unknown) = Chi : total:m1046_7, partial:m1048_6 +# 1048| v1048_8(void) = ^IndirectReadSideEffect[-1] : &:r1048_2, m1047_11 +# 1049| r1049_1(glval) = VariableAddress[lambda_val_explicit] : +# 1049| r1049_2(glval) = VariableAddress[#temp1049:29] : +# 1049| m1049_3(decltype([...](...){...})) = Uninitialized[#temp1049:29] : &:r1049_2 +# 1049| r1049_4(glval) = FieldAddress[s] : r1049_2 +# 1049| r1049_5(glval) = FunctionAddress[String] : +# 1049| v1049_6(void) = Call[String] : func:r1049_5, this:r1049_4 +# 1049| m1049_7(unknown) = ^CallSideEffect : ~m1048_7 +# 1049| m1049_8(unknown) = Chi : total:m1048_7, partial:m1049_7 +# 1049| m1049_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1049_4 +# 1049| m1049_10(decltype([...](...){...})) = Chi : total:m1049_3, partial:m1049_9 +# 1049| r1049_11(decltype([...](...){...})) = Load[#temp1049:29] : &:r1049_2, m1049_10 +# 1049| m1049_12(decltype([...](...){...})) = Store[lambda_val_explicit] : &:r1049_1, r1049_11 +# 1050| r1050_1(glval) = VariableAddress[lambda_val_explicit] : +# 1050| r1050_2(glval) = Convert : r1050_1 +# 1050| r1050_3(glval) = FunctionAddress[operator()] : +# 1050| r1050_4(float) = Constant[4.0] : +# 1050| r1050_5(char) = Call[operator()] : func:r1050_3, this:r1050_2, 0:r1050_4 +# 1050| m1050_6(unknown) = ^CallSideEffect : ~m1049_8 +# 1050| m1050_7(unknown) = Chi : total:m1049_8, partial:m1050_6 +# 1050| v1050_8(void) = ^IndirectReadSideEffect[-1] : &:r1050_2, m1049_12 +# 1051| r1051_1(glval) = VariableAddress[lambda_mixed_explicit] : +# 1051| r1051_2(glval) = VariableAddress[#temp1051:31] : +# 1051| m1051_3(decltype([...](...){...})) = Uninitialized[#temp1051:31] : &:r1051_2 +# 1051| r1051_4(glval) = FieldAddress[s] : r1051_2 +# 1051| r1051_5(glval) = VariableAddress[s] : +# 1051| r1051_6(String &) = Load[s] : &:r1051_5, m1040_8 +# 1051| r1051_7(glval) = CopyValue : r1051_6 +# 1051| r1051_8(String &) = CopyValue : r1051_7 +# 1051| m1051_9(String &) = Store[?] : &:r1051_4, r1051_8 +# 1051| m1051_10(decltype([...](...){...})) = Chi : total:m1051_3, partial:m1051_9 +# 1051| r1051_11(glval) = FieldAddress[x] : r1051_2 +# 1051| r1051_12(glval) = VariableAddress[x] : +# 1051| r1051_13(int) = Load[x] : &:r1051_12, m1040_6 +# 1051| m1051_14(int) = Store[?] : &:r1051_11, r1051_13 +# 1051| m1051_15(decltype([...](...){...})) = Chi : total:m1051_10, partial:m1051_14 +# 1051| r1051_16(decltype([...](...){...})) = Load[#temp1051:31] : &:r1051_2, m1051_15 +# 1051| m1051_17(decltype([...](...){...})) = Store[lambda_mixed_explicit] : &:r1051_1, r1051_16 +# 1052| r1052_1(glval) = VariableAddress[lambda_mixed_explicit] : +# 1052| r1052_2(glval) = Convert : r1052_1 +# 1052| r1052_3(glval) = FunctionAddress[operator()] : +# 1052| r1052_4(float) = Constant[5.0] : +# 1052| r1052_5(char) = Call[operator()] : func:r1052_3, this:r1052_2, 0:r1052_4 +# 1052| m1052_6(unknown) = ^CallSideEffect : ~m1050_7 +# 1052| m1052_7(unknown) = Chi : total:m1050_7, partial:m1052_6 +# 1052| v1052_8(void) = ^IndirectReadSideEffect[-1] : &:r1052_2, m1051_17 +# 1053| r1053_1(glval) = VariableAddress[r] : +# 1053| r1053_2(glval) = VariableAddress[x] : +# 1053| r1053_3(int) = Load[x] : &:r1053_2, m1040_6 +# 1053| r1053_4(int) = Constant[1] : +# 1053| r1053_5(int) = Sub : r1053_3, r1053_4 +# 1053| m1053_6(int) = Store[r] : &:r1053_1, r1053_5 +# 1054| r1054_1(glval) = VariableAddress[lambda_inits] : +# 1054| r1054_2(glval) = VariableAddress[#temp1054:22] : +# 1054| m1054_3(decltype([...](...){...})) = Uninitialized[#temp1054:22] : &:r1054_2 +# 1054| r1054_4(glval) = FieldAddress[s] : r1054_2 +# 1054| r1054_5(glval) = VariableAddress[s] : +# 1054| r1054_6(String &) = Load[s] : &:r1054_5, m1040_8 +# 1054| r1054_7(glval) = CopyValue : r1054_6 +# 1054| r1054_8(String &) = CopyValue : r1054_7 +# 1054| m1054_9(String &) = Store[?] : &:r1054_4, r1054_8 +# 1054| m1054_10(decltype([...](...){...})) = Chi : total:m1054_3, partial:m1054_9 +# 1054| r1054_11(glval) = FieldAddress[x] : r1054_2 +# 1054| r1054_12(glval) = VariableAddress[x] : +# 1054| r1054_13(int) = Load[x] : &:r1054_12, m1040_6 +# 1054| m1054_14(int) = Store[?] : &:r1054_11, r1054_13 +# 1054| m1054_15(decltype([...](...){...})) = Chi : total:m1054_10, partial:m1054_14 +# 1054| r1054_16(glval) = FieldAddress[i] : r1054_2 +# 1054| r1054_17(glval) = VariableAddress[x] : +# 1054| r1054_18(int) = Load[x] : &:r1054_17, m1040_6 +# 1054| r1054_19(int) = Constant[1] : +# 1054| r1054_20(int) = Add : r1054_18, r1054_19 +# 1054| m1054_21(int) = Store[?] : &:r1054_16, r1054_20 +# 1054| m1054_22(decltype([...](...){...})) = Chi : total:m1054_15, partial:m1054_21 +# 1054| r1054_23(glval) = FieldAddress[j] : r1054_2 +# 1054| r1054_24(glval) = VariableAddress[r] : +# 1054| r1054_25(int &) = CopyValue : r1054_24 +# 1054| m1054_26(int &) = Store[?] : &:r1054_23, r1054_25 +# 1054| m1054_27(decltype([...](...){...})) = Chi : total:m1054_22, partial:m1054_26 +# 1054| r1054_28(decltype([...](...){...})) = Load[#temp1054:22] : &:r1054_2, m1054_27 +# 1054| m1054_29(decltype([...](...){...})) = Store[lambda_inits] : &:r1054_1, r1054_28 +# 1055| r1055_1(glval) = VariableAddress[lambda_inits] : +# 1055| r1055_2(glval) = Convert : r1055_1 +# 1055| r1055_3(glval) = FunctionAddress[operator()] : +# 1055| r1055_4(float) = Constant[6.0] : +# 1055| r1055_5(char) = Call[operator()] : func:r1055_3, this:r1055_2, 0:r1055_4 +# 1055| m1055_6(unknown) = ^CallSideEffect : ~m1052_7 +# 1055| m1055_7(unknown) = Chi : total:m1052_7, partial:m1055_6 +# 1055| v1055_8(void) = ^IndirectReadSideEffect[-1] : &:r1055_2, m1054_29 +# 1056| v1056_1(void) = NoOp : +# 1040| v1040_11(void) = ReturnIndirection[s] : &:r1040_9, m1040_10 +# 1040| v1040_12(void) = ReturnVoid : +# 1040| v1040_13(void) = AliasedUse : ~m1055_7 +# 1040| v1040_14(void) = ExitFunction : + +# 1041| char (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::operator()(float) const +# 1041| Block 0 +# 1041| v1041_1(void) = EnterFunction : +# 1041| m1041_2(unknown) = AliasedDefinition : +# 1041| m1041_3(unknown) = InitializeNonLocal : +# 1041| m1041_4(unknown) = Chi : total:m1041_2, partial:m1041_3 +# 1041| r1041_5(glval) = VariableAddress[#this] : +# 1041| m1041_6(glval) = InitializeParameter[#this] : &:r1041_5 +# 1041| r1041_7(glval) = Load[#this] : &:r1041_5, m1041_6 +# 1041| m1041_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1041_7 +# 1041| r1041_9(glval) = VariableAddress[f] : +# 1041| m1041_10(float) = InitializeParameter[f] : &:r1041_9 +# 1041| r1041_11(glval) = VariableAddress[#return] : +# 1041| r1041_12(char) = Constant[65] : +# 1041| m1041_13(char) = Store[#return] : &:r1041_11, r1041_12 +# 1041| v1041_14(void) = ReturnIndirection[#this] : &:r1041_7, m1041_8 +# 1041| r1041_15(glval) = VariableAddress[#return] : +# 1041| v1041_16(void) = ReturnValue : &:r1041_15, m1041_13 +# 1041| v1041_17(void) = AliasedUse : m1041_3 +# 1041| v1041_18(void) = ExitFunction : + +# 1041| char(* (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::operator char (*)(float)() const)(float) +# 1041| Block 0 +# 1041| v1041_1(void) = EnterFunction : +# 1041| m1041_2(unknown) = AliasedDefinition : +# 1041| m1041_3(unknown) = InitializeNonLocal : +# 1041| m1041_4(unknown) = Chi : total:m1041_2, partial:m1041_3 +# 1041| r1041_5(glval) = VariableAddress[#this] : +# 1041| m1041_6(glval) = InitializeParameter[#this] : &:r1041_5 +# 1041| r1041_7(glval) = Load[#this] : &:r1041_5, m1041_6 +# 1041| m1041_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1041_7 +# 1041| r1041_9(glval<..(*)(..)>) = VariableAddress[#return] : +# 1041| r1041_10(..(*)(..)) = FunctionAddress[_FUN] : +# 1041| m1041_11(..(*)(..)) = Store[#return] : &:r1041_9, r1041_10 +# 1041| v1041_12(void) = ReturnIndirection[#this] : &:r1041_7, m1041_8 +# 1041| r1041_13(glval<..(*)(..)>) = VariableAddress[#return] : +# 1041| v1041_14(void) = ReturnValue : &:r1041_13, m1041_11 +# 1041| v1041_15(void) = AliasedUse : m1041_3 +# 1041| v1041_16(void) = ExitFunction : + +# 1043| char (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::operator()(float) const +# 1043| Block 0 +# 1043| v1043_1(void) = EnterFunction : +# 1043| m1043_2(unknown) = AliasedDefinition : +# 1043| m1043_3(unknown) = InitializeNonLocal : +# 1043| m1043_4(unknown) = Chi : total:m1043_2, partial:m1043_3 +# 1043| r1043_5(glval) = VariableAddress[#this] : +# 1043| m1043_6(glval) = InitializeParameter[#this] : &:r1043_5 +# 1043| r1043_7(glval) = Load[#this] : &:r1043_5, m1043_6 +# 1043| m1043_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1043_7 +# 1043| r1043_9(glval) = VariableAddress[f] : +# 1043| m1043_10(float) = InitializeParameter[f] : &:r1043_9 +# 1043| r1043_11(glval) = VariableAddress[#return] : +# 1043| r1043_12(glval) = VariableAddress[#this] : +# 1043| r1043_13(lambda [] type at line 1043, col. 21 *) = Load[#this] : &:r1043_12, m1043_6 +# 1043| r1043_14(glval) = FieldAddress[s] : r1043_13 +# 1043| r1043_15(String &) = Load[?] : &:r1043_14, ~m1043_8 +# 1043| r1043_16(glval) = CopyValue : r1043_15 +# 1043| r1043_17(glval) = FunctionAddress[c_str] : +# 1043| r1043_18(char *) = Call[c_str] : func:r1043_17, this:r1043_16 +# 1043| m1043_19(unknown) = ^CallSideEffect : ~m1043_4 +# 1043| m1043_20(unknown) = Chi : total:m1043_4, partial:m1043_19 +# 1043| v1043_21(void) = ^IndirectReadSideEffect[-1] : &:r1043_16, ~m1043_20 +# 1043| r1043_22(glval) = VariableAddress[#this] : +# 1043| r1043_23(lambda [] type at line 1043, col. 21 *) = Load[#this] : &:r1043_22, m1043_6 +# 1043| r1043_24(glval) = FieldAddress[x] : r1043_23 +# 1043| r1043_25(int &) = Load[?] : &:r1043_24, ~m1043_8 +# 1043| r1043_26(int) = Load[?] : &:r1043_25, ~m1043_20 +# 1043| r1043_27(glval) = PointerAdd[1] : r1043_18, r1043_26 +# 1043| r1043_28(char) = Load[?] : &:r1043_27, ~m1043_20 +# 1043| m1043_29(char) = Store[#return] : &:r1043_11, r1043_28 +# 1043| v1043_30(void) = ReturnIndirection[#this] : &:r1043_7, m1043_8 +# 1043| r1043_31(glval) = VariableAddress[#return] : +# 1043| v1043_32(void) = ReturnValue : &:r1043_31, m1043_29 +# 1043| v1043_33(void) = AliasedUse : ~m1043_20 +# 1043| v1043_34(void) = ExitFunction : + +# 1045| void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::~() +# 1045| Block 0 +# 1045| v1045_1(void) = EnterFunction : +# 1045| m1045_2(unknown) = AliasedDefinition : +# 1045| m1045_3(unknown) = InitializeNonLocal : +# 1045| m1045_4(unknown) = Chi : total:m1045_2, partial:m1045_3 +# 1045| r1045_5(glval) = VariableAddress[#this] : +# 1045| m1045_6(glval) = InitializeParameter[#this] : &:r1045_5 +# 1045| r1045_7(glval) = Load[#this] : &:r1045_5, m1045_6 +# 1045| m1045_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1045_7 +#-----| v0_1(void) = NoOp : +# 1045| r1045_9(glval) = FieldAddress[s] : m1045_6 +# 1045| r1045_10(glval) = FunctionAddress[~String] : +# 1045| v1045_11(void) = Call[~String] : func:r1045_10, this:r1045_9 +# 1045| m1045_12(unknown) = ^CallSideEffect : ~m1045_4 +# 1045| m1045_13(unknown) = Chi : total:m1045_4, partial:m1045_12 +# 1045| v1045_14(void) = ReturnIndirection[#this] : &:r1045_7, m1045_8 +# 1045| v1045_15(void) = ReturnVoid : +# 1045| v1045_16(void) = AliasedUse : ~m1045_13 +# 1045| v1045_17(void) = ExitFunction : + +# 1045| char (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::operator()(float) const +# 1045| Block 0 +# 1045| v1045_1(void) = EnterFunction : +# 1045| m1045_2(unknown) = AliasedDefinition : +# 1045| m1045_3(unknown) = InitializeNonLocal : +# 1045| m1045_4(unknown) = Chi : total:m1045_2, partial:m1045_3 +# 1045| r1045_5(glval) = VariableAddress[#this] : +# 1045| m1045_6(glval) = InitializeParameter[#this] : &:r1045_5 +# 1045| r1045_7(glval) = Load[#this] : &:r1045_5, m1045_6 +# 1045| m1045_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1045_7 +# 1045| r1045_9(glval) = VariableAddress[f] : +# 1045| m1045_10(float) = InitializeParameter[f] : &:r1045_9 +# 1045| r1045_11(glval) = VariableAddress[#return] : +# 1045| r1045_12(glval) = VariableAddress[#this] : +# 1045| r1045_13(lambda [] type at line 1045, col. 21 *) = Load[#this] : &:r1045_12, m1045_6 +# 1045| r1045_14(glval) = FieldAddress[s] : r1045_13 +# 1045| r1045_15(glval) = FunctionAddress[c_str] : +# 1045| r1045_16(char *) = Call[c_str] : func:r1045_15, this:r1045_14 +# 1045| m1045_17(unknown) = ^CallSideEffect : ~m1045_4 +# 1045| m1045_18(unknown) = Chi : total:m1045_4, partial:m1045_17 +# 1045| v1045_19(void) = ^IndirectReadSideEffect[-1] : &:r1045_14, ~m1045_8 +# 1045| r1045_20(glval) = VariableAddress[#this] : +# 1045| r1045_21(lambda [] type at line 1045, col. 21 *) = Load[#this] : &:r1045_20, m1045_6 +# 1045| r1045_22(glval) = FieldAddress[x] : r1045_21 +# 1045| r1045_23(int) = Load[?] : &:r1045_22, ~m1045_8 +# 1045| r1045_24(glval) = PointerAdd[1] : r1045_16, r1045_23 +# 1045| r1045_25(char) = Load[?] : &:r1045_24, ~m1045_18 +# 1045| m1045_26(char) = Store[#return] : &:r1045_11, r1045_25 +# 1045| v1045_27(void) = ReturnIndirection[#this] : &:r1045_7, m1045_8 +# 1045| r1045_28(glval) = VariableAddress[#return] : +# 1045| v1045_29(void) = ReturnValue : &:r1045_28, m1045_26 +# 1045| v1045_30(void) = AliasedUse : ~m1045_18 +# 1045| v1045_31(void) = ExitFunction : + +# 1047| char (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::operator()(float) const +# 1047| Block 0 +# 1047| v1047_1(void) = EnterFunction : +# 1047| m1047_2(unknown) = AliasedDefinition : +# 1047| m1047_3(unknown) = InitializeNonLocal : +# 1047| m1047_4(unknown) = Chi : total:m1047_2, partial:m1047_3 +# 1047| r1047_5(glval) = VariableAddress[#this] : +# 1047| m1047_6(glval) = InitializeParameter[#this] : &:r1047_5 +# 1047| r1047_7(glval) = Load[#this] : &:r1047_5, m1047_6 +# 1047| m1047_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1047_7 +# 1047| r1047_9(glval) = VariableAddress[f] : +# 1047| m1047_10(float) = InitializeParameter[f] : &:r1047_9 +# 1047| r1047_11(glval) = VariableAddress[#return] : +# 1047| r1047_12(glval) = VariableAddress[#this] : +# 1047| r1047_13(lambda [] type at line 1047, col. 30 *) = Load[#this] : &:r1047_12, m1047_6 +# 1047| r1047_14(glval) = FieldAddress[s] : r1047_13 +# 1047| r1047_15(String &) = Load[?] : &:r1047_14, ~m1047_8 +# 1047| r1047_16(glval) = CopyValue : r1047_15 +# 1047| r1047_17(glval) = FunctionAddress[c_str] : +# 1047| r1047_18(char *) = Call[c_str] : func:r1047_17, this:r1047_16 +# 1047| m1047_19(unknown) = ^CallSideEffect : ~m1047_4 +# 1047| m1047_20(unknown) = Chi : total:m1047_4, partial:m1047_19 +# 1047| v1047_21(void) = ^IndirectReadSideEffect[-1] : &:r1047_16, ~m1047_20 +# 1047| r1047_22(int) = Constant[0] : +# 1047| r1047_23(glval) = PointerAdd[1] : r1047_18, r1047_22 +# 1047| r1047_24(char) = Load[?] : &:r1047_23, ~m1047_20 +# 1047| m1047_25(char) = Store[#return] : &:r1047_11, r1047_24 +# 1047| v1047_26(void) = ReturnIndirection[#this] : &:r1047_7, m1047_8 +# 1047| r1047_27(glval) = VariableAddress[#return] : +# 1047| v1047_28(void) = ReturnValue : &:r1047_27, m1047_25 +# 1047| v1047_29(void) = AliasedUse : ~m1047_20 +# 1047| v1047_30(void) = ExitFunction : + +# 1049| void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::~() +# 1049| Block 0 +# 1049| v1049_1(void) = EnterFunction : +# 1049| m1049_2(unknown) = AliasedDefinition : +# 1049| m1049_3(unknown) = InitializeNonLocal : +# 1049| m1049_4(unknown) = Chi : total:m1049_2, partial:m1049_3 +# 1049| r1049_5(glval) = VariableAddress[#this] : +# 1049| m1049_6(glval) = InitializeParameter[#this] : &:r1049_5 +# 1049| r1049_7(glval) = Load[#this] : &:r1049_5, m1049_6 +# 1049| m1049_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1049_7 +#-----| v0_1(void) = NoOp : +# 1049| r1049_9(glval) = FieldAddress[s] : m1049_6 +# 1049| r1049_10(glval) = FunctionAddress[~String] : +# 1049| v1049_11(void) = Call[~String] : func:r1049_10, this:r1049_9 +# 1049| m1049_12(unknown) = ^CallSideEffect : ~m1049_4 +# 1049| m1049_13(unknown) = Chi : total:m1049_4, partial:m1049_12 +# 1049| v1049_14(void) = ReturnIndirection[#this] : &:r1049_7, m1049_8 +# 1049| v1049_15(void) = ReturnVoid : +# 1049| v1049_16(void) = AliasedUse : ~m1049_13 +# 1049| v1049_17(void) = ExitFunction : + +# 1049| char (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::operator()(float) const +# 1049| Block 0 +# 1049| v1049_1(void) = EnterFunction : +# 1049| m1049_2(unknown) = AliasedDefinition : +# 1049| m1049_3(unknown) = InitializeNonLocal : +# 1049| m1049_4(unknown) = Chi : total:m1049_2, partial:m1049_3 +# 1049| r1049_5(glval) = VariableAddress[#this] : +# 1049| m1049_6(glval) = InitializeParameter[#this] : &:r1049_5 +# 1049| r1049_7(glval) = Load[#this] : &:r1049_5, m1049_6 +# 1049| m1049_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1049_7 +# 1049| r1049_9(glval) = VariableAddress[f] : +# 1049| m1049_10(float) = InitializeParameter[f] : &:r1049_9 +# 1049| r1049_11(glval) = VariableAddress[#return] : +# 1049| r1049_12(glval) = VariableAddress[#this] : +# 1049| r1049_13(lambda [] type at line 1049, col. 30 *) = Load[#this] : &:r1049_12, m1049_6 +# 1049| r1049_14(glval) = FieldAddress[s] : r1049_13 +# 1049| r1049_15(glval) = FunctionAddress[c_str] : +# 1049| r1049_16(char *) = Call[c_str] : func:r1049_15, this:r1049_14 +# 1049| m1049_17(unknown) = ^CallSideEffect : ~m1049_4 +# 1049| m1049_18(unknown) = Chi : total:m1049_4, partial:m1049_17 +# 1049| v1049_19(void) = ^IndirectReadSideEffect[-1] : &:r1049_14, ~m1049_8 +# 1049| r1049_20(int) = Constant[0] : +# 1049| r1049_21(glval) = PointerAdd[1] : r1049_16, r1049_20 +# 1049| r1049_22(char) = Load[?] : &:r1049_21, ~m1049_18 +# 1049| m1049_23(char) = Store[#return] : &:r1049_11, r1049_22 +# 1049| v1049_24(void) = ReturnIndirection[#this] : &:r1049_7, m1049_8 +# 1049| r1049_25(glval) = VariableAddress[#return] : +# 1049| v1049_26(void) = ReturnValue : &:r1049_25, m1049_23 +# 1049| v1049_27(void) = AliasedUse : ~m1049_18 +# 1049| v1049_28(void) = ExitFunction : + +# 1051| char (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::operator()(float) const +# 1051| Block 0 +# 1051| v1051_1(void) = EnterFunction : +# 1051| m1051_2(unknown) = AliasedDefinition : +# 1051| m1051_3(unknown) = InitializeNonLocal : +# 1051| m1051_4(unknown) = Chi : total:m1051_2, partial:m1051_3 +# 1051| r1051_5(glval) = VariableAddress[#this] : +# 1051| m1051_6(glval) = InitializeParameter[#this] : &:r1051_5 +# 1051| r1051_7(glval) = Load[#this] : &:r1051_5, m1051_6 +# 1051| m1051_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1051_7 +# 1051| r1051_9(glval) = VariableAddress[f] : +# 1051| m1051_10(float) = InitializeParameter[f] : &:r1051_9 +# 1051| r1051_11(glval) = VariableAddress[#return] : +# 1051| r1051_12(glval) = VariableAddress[#this] : +# 1051| r1051_13(lambda [] type at line 1051, col. 32 *) = Load[#this] : &:r1051_12, m1051_6 +# 1051| r1051_14(glval) = FieldAddress[s] : r1051_13 +# 1051| r1051_15(String &) = Load[?] : &:r1051_14, ~m1051_8 +# 1051| r1051_16(glval) = CopyValue : r1051_15 +# 1051| r1051_17(glval) = FunctionAddress[c_str] : +# 1051| r1051_18(char *) = Call[c_str] : func:r1051_17, this:r1051_16 +# 1051| m1051_19(unknown) = ^CallSideEffect : ~m1051_4 +# 1051| m1051_20(unknown) = Chi : total:m1051_4, partial:m1051_19 +# 1051| v1051_21(void) = ^IndirectReadSideEffect[-1] : &:r1051_16, ~m1051_20 +# 1051| r1051_22(glval) = VariableAddress[#this] : +# 1051| r1051_23(lambda [] type at line 1051, col. 32 *) = Load[#this] : &:r1051_22, m1051_6 +# 1051| r1051_24(glval) = FieldAddress[x] : r1051_23 +# 1051| r1051_25(int) = Load[?] : &:r1051_24, ~m1051_8 +# 1051| r1051_26(glval) = PointerAdd[1] : r1051_18, r1051_25 +# 1051| r1051_27(char) = Load[?] : &:r1051_26, ~m1051_20 +# 1051| m1051_28(char) = Store[#return] : &:r1051_11, r1051_27 +# 1051| v1051_29(void) = ReturnIndirection[#this] : &:r1051_7, m1051_8 +# 1051| r1051_30(glval) = VariableAddress[#return] : +# 1051| v1051_31(void) = ReturnValue : &:r1051_30, m1051_28 +# 1051| v1051_32(void) = AliasedUse : ~m1051_20 +# 1051| v1051_33(void) = ExitFunction : + +# 1054| char (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::operator()(float) const +# 1054| Block 0 +# 1054| v1054_1(void) = EnterFunction : +# 1054| m1054_2(unknown) = AliasedDefinition : +# 1054| m1054_3(unknown) = InitializeNonLocal : +# 1054| m1054_4(unknown) = Chi : total:m1054_2, partial:m1054_3 +# 1054| r1054_5(glval) = VariableAddress[#this] : +# 1054| m1054_6(glval) = InitializeParameter[#this] : &:r1054_5 +# 1054| r1054_7(glval) = Load[#this] : &:r1054_5, m1054_6 +# 1054| m1054_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1054_7 +# 1054| r1054_9(glval) = VariableAddress[f] : +# 1054| m1054_10(float) = InitializeParameter[f] : &:r1054_9 +# 1054| r1054_11(glval) = VariableAddress[#return] : +# 1054| r1054_12(glval) = VariableAddress[#this] : +# 1054| r1054_13(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_12, m1054_6 +# 1054| r1054_14(glval) = FieldAddress[s] : r1054_13 +# 1054| r1054_15(String &) = Load[?] : &:r1054_14, ~m1054_8 +# 1054| r1054_16(glval) = CopyValue : r1054_15 +# 1054| r1054_17(glval) = FunctionAddress[c_str] : +# 1054| r1054_18(char *) = Call[c_str] : func:r1054_17, this:r1054_16 +# 1054| m1054_19(unknown) = ^CallSideEffect : ~m1054_4 +# 1054| m1054_20(unknown) = Chi : total:m1054_4, partial:m1054_19 +# 1054| v1054_21(void) = ^IndirectReadSideEffect[-1] : &:r1054_16, ~m1054_20 +# 1054| r1054_22(glval) = VariableAddress[#this] : +# 1054| r1054_23(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_22, m1054_6 +# 1054| r1054_24(glval) = FieldAddress[x] : r1054_23 +# 1054| r1054_25(int) = Load[?] : &:r1054_24, ~m1054_8 +# 1054| r1054_26(glval) = VariableAddress[#this] : +# 1054| r1054_27(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_26, m1054_6 +# 1054| r1054_28(glval) = FieldAddress[i] : r1054_27 +# 1054| r1054_29(int) = Load[?] : &:r1054_28, ~m1054_8 +# 1054| r1054_30(int) = Add : r1054_25, r1054_29 +# 1054| r1054_31(glval) = VariableAddress[#this] : +# 1054| r1054_32(lambda [] type at line 1054, col. 23 *) = Load[#this] : &:r1054_31, m1054_6 +# 1054| r1054_33(glval) = FieldAddress[j] : r1054_32 +# 1054| r1054_34(int &) = Load[?] : &:r1054_33, ~m1054_8 +# 1054| r1054_35(int) = Load[?] : &:r1054_34, ~m1054_20 +# 1054| r1054_36(int) = Sub : r1054_30, r1054_35 +# 1054| r1054_37(glval) = PointerAdd[1] : r1054_18, r1054_36 +# 1054| r1054_38(char) = Load[?] : &:r1054_37, ~m1054_20 +# 1054| m1054_39(char) = Store[#return] : &:r1054_11, r1054_38 +# 1054| v1054_40(void) = ReturnIndirection[#this] : &:r1054_7, m1054_8 +# 1054| r1054_41(glval) = VariableAddress[#return] : +# 1054| v1054_42(void) = ReturnValue : &:r1054_41, m1054_39 +# 1054| v1054_43(void) = AliasedUse : ~m1054_20 +# 1054| v1054_44(void) = ExitFunction : + +# 1077| void RangeBasedFor(vector const&) +# 1077| Block 0 +# 1077| v1077_1(void) = EnterFunction : +# 1077| m1077_2(unknown) = AliasedDefinition : +# 1077| m1077_3(unknown) = InitializeNonLocal : +# 1077| m1077_4(unknown) = Chi : total:m1077_2, partial:m1077_3 +# 1077| r1077_5(glval &>) = VariableAddress[v] : +# 1077| m1077_6(vector &) = InitializeParameter[v] : &:r1077_5 +# 1077| r1077_7(vector &) = Load[v] : &:r1077_5, m1077_6 +# 1077| m1077_8(unknown) = InitializeIndirection[v] : &:r1077_7 +# 1078| r1078_1(glval &>) = VariableAddress[(__range)] : +# 1078| r1078_2(glval &>) = VariableAddress[v] : +# 1078| r1078_3(vector &) = Load[v] : &:r1078_2, m1077_6 +# 1078| r1078_4(glval>) = CopyValue : r1078_3 +# 1078| r1078_5(vector &) = CopyValue : r1078_4 +# 1078| m1078_6(vector &) = Store[(__range)] : &:r1078_1, r1078_5 +# 1078| r1078_7(glval) = VariableAddress[(__begin)] : +# 1078| r1078_8(glval &>) = VariableAddress[(__range)] : +# 1078| r1078_9(vector &) = Load[(__range)] : &:r1078_8, m1078_6 +#-----| r0_1(glval>) = CopyValue : r1078_9 +# 1078| r1078_10(glval) = FunctionAddress[begin] : +# 1078| r1078_11(iterator) = Call[begin] : func:r1078_10, this:r0_1 +# 1078| m1078_12(unknown) = ^CallSideEffect : ~m1077_4 +# 1078| m1078_13(unknown) = Chi : total:m1077_4, partial:m1078_12 +#-----| v0_2(void) = ^IndirectReadSideEffect[-1] : &:r0_1, ~m1077_8 +# 1078| m1078_14(iterator) = Store[(__begin)] : &:r1078_7, r1078_11 +# 1078| r1078_15(glval) = VariableAddress[(__end)] : +# 1078| r1078_16(glval &>) = VariableAddress[(__range)] : +# 1078| r1078_17(vector &) = Load[(__range)] : &:r1078_16, m1078_6 +#-----| r0_3(glval>) = CopyValue : r1078_17 +# 1078| r1078_18(glval) = FunctionAddress[end] : +# 1078| r1078_19(iterator) = Call[end] : func:r1078_18, this:r0_3 +# 1078| m1078_20(unknown) = ^CallSideEffect : ~m1078_13 +# 1078| m1078_21(unknown) = Chi : total:m1078_13, partial:m1078_20 +#-----| v0_4(void) = ^IndirectReadSideEffect[-1] : &:r0_3, ~m1077_8 +# 1078| m1078_22(iterator) = Store[(__end)] : &:r1078_15, r1078_19 +#-----| Goto -> Block 1 + +# 1078| Block 1 +# 1078| m1078_23(iterator) = Phi : from 0:m1078_14, from 4:m1078_49 +# 1078| m1078_24(unknown) = Phi : from 0:~m1078_21, from 4:~m1078_46 +# 1078| r1078_25(glval) = VariableAddress[(__begin)] : +#-----| r0_5(glval) = Convert : r1078_25 +# 1078| r1078_26(glval) = FunctionAddress[operator!=] : +# 1078| r1078_27(glval) = VariableAddress[(__end)] : +# 1078| r1078_28(iterator) = Load[(__end)] : &:r1078_27, m1078_22 +# 1078| r1078_29(bool) = Call[operator!=] : func:r1078_26, this:r0_5, 0:r1078_28 +# 1078| m1078_30(unknown) = ^CallSideEffect : ~m1078_24 +# 1078| m1078_31(unknown) = Chi : total:m1078_24, partial:m1078_30 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m1078_23 +# 1078| v1078_32(void) = ConditionalBranch : r1078_29 +#-----| False -> Block 5 +#-----| True -> Block 2 + +# 1078| Block 2 +# 1078| r1078_33(glval) = VariableAddress[e] : +# 1078| r1078_34(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r1078_34 +# 1078| r1078_35(glval) = FunctionAddress[operator*] : +# 1078| r1078_36(int &) = Call[operator*] : func:r1078_35, this:r0_7 +# 1078| m1078_37(unknown) = ^CallSideEffect : ~m1078_31 +# 1078| m1078_38(unknown) = Chi : total:m1078_31, partial:m1078_37 +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m1078_23 +# 1078| r1078_39(int) = Load[?] : &:r1078_36, ~m1078_38 +# 1078| m1078_40(int) = Store[e] : &:r1078_33, r1078_39 +# 1079| r1079_1(glval) = VariableAddress[e] : +# 1079| r1079_2(int) = Load[e] : &:r1079_1, m1078_40 +# 1079| r1079_3(int) = Constant[0] : +# 1079| r1079_4(bool) = CompareGT : r1079_2, r1079_3 +# 1079| v1079_5(void) = ConditionalBranch : r1079_4 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 1080| Block 3 +# 1080| v1080_1(void) = NoOp : +#-----| Goto -> Block 4 + +# 1078| Block 4 +# 1078| v1078_41(void) = NoOp : +# 1078| r1078_42(glval) = VariableAddress[(__begin)] : +# 1078| r1078_43(glval) = FunctionAddress[operator++] : +# 1078| r1078_44(iterator &) = Call[operator++] : func:r1078_43, this:r1078_42 +# 1078| m1078_45(unknown) = ^CallSideEffect : ~m1078_38 +# 1078| m1078_46(unknown) = Chi : total:m1078_38, partial:m1078_45 +# 1078| v1078_47(void) = ^IndirectReadSideEffect[-1] : &:r1078_42, m1078_23 +# 1078| m1078_48(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r1078_42 +# 1078| m1078_49(iterator) = Chi : total:m1078_23, partial:m1078_48 +# 1078| r1078_50(glval) = CopyValue : r1078_44 +#-----| Goto (back edge) -> Block 1 + +# 1084| Block 5 +# 1084| r1084_1(glval &>) = VariableAddress[(__range)] : +# 1084| r1084_2(glval &>) = VariableAddress[v] : +# 1084| r1084_3(vector &) = Load[v] : &:r1084_2, m1077_6 +# 1084| r1084_4(glval>) = CopyValue : r1084_3 +# 1084| r1084_5(vector &) = CopyValue : r1084_4 +# 1084| m1084_6(vector &) = Store[(__range)] : &:r1084_1, r1084_5 +# 1084| r1084_7(glval) = VariableAddress[(__begin)] : +# 1084| r1084_8(glval &>) = VariableAddress[(__range)] : +# 1084| r1084_9(vector &) = Load[(__range)] : &:r1084_8, m1084_6 +#-----| r0_9(glval>) = CopyValue : r1084_9 +# 1084| r1084_10(glval) = FunctionAddress[begin] : +# 1084| r1084_11(iterator) = Call[begin] : func:r1084_10, this:r0_9 +# 1084| m1084_12(unknown) = ^CallSideEffect : ~m1078_31 +# 1084| m1084_13(unknown) = Chi : total:m1078_31, partial:m1084_12 +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m1077_8 +# 1084| m1084_14(iterator) = Store[(__begin)] : &:r1084_7, r1084_11 +# 1084| r1084_15(glval) = VariableAddress[(__end)] : +# 1084| r1084_16(glval &>) = VariableAddress[(__range)] : +# 1084| r1084_17(vector &) = Load[(__range)] : &:r1084_16, m1084_6 +#-----| r0_11(glval>) = CopyValue : r1084_17 +# 1084| r1084_18(glval) = FunctionAddress[end] : +# 1084| r1084_19(iterator) = Call[end] : func:r1084_18, this:r0_11 +# 1084| m1084_20(unknown) = ^CallSideEffect : ~m1084_13 +# 1084| m1084_21(unknown) = Chi : total:m1084_13, partial:m1084_20 +#-----| v0_12(void) = ^IndirectReadSideEffect[-1] : &:r0_11, ~m1077_8 +# 1084| m1084_22(iterator) = Store[(__end)] : &:r1084_15, r1084_19 +#-----| Goto -> Block 6 + +# 1084| Block 6 +# 1084| m1084_23(iterator) = Phi : from 5:m1084_14, from 7:m1084_40 +# 1084| m1084_24(unknown) = Phi : from 5:~m1084_21, from 7:~m1084_37 +# 1084| r1084_25(glval) = VariableAddress[(__begin)] : +#-----| r0_13(glval) = Convert : r1084_25 +# 1084| r1084_26(glval) = FunctionAddress[operator!=] : +# 1084| r1084_27(glval) = VariableAddress[(__end)] : +# 1084| r1084_28(iterator) = Load[(__end)] : &:r1084_27, m1084_22 +# 1084| r1084_29(bool) = Call[operator!=] : func:r1084_26, this:r0_13, 0:r1084_28 +# 1084| m1084_30(unknown) = ^CallSideEffect : ~m1084_24 +# 1084| m1084_31(unknown) = Chi : total:m1084_24, partial:m1084_30 +#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_13, m1084_23 +# 1084| v1084_32(void) = ConditionalBranch : r1084_29 +#-----| False -> Block 10 +#-----| True -> Block 8 + +# 1084| Block 7 +# 1084| r1084_33(glval) = VariableAddress[(__begin)] : +# 1084| r1084_34(glval) = FunctionAddress[operator++] : +# 1084| r1084_35(iterator &) = Call[operator++] : func:r1084_34, this:r1084_33 +# 1084| m1084_36(unknown) = ^CallSideEffect : ~m1084_47 +# 1084| m1084_37(unknown) = Chi : total:m1084_47, partial:m1084_36 +# 1084| v1084_38(void) = ^IndirectReadSideEffect[-1] : &:r1084_33, m1084_23 +# 1084| m1084_39(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r1084_33 +# 1084| m1084_40(iterator) = Chi : total:m1084_23, partial:m1084_39 +# 1084| r1084_41(glval) = CopyValue : r1084_35 +#-----| Goto (back edge) -> Block 6 + +# 1084| Block 8 +# 1084| r1084_42(glval) = VariableAddress[e] : +# 1084| r1084_43(glval) = VariableAddress[(__begin)] : +#-----| r0_15(glval) = Convert : r1084_43 +# 1084| r1084_44(glval) = FunctionAddress[operator*] : +# 1084| r1084_45(int &) = Call[operator*] : func:r1084_44, this:r0_15 +# 1084| m1084_46(unknown) = ^CallSideEffect : ~m1084_31 +# 1084| m1084_47(unknown) = Chi : total:m1084_31, partial:m1084_46 +#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m1084_23 +# 1084| r1084_48(glval) = CopyValue : r1084_45 +# 1084| r1084_49(glval) = Convert : r1084_48 +# 1084| r1084_50(int &) = CopyValue : r1084_49 +# 1084| m1084_51(int &) = Store[e] : &:r1084_42, r1084_50 +# 1085| r1085_1(glval) = VariableAddress[e] : +# 1085| r1085_2(int &) = Load[e] : &:r1085_1, m1084_51 +# 1085| r1085_3(int) = Load[?] : &:r1085_2, ~m1084_47 +# 1085| r1085_4(int) = Constant[5] : +# 1085| r1085_5(bool) = CompareLT : r1085_3, r1085_4 +# 1085| v1085_6(void) = ConditionalBranch : r1085_5 +#-----| False -> Block 7 +#-----| True -> Block 9 + +# 1086| Block 9 +# 1086| v1086_1(void) = NoOp : +#-----| Goto -> Block 10 + +# 1088| Block 10 +# 1088| m1088_1(unknown) = Phi : from 6:~m1084_31, from 9:~m1084_47 +# 1088| v1088_2(void) = NoOp : +# 1089| v1089_1(void) = NoOp : +# 1077| v1077_9(void) = ReturnIndirection[v] : &:r1077_7, m1077_8 +# 1077| v1077_10(void) = ReturnVoid : +# 1077| v1077_11(void) = AliasedUse : ~m1088_1 +# 1077| v1077_12(void) = ExitFunction : + +# 1108| int AsmStmt(int) +# 1108| Block 0 +# 1108| v1108_1(void) = EnterFunction : +# 1108| m1108_2(unknown) = AliasedDefinition : +# 1108| m1108_3(unknown) = InitializeNonLocal : +# 1108| m1108_4(unknown) = Chi : total:m1108_2, partial:m1108_3 +# 1108| r1108_5(glval) = VariableAddress[x] : +# 1108| m1108_6(int) = InitializeParameter[x] : &:r1108_5 +# 1109| m1109_1(unknown) = InlineAsm : ~m1108_4 +# 1109| m1109_2(unknown) = Chi : total:m1108_4, partial:m1109_1 +# 1110| r1110_1(glval) = VariableAddress[#return] : +# 1110| r1110_2(glval) = VariableAddress[x] : +# 1110| r1110_3(int) = Load[x] : &:r1110_2, m1108_6 +# 1110| m1110_4(int) = Store[#return] : &:r1110_1, r1110_3 +# 1108| r1108_7(glval) = VariableAddress[#return] : +# 1108| v1108_8(void) = ReturnValue : &:r1108_7, m1110_4 +# 1108| v1108_9(void) = AliasedUse : ~m1109_2 +# 1108| v1108_10(void) = ExitFunction : + +# 1113| void AsmStmtWithOutputs(unsigned int&, unsigned int, unsigned int&, unsigned int) +# 1113| Block 0 +# 1113| v1113_1(void) = EnterFunction : +# 1113| m1113_2(unknown) = AliasedDefinition : +# 1113| m1113_3(unknown) = InitializeNonLocal : +# 1113| m1113_4(unknown) = Chi : total:m1113_2, partial:m1113_3 +# 1113| r1113_5(glval) = VariableAddress[a] : +# 1113| m1113_6(unsigned int &) = InitializeParameter[a] : &:r1113_5 +# 1113| r1113_7(unsigned int &) = Load[a] : &:r1113_5, m1113_6 +# 1113| m1113_8(unknown) = InitializeIndirection[a] : &:r1113_7 +# 1113| r1113_9(glval) = VariableAddress[b] : +# 1113| m1113_10(unsigned int) = InitializeParameter[b] : &:r1113_9 +# 1113| r1113_11(glval) = VariableAddress[c] : +# 1113| m1113_12(unsigned int &) = InitializeParameter[c] : &:r1113_11 +# 1113| r1113_13(unsigned int &) = Load[c] : &:r1113_11, m1113_12 +# 1113| m1113_14(unknown) = InitializeIndirection[c] : &:r1113_13 +# 1113| r1113_15(glval) = VariableAddress[d] : +# 1113| m1113_16(unsigned int) = InitializeParameter[d] : &:r1113_15 +# 1118| r1118_1(glval) = VariableAddress[a] : +# 1118| r1118_2(unsigned int &) = Load[a] : &:r1118_1, m1113_6 +# 1118| r1118_3(glval) = CopyValue : r1118_2 +# 1118| r1118_4(glval) = VariableAddress[b] : +# 1118| r1118_5(glval) = VariableAddress[c] : +# 1118| r1118_6(unsigned int &) = Load[c] : &:r1118_5, m1113_12 +# 1118| r1118_7(unsigned int) = Load[?] : &:r1118_6, ~m1113_14 +# 1118| r1118_8(glval) = VariableAddress[d] : +# 1118| r1118_9(unsigned int) = Load[d] : &:r1118_8, m1113_16 +# 1115| m1115_1(unknown) = InlineAsm : ~m1113_4, 0:r1118_3, 1:r1118_4, 2:r1118_7, 3:r1118_9 +# 1115| m1115_2(unknown) = Chi : total:m1113_4, partial:m1115_1 +# 1120| v1120_1(void) = NoOp : +# 1113| v1113_17(void) = ReturnIndirection[a] : &:r1113_7, m1113_8 +# 1113| v1113_18(void) = ReturnIndirection[c] : &:r1113_13, m1113_14 +# 1113| v1113_19(void) = ReturnVoid : +# 1113| v1113_20(void) = AliasedUse : ~m1115_2 +# 1113| v1113_21(void) = ExitFunction : + +# 1122| void ExternDeclarations() +# 1122| Block 0 +# 1122| v1122_1(void) = EnterFunction : +# 1122| m1122_2(unknown) = AliasedDefinition : +# 1122| m1122_3(unknown) = InitializeNonLocal : +# 1122| m1122_4(unknown) = Chi : total:m1122_2, partial:m1122_3 +# 1125| r1125_1(glval) = VariableAddress[x] : +# 1125| m1125_2(int) = Uninitialized[x] : &:r1125_1 +# 1126| r1126_1(glval) = VariableAddress[y] : +# 1126| m1126_2(int) = Uninitialized[y] : &:r1126_1 +# 1127| r1127_1(glval) = VariableAddress[h] : +# 1127| m1127_2(int) = Uninitialized[h] : &:r1127_1 +# 1129| v1129_1(void) = NoOp : +# 1122| v1122_5(void) = ReturnVoid : +# 1122| v1122_6(void) = AliasedUse : m1122_3 +# 1122| v1122_7(void) = ExitFunction : + +# 1137| void ExternDeclarationsInMacro() +# 1137| Block 0 +# 1137| v1137_1(void) = EnterFunction : +# 1137| m1137_2(unknown) = AliasedDefinition : +# 1137| m1137_3(unknown) = InitializeNonLocal : +# 1137| m1137_4(unknown) = Chi : total:m1137_2, partial:m1137_3 +# 1139| r1139_1(glval) = VariableAddress[i] : +# 1139| r1139_2(int) = Constant[0] : +# 1139| m1139_3(int) = Store[i] : &:r1139_1, r1139_2 +#-----| Goto -> Block 1 + +# 1139| Block 1 +# 1139| m1139_4(int) = Phi : from 0:m1139_3, from 2:m1139_14 +# 1139| r1139_5(glval) = VariableAddress[i] : +# 1139| r1139_6(int) = Load[i] : &:r1139_5, m1139_4 +# 1139| r1139_7(int) = Constant[10] : +# 1139| r1139_8(bool) = CompareLT : r1139_6, r1139_7 +# 1139| v1139_9(void) = ConditionalBranch : r1139_8 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 1139| Block 2 +# 1139| r1139_10(glval) = VariableAddress[i] : +# 1139| r1139_11(int) = Load[i] : &:r1139_10, m1139_4 +# 1139| r1139_12(int) = Constant[1] : +# 1139| r1139_13(int) = Add : r1139_11, r1139_12 +# 1139| m1139_14(int) = Store[i] : &:r1139_10, r1139_13 +#-----| Goto (back edge) -> Block 1 + +# 1139| Block 3 +# 1139| v1139_15(void) = NoOp : +# 1140| v1140_1(void) = NoOp : +# 1137| v1137_5(void) = ReturnVoid : +# 1137| v1137_6(void) = AliasedUse : m1137_3 +# 1137| v1137_7(void) = ExitFunction : + +# 1142| void TryCatchNoCatchAny(bool) +# 1142| Block 0 +# 1142| v1142_1(void) = EnterFunction : +# 1142| m1142_2(unknown) = AliasedDefinition : +# 1142| m1142_3(unknown) = InitializeNonLocal : +# 1142| m1142_4(unknown) = Chi : total:m1142_2, partial:m1142_3 +# 1142| r1142_5(glval) = VariableAddress[b] : +# 1142| m1142_6(bool) = InitializeParameter[b] : &:r1142_5 +# 1144| r1144_1(glval) = VariableAddress[x] : +# 1144| r1144_2(int) = Constant[5] : +# 1144| m1144_3(int) = Store[x] : &:r1144_1, r1144_2 +# 1145| r1145_1(glval) = VariableAddress[b] : +# 1145| r1145_2(bool) = Load[b] : &:r1145_1, m1142_6 +# 1145| v1145_3(void) = ConditionalBranch : r1145_2 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 1142| Block 1 +# 1142| m1142_7(unknown) = Phi : from 2:~m1142_10, from 10:~m1142_4 +# 1142| v1142_8(void) = AliasedUse : ~m1142_7 +# 1142| v1142_9(void) = ExitFunction : + +# 1142| Block 2 +# 1142| m1142_10(unknown) = Phi : from 7:~m1154_8, from 8:~m1142_4 +# 1142| v1142_11(void) = Unwind : +#-----| Goto -> Block 1 + +# 1146| Block 3 +# 1146| r1146_1(glval) = VariableAddress[#throw1146:7] : +# 1146| r1146_2(glval) = StringConstant["string literal"] : +# 1146| r1146_3(char *) = Convert : r1146_2 +# 1146| m1146_4(char *) = Store[#throw1146:7] : &:r1146_1, r1146_3 +# 1146| v1146_5(void) = ThrowValue : &:r1146_1, m1146_4 +#-----| Exception -> Block 6 + +# 1148| Block 4 +# 1148| r1148_1(glval) = VariableAddress[x] : +# 1148| r1148_2(int) = Load[x] : &:r1148_1, m1144_3 +# 1148| r1148_3(int) = Constant[2] : +# 1148| r1148_4(bool) = CompareLT : r1148_2, r1148_3 +# 1148| v1148_5(void) = ConditionalBranch : r1148_4 +#-----| False -> Block 5 +#-----| True -> Block 11 + +# 1151| Block 5 +# 1151| r1151_1(int) = Constant[7] : +# 1151| r1151_2(glval) = VariableAddress[x] : +# 1151| m1151_3(int) = Store[x] : &:r1151_2, r1151_1 +#-----| Goto -> Block 10 + +# 1153| Block 6 +# 1153| v1153_1(void) = CatchByType[const char *] : +#-----| Exception -> Block 8 +#-----| Goto -> Block 7 + +# 1153| Block 7 +# 1153| r1153_2(glval) = VariableAddress[s] : +# 1153| m1153_3(char *) = InitializeParameter[s] : &:r1153_2 +# 1153| r1153_4(char *) = Load[s] : &:r1153_2, m1153_3 +# 1153| m1153_5(unknown) = InitializeIndirection[s] : &:r1153_4 +# 1154| r1154_1(glval) = VariableAddress[#throw1154:5] : +# 1154| m1154_2(String) = Uninitialized[#throw1154:5] : &:r1154_1 +# 1154| r1154_3(glval) = FunctionAddress[String] : +# 1154| r1154_4(glval) = VariableAddress[s] : +# 1154| r1154_5(char *) = Load[s] : &:r1154_4, m1153_3 +# 1154| v1154_6(void) = Call[String] : func:r1154_3, this:r1154_1, 0:r1154_5 +# 1154| m1154_7(unknown) = ^CallSideEffect : ~m1142_4 +# 1154| m1154_8(unknown) = Chi : total:m1142_4, partial:m1154_7 +# 1154| v1154_9(void) = ^BufferReadSideEffect[0] : &:r1154_5, ~m1153_5 +# 1154| m1154_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1154_1 +# 1154| m1154_11(String) = Chi : total:m1154_2, partial:m1154_10 +# 1154| v1154_12(void) = ThrowValue : &:r1154_1, m1154_11 +#-----| Exception -> Block 2 + +# 1156| Block 8 +# 1156| v1156_1(void) = CatchByType[const String &] : +#-----| Exception -> Block 2 +#-----| Goto -> Block 9 + +# 1156| Block 9 +# 1156| r1156_2(glval) = VariableAddress[e] : +# 1156| m1156_3(String &) = InitializeParameter[e] : &:r1156_2 +# 1156| r1156_4(String &) = Load[e] : &:r1156_2, m1156_3 +# 1156| m1156_5(unknown) = InitializeIndirection[e] : &:r1156_4 +# 1156| v1156_6(void) = NoOp : +#-----| Goto -> Block 10 + +# 1158| Block 10 +# 1158| v1158_1(void) = NoOp : +# 1142| v1142_12(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 1142| Block 11 +# 1142| v1142_13(void) = Unreached : + +# 1162| void VectorTypes(int) +# 1162| Block 0 +# 1162| v1162_1(void) = EnterFunction : +# 1162| m1162_2(unknown) = AliasedDefinition : +# 1162| m1162_3(unknown) = InitializeNonLocal : +# 1162| m1162_4(unknown) = Chi : total:m1162_2, partial:m1162_3 +# 1162| r1162_5(glval) = VariableAddress[i] : +# 1162| m1162_6(int) = InitializeParameter[i] : &:r1162_5 +# 1163| r1163_1(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : +# 1163| m1163_2(__attribute((vector_size(16UL))) int) = Uninitialized[vi4] : &:r1163_1 +# 1163| r1163_3(int) = Constant[0] : +# 1163| r1163_4(glval) = PointerAdd[4] : r1163_1, r1163_3 +# 1163| r1163_5(int) = Constant[0] : +# 1163| m1163_6(int) = Store[?] : &:r1163_4, r1163_5 +# 1163| m1163_7(__attribute((vector_size(16UL))) int) = Chi : total:m1163_2, partial:m1163_6 +# 1163| r1163_8(int) = Constant[1] : +# 1163| r1163_9(glval) = PointerAdd[4] : r1163_1, r1163_8 +# 1163| r1163_10(int) = Constant[1] : +# 1163| m1163_11(int) = Store[?] : &:r1163_9, r1163_10 +# 1163| m1163_12(__attribute((vector_size(16UL))) int) = Chi : total:m1163_7, partial:m1163_11 +# 1163| r1163_13(int) = Constant[2] : +# 1163| r1163_14(glval) = PointerAdd[4] : r1163_1, r1163_13 +# 1163| r1163_15(int) = Constant[2] : +# 1163| m1163_16(int) = Store[?] : &:r1163_14, r1163_15 +# 1163| m1163_17(__attribute((vector_size(16UL))) int) = Chi : total:m1163_12, partial:m1163_16 +# 1163| r1163_18(int) = Constant[3] : +# 1163| r1163_19(glval) = PointerAdd[4] : r1163_1, r1163_18 +# 1163| r1163_20(int) = Constant[3] : +# 1163| m1163_21(int) = Store[?] : &:r1163_19, r1163_20 +# 1163| m1163_22(__attribute((vector_size(16UL))) int) = Chi : total:m1163_17, partial:m1163_21 +# 1164| r1164_1(glval) = VariableAddress[x] : +# 1164| r1164_2(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : +# 1164| r1164_3(glval) = VariableAddress[i] : +# 1164| r1164_4(int) = Load[i] : &:r1164_3, m1162_6 +# 1164| r1164_5(glval) = PointerAdd[4] : r1164_2, r1164_4 +# 1164| r1164_6(int) = Load[?] : &:r1164_5, ~m1163_22 +# 1164| m1164_7(int) = Store[x] : &:r1164_1, r1164_6 +# 1165| r1165_1(glval) = VariableAddress[x] : +# 1165| r1165_2(int) = Load[x] : &:r1165_1, m1164_7 +# 1165| r1165_3(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : +# 1165| r1165_4(glval) = VariableAddress[i] : +# 1165| r1165_5(int) = Load[i] : &:r1165_4, m1162_6 +# 1165| r1165_6(glval) = PointerAdd[4] : r1165_3, r1165_5 +# 1165| m1165_7(int) = Store[?] : &:r1165_6, r1165_2 +# 1165| m1165_8(__attribute((vector_size(16UL))) int) = Chi : total:m1163_22, partial:m1165_7 +# 1166| r1166_1(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4_shuffle] : +# 1166| r1166_2(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : +# 1166| r1166_3(__attribute((vector_size(16UL))) int) = Load[vi4] : &:r1166_2, m1165_8 +# 1166| r1166_4(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : +# 1166| r1166_5(__attribute((vector_size(16UL))) int) = Load[vi4] : &:r1166_4, m1165_8 +# 1166| r1166_6(int) = Constant[3] : +# 1166| r1166_7(int) = Constant[2] : +# 1166| r1166_8(int) = Constant[1] : +# 1166| r1166_9(int) = Constant[0] : +# 1166| r1166_10(__attribute((vector_size(16))) int) = BuiltIn[__builtin_shufflevector] : 0:r1166_3, 1:r1166_5, 2:r1166_6, 3:r1166_7, 4:r1166_8, 5:r1166_9 +# 1166| m1166_11(__attribute((vector_size(16UL))) int) = Store[vi4_shuffle] : &:r1166_1, r1166_10 +# 1167| r1167_1(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : +# 1167| r1167_2(__attribute((vector_size(16UL))) int) = Load[vi4] : &:r1167_1, m1165_8 +# 1167| r1167_3(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4_shuffle] : +# 1167| r1167_4(__attribute((vector_size(16UL))) int) = Load[vi4_shuffle] : &:r1167_3, m1166_11 +# 1167| r1167_5(__attribute((vector_size(16UL))) int) = Add : r1167_2, r1167_4 +# 1167| r1167_6(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : +# 1167| m1167_7(__attribute((vector_size(16UL))) int) = Store[vi4] : &:r1167_6, r1167_5 +# 1168| v1168_1(void) = NoOp : +# 1162| v1162_7(void) = ReturnVoid : +# 1162| v1162_8(void) = AliasedUse : m1162_3 +# 1162| v1162_9(void) = ExitFunction : + +# 1172| int ModeledCallTarget(int) +# 1172| Block 0 +# 1172| v1172_1(void) = EnterFunction : +# 1172| m1172_2(unknown) = AliasedDefinition : +# 1172| m1172_3(unknown) = InitializeNonLocal : +# 1172| m1172_4(unknown) = Chi : total:m1172_2, partial:m1172_3 +# 1172| r1172_5(glval) = VariableAddress[x] : +# 1172| m1172_6(int) = InitializeParameter[x] : &:r1172_5 +# 1173| r1173_1(glval) = VariableAddress[y] : +# 1173| m1173_2(int) = Uninitialized[y] : &:r1173_1 +# 1174| r1174_1(glval) = FunctionAddress[memcpy] : +# 1174| r1174_2(glval) = VariableAddress[y] : +# 1174| r1174_3(int *) = CopyValue : r1174_2 +# 1174| r1174_4(void *) = Convert : r1174_3 +# 1174| r1174_5(glval) = VariableAddress[x] : +# 1174| r1174_6(int *) = CopyValue : r1174_5 +# 1174| r1174_7(void *) = Convert : r1174_6 +# 1174| r1174_8(int) = Constant[4] : +# 1174| r1174_9(void *) = Call[memcpy] : func:r1174_1, 0:r1174_4, 1:r1174_7, 2:r1174_8 +# 1174| v1174_10(void) = ^SizedBufferReadSideEffect[1] : &:r1174_7, r1174_8, ~m1172_6 +# 1174| m1174_11(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r1174_4, r1174_8 +# 1174| m1174_12(int) = Chi : total:m1173_2, partial:m1174_11 +# 1175| r1175_1(glval) = VariableAddress[#return] : +# 1175| r1175_2(glval) = VariableAddress[y] : +# 1175| r1175_3(int) = Load[y] : &:r1175_2, m1174_12 +# 1175| m1175_4(int) = Store[#return] : &:r1175_1, r1175_3 +# 1172| r1172_7(glval) = VariableAddress[#return] : +# 1172| v1172_8(void) = ReturnValue : &:r1172_7, m1175_4 +# 1172| v1172_9(void) = AliasedUse : m1172_3 +# 1172| v1172_10(void) = ExitFunction : + +# 1178| String ReturnObjectImpl() +# 1178| Block 0 +# 1178| v1178_1(void) = EnterFunction : +# 1178| m1178_2(unknown) = AliasedDefinition : +# 1178| m1178_3(unknown) = InitializeNonLocal : +# 1178| m1178_4(unknown) = Chi : total:m1178_2, partial:m1178_3 +# 1179| r1179_1(glval) = VariableAddress[#return] : +# 1179| m1179_2(String) = Uninitialized[#return] : &:r1179_1 +# 1179| r1179_3(glval) = FunctionAddress[String] : +# 1179| r1179_4(glval) = StringConstant["foo"] : +# 1179| r1179_5(char *) = Convert : r1179_4 +# 1179| v1179_6(void) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5 +# 1179| m1179_7(unknown) = ^CallSideEffect : ~m1178_4 +# 1179| m1179_8(unknown) = Chi : total:m1178_4, partial:m1179_7 +# 1179| v1179_9(void) = ^BufferReadSideEffect[0] : &:r1179_5, ~m1178_3 +# 1179| m1179_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1179_1 +# 1179| m1179_11(String) = Chi : total:m1179_2, partial:m1179_10 +# 1178| r1178_5(glval) = VariableAddress[#return] : +# 1178| v1178_6(void) = ReturnValue : &:r1178_5, m1179_11 +# 1178| v1178_7(void) = AliasedUse : ~m1179_8 +# 1178| v1178_8(void) = ExitFunction : + +# 1182| void switch1Case(int) +# 1182| Block 0 +# 1182| v1182_1(void) = EnterFunction : +# 1182| m1182_2(unknown) = AliasedDefinition : +# 1182| m1182_3(unknown) = InitializeNonLocal : +# 1182| m1182_4(unknown) = Chi : total:m1182_2, partial:m1182_3 +# 1182| r1182_5(glval) = VariableAddress[x] : +# 1182| m1182_6(int) = InitializeParameter[x] : &:r1182_5 +# 1183| r1183_1(glval) = VariableAddress[y] : +# 1183| r1183_2(int) = Constant[0] : +# 1183| m1183_3(int) = Store[y] : &:r1183_1, r1183_2 +# 1184| r1184_1(glval) = VariableAddress[x] : +# 1184| r1184_2(int) = Load[x] : &:r1184_1, m1182_6 +# 1184| v1184_3(void) = Switch : r1184_2 +#-----| Case[1] -> Block 1 +#-----| Default -> Block 2 + +# 1185| Block 1 +# 1185| v1185_1(void) = NoOp : +# 1186| r1186_1(int) = Constant[2] : +# 1186| r1186_2(glval) = VariableAddress[y] : +# 1186| m1186_3(int) = Store[y] : &:r1186_2, r1186_1 +#-----| Goto -> Block 2 + +# 1188| Block 2 +# 1188| m1188_1(int) = Phi : from 0:m1183_3, from 1:m1186_3 +# 1188| r1188_2(glval) = VariableAddress[z] : +# 1188| r1188_3(glval) = VariableAddress[y] : +# 1188| r1188_4(int) = Load[y] : &:r1188_3, m1188_1 +# 1188| m1188_5(int) = Store[z] : &:r1188_2, r1188_4 +# 1189| v1189_1(void) = NoOp : +# 1182| v1182_7(void) = ReturnVoid : +# 1182| v1182_8(void) = AliasedUse : m1182_3 +# 1182| v1182_9(void) = ExitFunction : + +# 1191| void switch2Case_fallthrough(int) +# 1191| Block 0 +# 1191| v1191_1(void) = EnterFunction : +# 1191| m1191_2(unknown) = AliasedDefinition : +# 1191| m1191_3(unknown) = InitializeNonLocal : +# 1191| m1191_4(unknown) = Chi : total:m1191_2, partial:m1191_3 +# 1191| r1191_5(glval) = VariableAddress[x] : +# 1191| m1191_6(int) = InitializeParameter[x] : &:r1191_5 +# 1192| r1192_1(glval) = VariableAddress[y] : +# 1192| r1192_2(int) = Constant[0] : +# 1192| m1192_3(int) = Store[y] : &:r1192_1, r1192_2 +# 1193| r1193_1(glval) = VariableAddress[x] : +# 1193| r1193_2(int) = Load[x] : &:r1193_1, m1191_6 +# 1193| v1193_3(void) = Switch : r1193_2 +#-----| Case[1] -> Block 1 +#-----| Case[2] -> Block 2 +#-----| Default -> Block 3 + +# 1194| Block 1 +# 1194| v1194_1(void) = NoOp : +# 1195| r1195_1(int) = Constant[2] : +# 1195| r1195_2(glval) = VariableAddress[y] : +# 1195| m1195_3(int) = Store[y] : &:r1195_2, r1195_1 +#-----| Goto -> Block 2 + +# 1196| Block 2 +# 1196| v1196_1(void) = NoOp : +# 1197| r1197_1(int) = Constant[3] : +# 1197| r1197_2(glval) = VariableAddress[y] : +# 1197| m1197_3(int) = Store[y] : &:r1197_2, r1197_1 +#-----| Goto -> Block 3 + +# 1199| Block 3 +# 1199| m1199_1(int) = Phi : from 0:m1192_3, from 2:m1197_3 +# 1199| r1199_2(glval) = VariableAddress[z] : +# 1199| r1199_3(glval) = VariableAddress[y] : +# 1199| r1199_4(int) = Load[y] : &:r1199_3, m1199_1 +# 1199| m1199_5(int) = Store[z] : &:r1199_2, r1199_4 +# 1200| v1200_1(void) = NoOp : +# 1191| v1191_7(void) = ReturnVoid : +# 1191| v1191_8(void) = AliasedUse : m1191_3 +# 1191| v1191_9(void) = ExitFunction : + +# 1202| void switch2Case(int) +# 1202| Block 0 +# 1202| v1202_1(void) = EnterFunction : +# 1202| m1202_2(unknown) = AliasedDefinition : +# 1202| m1202_3(unknown) = InitializeNonLocal : +# 1202| m1202_4(unknown) = Chi : total:m1202_2, partial:m1202_3 +# 1202| r1202_5(glval) = VariableAddress[x] : +# 1202| m1202_6(int) = InitializeParameter[x] : &:r1202_5 +# 1203| r1203_1(glval) = VariableAddress[y] : +# 1203| r1203_2(int) = Constant[0] : +# 1203| m1203_3(int) = Store[y] : &:r1203_1, r1203_2 +# 1204| r1204_1(glval) = VariableAddress[x] : +# 1204| r1204_2(int) = Load[x] : &:r1204_1, m1202_6 +# 1204| v1204_3(void) = Switch : r1204_2 +#-----| Case[1] -> Block 1 +#-----| Case[2] -> Block 2 +#-----| Default -> Block 3 + +# 1205| Block 1 +# 1205| v1205_1(void) = NoOp : +# 1206| r1206_1(int) = Constant[2] : +# 1206| r1206_2(glval) = VariableAddress[y] : +# 1206| m1206_3(int) = Store[y] : &:r1206_2, r1206_1 +# 1207| v1207_1(void) = NoOp : +#-----| Goto -> Block 3 + +# 1208| Block 2 +# 1208| v1208_1(void) = NoOp : +# 1209| r1209_1(int) = Constant[3] : +# 1209| r1209_2(glval) = VariableAddress[y] : +# 1209| m1209_3(int) = Store[y] : &:r1209_2, r1209_1 +#-----| Goto -> Block 3 + +# 1210| Block 3 +# 1210| m1210_1(int) = Phi : from 0:m1203_3, from 1:m1206_3, from 2:m1209_3 +# 1210| v1210_2(void) = NoOp : +# 1211| r1211_1(glval) = VariableAddress[z] : +# 1211| r1211_2(glval) = VariableAddress[y] : +# 1211| r1211_3(int) = Load[y] : &:r1211_2, m1210_1 +# 1211| m1211_4(int) = Store[z] : &:r1211_1, r1211_3 +# 1212| v1212_1(void) = NoOp : +# 1202| v1202_7(void) = ReturnVoid : +# 1202| v1202_8(void) = AliasedUse : m1202_3 +# 1202| v1202_9(void) = ExitFunction : + +# 1214| void switch2Case_default(int) +# 1214| Block 0 +# 1214| v1214_1(void) = EnterFunction : +# 1214| m1214_2(unknown) = AliasedDefinition : +# 1214| m1214_3(unknown) = InitializeNonLocal : +# 1214| m1214_4(unknown) = Chi : total:m1214_2, partial:m1214_3 +# 1214| r1214_5(glval) = VariableAddress[x] : +# 1214| m1214_6(int) = InitializeParameter[x] : &:r1214_5 +# 1215| r1215_1(glval) = VariableAddress[y] : +# 1215| r1215_2(int) = Constant[0] : +# 1215| m1215_3(int) = Store[y] : &:r1215_1, r1215_2 +# 1216| r1216_1(glval) = VariableAddress[x] : +# 1216| r1216_2(int) = Load[x] : &:r1216_1, m1214_6 +# 1216| v1216_3(void) = Switch : r1216_2 +#-----| Case[1] -> Block 1 +#-----| Case[2] -> Block 2 +#-----| Default -> Block 3 + +# 1217| Block 1 +# 1217| v1217_1(void) = NoOp : +# 1218| r1218_1(int) = Constant[2] : +# 1218| r1218_2(glval) = VariableAddress[y] : +# 1218| m1218_3(int) = Store[y] : &:r1218_2, r1218_1 +# 1219| v1219_1(void) = NoOp : +#-----| Goto -> Block 4 + +# 1221| Block 2 +# 1221| v1221_1(void) = NoOp : +# 1222| r1222_1(int) = Constant[3] : +# 1222| r1222_2(glval) = VariableAddress[y] : +# 1222| m1222_3(int) = Store[y] : &:r1222_2, r1222_1 +# 1223| v1223_1(void) = NoOp : +#-----| Goto -> Block 4 + +# 1225| Block 3 +# 1225| v1225_1(void) = NoOp : +# 1226| r1226_1(int) = Constant[4] : +# 1226| r1226_2(glval) = VariableAddress[y] : +# 1226| m1226_3(int) = Store[y] : &:r1226_2, r1226_1 +#-----| Goto -> Block 4 + +# 1227| Block 4 +# 1227| m1227_1(int) = Phi : from 1:m1218_3, from 2:m1222_3, from 3:m1226_3 +# 1227| v1227_2(void) = NoOp : +# 1228| r1228_1(glval) = VariableAddress[z] : +# 1228| r1228_2(glval) = VariableAddress[y] : +# 1228| r1228_3(int) = Load[y] : &:r1228_2, m1227_1 +# 1228| m1228_4(int) = Store[z] : &:r1228_1, r1228_3 +# 1229| v1229_1(void) = NoOp : +# 1214| v1214_7(void) = ReturnVoid : +# 1214| v1214_8(void) = AliasedUse : m1214_3 +# 1214| v1214_9(void) = ExitFunction : + +# 1231| int staticLocalInit(int) +# 1231| Block 0 +# 1231| v1231_1(void) = EnterFunction : +# 1231| m1231_2(unknown) = AliasedDefinition : +# 1231| m1231_3(unknown) = InitializeNonLocal : +# 1231| m1231_4(unknown) = Chi : total:m1231_2, partial:m1231_3 +# 1231| r1231_5(glval) = VariableAddress[x] : +# 1231| m1231_6(int) = InitializeParameter[x] : &:r1231_5 +# 1234| r1234_1(glval) = VariableAddress[c#init] : +# 1234| r1234_2(bool) = Load[c#init] : &:r1234_1, ~m1231_3 +# 1234| v1234_3(void) = ConditionalBranch : r1234_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 1234| Block 1 +# 1234| r1234_4(glval) = VariableAddress[c] : +# 1234| r1234_5(glval) = VariableAddress[x] : +# 1234| r1234_6(int) = Load[x] : &:r1234_5, m1231_6 +# 1234| m1234_7(int) = Store[c] : &:r1234_4, r1234_6 +# 1234| m1234_8(unknown) = Chi : total:m1231_4, partial:m1234_7 +# 1234| r1234_9(bool) = Constant[1] : +# 1234| m1234_10(bool) = Store[c#init] : &:r1234_1, r1234_9 +# 1234| m1234_11(unknown) = Chi : total:m1234_8, partial:m1234_10 +#-----| Goto -> Block 2 + +# 1237| Block 2 +# 1237| m1237_1(int) = Phi : from 0:~m1231_3, from 1:m1234_7 +# 1237| m1237_2(unknown) = Phi : from 0:~m1231_4, from 1:~m1234_11 +# 1237| r1237_3(glval) = VariableAddress[#return] : +# 1237| r1237_4(glval) = VariableAddress[a] : +# 1237| r1237_5(int) = Load[a] : &:r1237_4, ~m1237_2 +# 1237| r1237_6(glval) = VariableAddress[b] : +# 1237| r1237_7(int) = Load[b] : &:r1237_6, ~m1237_2 +# 1237| r1237_8(int) = Add : r1237_5, r1237_7 +# 1237| r1237_9(glval) = VariableAddress[c] : +# 1237| r1237_10(int) = Load[c] : &:r1237_9, m1237_1 +# 1237| r1237_11(int) = Add : r1237_8, r1237_10 +# 1237| r1237_12(glval) = VariableAddress[d] : +# 1237| r1237_13(int) = Load[d] : &:r1237_12, ~m1237_2 +# 1237| r1237_14(int) = Add : r1237_11, r1237_13 +# 1237| m1237_15(int) = Store[#return] : &:r1237_3, r1237_14 +# 1231| r1231_7(glval) = VariableAddress[#return] : +# 1231| v1231_8(void) = ReturnValue : &:r1231_7, m1237_15 +# 1231| v1231_9(void) = AliasedUse : ~m1237_2 +# 1231| v1231_10(void) = ExitFunction : + +# 1232| int a +# 1232| Block 0 +# 1232| v1232_1(void) = EnterFunction : +# 1232| m1232_2(unknown) = AliasedDefinition : +# 1232| r1232_3(glval) = VariableAddress[a] : +# 1232| r1232_4(int) = Constant[0] : +# 1232| m1232_5(int) = Store[a] : &:r1232_3, r1232_4 +# 1232| m1232_6(unknown) = Chi : total:m1232_2, partial:m1232_5 +# 1232| v1232_7(void) = ReturnVoid : +# 1232| v1232_8(void) = AliasedUse : ~m1232_6 +# 1232| v1232_9(void) = ExitFunction : + +# 1233| int b +# 1233| Block 0 +# 1233| v1233_1(void) = EnterFunction : +# 1233| m1233_2(unknown) = AliasedDefinition : +# 1233| r1233_3(glval) = VariableAddress[b] : +# 1233| r1233_4(int) = Constant[4] : +# 1233| m1233_5(int) = Store[b] : &:r1233_3, r1233_4 +# 1233| m1233_6(unknown) = Chi : total:m1233_2, partial:m1233_5 +# 1233| v1233_7(void) = ReturnVoid : +# 1233| v1233_8(void) = AliasedUse : ~m1233_6 +# 1233| v1233_9(void) = ExitFunction : + +# 1240| void staticLocalWithConstructor(char const*) +# 1240| Block 0 +# 1240| v1240_1(void) = EnterFunction : +# 1240| m1240_2(unknown) = AliasedDefinition : +# 1240| m1240_3(unknown) = InitializeNonLocal : +# 1240| m1240_4(unknown) = Chi : total:m1240_2, partial:m1240_3 +# 1240| r1240_5(glval) = VariableAddress[dynamic] : +# 1240| m1240_6(char *) = InitializeParameter[dynamic] : &:r1240_5 +# 1240| r1240_7(char *) = Load[dynamic] : &:r1240_5, m1240_6 +# 1240| m1240_8(unknown) = InitializeIndirection[dynamic] : &:r1240_7 +# 1241| r1241_1(glval) = VariableAddress[a#init] : +# 1241| r1241_2(bool) = Load[a#init] : &:r1241_1, ~m1240_3 +# 1241| v1241_3(void) = ConditionalBranch : r1241_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 1241| Block 1 +# 1241| r1241_4(glval) = VariableAddress[a] : +#-----| r0_1(glval) = FunctionAddress[String] : +#-----| v0_2(void) = Call[String] : func:r0_1, this:r1241_4 +#-----| m0_3(unknown) = ^CallSideEffect : ~m1240_4 +#-----| m0_4(unknown) = Chi : total:m1240_4, partial:m0_3 +#-----| m0_5(String) = ^IndirectMayWriteSideEffect[-1] : &:r1241_4 +#-----| m0_6(unknown) = Chi : total:m0_4, partial:m0_5 +# 1241| r1241_5(bool) = Constant[1] : +# 1241| m1241_6(bool) = Store[a#init] : &:r1241_1, r1241_5 +# 1241| m1241_7(unknown) = Chi : total:m0_6, partial:m1241_6 +#-----| Goto -> Block 2 + +# 1242| Block 2 +# 1242| m1242_1(unknown) = Phi : from 0:~m1240_4, from 1:~m1241_7 +# 1242| r1242_2(glval) = VariableAddress[b#init] : +# 1242| r1242_3(bool) = Load[b#init] : &:r1242_2, ~m1242_1 +# 1242| v1242_4(void) = ConditionalBranch : r1242_3 +#-----| False -> Block 3 +#-----| True -> Block 4 + +# 1242| Block 3 +# 1242| r1242_5(glval) = VariableAddress[b] : +# 1242| r1242_6(glval) = FunctionAddress[String] : +# 1242| r1242_7(glval) = StringConstant["static"] : +# 1242| r1242_8(char *) = Convert : r1242_7 +# 1242| v1242_9(void) = Call[String] : func:r1242_6, this:r1242_5, 0:r1242_8 +# 1242| m1242_10(unknown) = ^CallSideEffect : ~m1242_1 +# 1242| m1242_11(unknown) = Chi : total:m1242_1, partial:m1242_10 +# 1242| v1242_12(void) = ^BufferReadSideEffect[0] : &:r1242_8, ~m1240_3 +# 1242| m1242_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1242_5 +# 1242| m1242_14(unknown) = Chi : total:m1242_11, partial:m1242_13 +# 1242| r1242_15(bool) = Constant[1] : +# 1242| m1242_16(bool) = Store[b#init] : &:r1242_2, r1242_15 +# 1242| m1242_17(unknown) = Chi : total:m1242_14, partial:m1242_16 +#-----| Goto -> Block 4 + +# 1243| Block 4 +# 1243| m1243_1(unknown) = Phi : from 2:~m1242_1, from 3:~m1242_17 +# 1243| r1243_2(glval) = VariableAddress[c#init] : +# 1243| r1243_3(bool) = Load[c#init] : &:r1243_2, ~m1243_1 +# 1243| v1243_4(void) = ConditionalBranch : r1243_3 +#-----| False -> Block 5 +#-----| True -> Block 6 + +# 1243| Block 5 +# 1243| r1243_5(glval) = VariableAddress[c] : +# 1243| r1243_6(glval) = FunctionAddress[String] : +# 1243| r1243_7(glval) = VariableAddress[dynamic] : +# 1243| r1243_8(char *) = Load[dynamic] : &:r1243_7, m1240_6 +# 1243| v1243_9(void) = Call[String] : func:r1243_6, this:r1243_5, 0:r1243_8 +# 1243| m1243_10(unknown) = ^CallSideEffect : ~m1243_1 +# 1243| m1243_11(unknown) = Chi : total:m1243_1, partial:m1243_10 +# 1243| v1243_12(void) = ^BufferReadSideEffect[0] : &:r1243_8, ~m1240_8 +# 1243| m1243_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1243_5 +# 1243| m1243_14(unknown) = Chi : total:m1243_11, partial:m1243_13 +# 1243| r1243_15(bool) = Constant[1] : +# 1243| m1243_16(bool) = Store[c#init] : &:r1243_2, r1243_15 +# 1243| m1243_17(unknown) = Chi : total:m1243_14, partial:m1243_16 +#-----| Goto -> Block 6 + +# 1244| Block 6 +# 1244| m1244_1(unknown) = Phi : from 4:~m1243_1, from 5:~m1243_17 +# 1244| v1244_2(void) = NoOp : +# 1240| v1240_9(void) = ReturnIndirection[dynamic] : &:r1240_7, m1240_8 +# 1240| v1240_10(void) = ReturnVoid : +# 1240| v1240_11(void) = AliasedUse : ~m1244_1 +# 1240| v1240_12(void) = ExitFunction : + +# 1251| void test_strings(char*, char*) +# 1251| Block 0 +# 1251| v1251_1(void) = EnterFunction : +# 1251| m1251_2(unknown) = AliasedDefinition : +# 1251| m1251_3(unknown) = InitializeNonLocal : +# 1251| m1251_4(unknown) = Chi : total:m1251_2, partial:m1251_3 +# 1251| r1251_5(glval) = VariableAddress[s1] : +# 1251| m1251_6(char *) = InitializeParameter[s1] : &:r1251_5 +# 1251| r1251_7(char *) = Load[s1] : &:r1251_5, m1251_6 +# 1251| m1251_8(unknown) = InitializeIndirection[s1] : &:r1251_7 +# 1251| r1251_9(glval) = VariableAddress[s2] : +# 1251| m1251_10(char *) = InitializeParameter[s2] : &:r1251_9 +# 1251| r1251_11(char *) = Load[s2] : &:r1251_9, m1251_10 +# 1251| m1251_12(unknown) = InitializeIndirection[s2] : &:r1251_11 +# 1252| r1252_1(glval) = VariableAddress[buffer] : +# 1252| m1252_2(char[1024]) = Uninitialized[buffer] : &:r1252_1 +# 1252| r1252_3(int) = Constant[0] : +# 1252| r1252_4(glval) = PointerAdd[1] : r1252_1, r1252_3 +# 1252| r1252_5(char) = Constant[0] : +# 1252| m1252_6(char) = Store[?] : &:r1252_4, r1252_5 +# 1252| m1252_7(char[1024]) = Chi : total:m1252_2, partial:m1252_6 +# 1252| r1252_8(int) = Constant[1] : +# 1252| r1252_9(glval) = PointerAdd[1] : r1252_1, r1252_8 +# 1252| r1252_10(unknown[1023]) = Constant[0] : +# 1252| m1252_11(unknown[1023]) = Store[?] : &:r1252_9, r1252_10 +# 1252| m1252_12(char[1024]) = Chi : total:m1252_7, partial:m1252_11 +# 1254| r1254_1(glval) = FunctionAddress[strcpy] : +# 1254| r1254_2(glval) = VariableAddress[buffer] : +# 1254| r1254_3(char *) = Convert : r1254_2 +# 1254| r1254_4(glval) = VariableAddress[s1] : +# 1254| r1254_5(char *) = Load[s1] : &:r1254_4, m1251_6 +# 1254| r1254_6(char *) = Convert : r1254_5 +# 1254| r1254_7(char *) = Call[strcpy] : func:r1254_1, 0:r1254_3, 1:r1254_6 +# 1254| v1254_8(void) = ^BufferReadSideEffect[1] : &:r1254_6, ~m1251_8 +# 1254| m1254_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r1254_3 +# 1254| m1254_10(char[1024]) = Chi : total:m1252_12, partial:m1254_9 +# 1255| r1255_1(glval) = FunctionAddress[strcat] : +# 1255| r1255_2(glval) = VariableAddress[buffer] : +# 1255| r1255_3(char *) = Convert : r1255_2 +# 1255| r1255_4(glval) = VariableAddress[s2] : +# 1255| r1255_5(char *) = Load[s2] : &:r1255_4, m1251_10 +# 1255| r1255_6(char *) = Convert : r1255_5 +# 1255| r1255_7(char *) = Call[strcat] : func:r1255_1, 0:r1255_3, 1:r1255_6 +# 1255| v1255_8(void) = ^BufferReadSideEffect[0] : &:r1255_3, ~m1254_10 +# 1255| v1255_9(void) = ^BufferReadSideEffect[1] : &:r1255_6, ~m1251_12 +# 1255| m1255_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r1255_3 +# 1255| m1255_11(char[1024]) = Chi : total:m1254_10, partial:m1255_10 +# 1256| v1256_1(void) = NoOp : +# 1251| v1251_13(void) = ReturnIndirection[s1] : &:r1251_7, m1251_8 +# 1251| v1251_14(void) = ReturnIndirection[s2] : &:r1251_11, m1251_12 +# 1251| v1251_15(void) = ReturnVoid : +# 1251| v1251_16(void) = AliasedUse : m1251_3 +# 1251| v1251_17(void) = ExitFunction : + +# 1261| void A::static_member(A*, int) +# 1261| Block 0 +# 1261| v1261_1(void) = EnterFunction : +# 1261| m1261_2(unknown) = AliasedDefinition : +# 1261| m1261_3(unknown) = InitializeNonLocal : +# 1261| m1261_4(unknown) = Chi : total:m1261_2, partial:m1261_3 +# 1261| r1261_5(glval) = VariableAddress[a] : +# 1261| m1261_6(A *) = InitializeParameter[a] : &:r1261_5 +# 1261| r1261_7(A *) = Load[a] : &:r1261_5, m1261_6 +# 1261| m1261_8(unknown) = InitializeIndirection[a] : &:r1261_7 +# 1261| r1261_9(glval) = VariableAddress[x] : +# 1261| m1261_10(int) = InitializeParameter[x] : &:r1261_9 +# 1262| r1262_1(glval) = VariableAddress[x] : +# 1262| r1262_2(int) = Load[x] : &:r1262_1, m1261_10 +# 1262| r1262_3(glval) = VariableAddress[a] : +# 1262| r1262_4(A *) = Load[a] : &:r1262_3, m1261_6 +# 1262| r1262_5(glval) = FieldAddress[member] : r1262_4 +# 1262| m1262_6(int) = Store[?] : &:r1262_5, r1262_2 +# 1262| m1262_7(unknown) = Chi : total:m1261_8, partial:m1262_6 +# 1263| v1263_1(void) = NoOp : +# 1261| v1261_11(void) = ReturnIndirection[a] : &:r1261_7, m1262_7 +# 1261| v1261_12(void) = ReturnVoid : +# 1261| v1261_13(void) = AliasedUse : m1261_3 +# 1261| v1261_14(void) = ExitFunction : + +# 1270| void test_static_member_functions(int, A*) +# 1270| Block 0 +# 1270| v1270_1(void) = EnterFunction : +# 1270| m1270_2(unknown) = AliasedDefinition : +# 1270| m1270_3(unknown) = InitializeNonLocal : +# 1270| m1270_4(unknown) = Chi : total:m1270_2, partial:m1270_3 +# 1270| r1270_5(glval) = VariableAddress[int_arg] : +# 1270| m1270_6(int) = InitializeParameter[int_arg] : &:r1270_5 +# 1270| r1270_7(glval) = VariableAddress[a_arg] : +# 1270| m1270_8(A *) = InitializeParameter[a_arg] : &:r1270_7 +# 1270| r1270_9(A *) = Load[a_arg] : &:r1270_7, m1270_8 +# 1270| m1270_10(unknown) = InitializeIndirection[a_arg] : &:r1270_9 +# 1271| r1271_1(glval) = VariableAddress[c] : +# 1271| m1271_2(C) = Uninitialized[c] : &:r1271_1 +# 1271| r1271_3(glval) = FunctionAddress[C] : +# 1271| v1271_4(void) = Call[C] : func:r1271_3, this:r1271_1 +# 1271| m1271_5(unknown) = ^CallSideEffect : ~m1270_4 +# 1271| m1271_6(unknown) = Chi : total:m1270_4, partial:m1271_5 +# 1271| m1271_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1271_1 +# 1271| m1271_8(C) = Chi : total:m1271_2, partial:m1271_7 +# 1272| r1272_1(glval) = VariableAddress[c] : +# 1272| r1272_2(glval) = FunctionAddress[StaticMemberFunction] : +# 1272| r1272_3(int) = Constant[10] : +# 1272| r1272_4(int) = Call[StaticMemberFunction] : func:r1272_2, 0:r1272_3 +# 1272| m1272_5(unknown) = ^CallSideEffect : ~m1271_6 +# 1272| m1272_6(unknown) = Chi : total:m1271_6, partial:m1272_5 +# 1273| r1273_1(glval) = FunctionAddress[StaticMemberFunction] : +# 1273| r1273_2(int) = Constant[10] : +# 1273| r1273_3(int) = Call[StaticMemberFunction] : func:r1273_1, 0:r1273_2 +# 1273| m1273_4(unknown) = ^CallSideEffect : ~m1272_6 +# 1273| m1273_5(unknown) = Chi : total:m1272_6, partial:m1273_4 +# 1275| r1275_1(glval) = VariableAddress[a] : +# 1275| m1275_2(A) = Uninitialized[a] : &:r1275_1 +# 1276| r1276_1(glval) = VariableAddress[a] : +# 1276| r1276_2(glval) = FunctionAddress[static_member] : +# 1276| r1276_3(glval) = VariableAddress[a] : +# 1276| r1276_4(A *) = CopyValue : r1276_3 +# 1276| r1276_5(glval) = VariableAddress[int_arg] : +# 1276| r1276_6(int) = Load[int_arg] : &:r1276_5, m1270_6 +# 1276| v1276_7(void) = Call[static_member] : func:r1276_2, 0:r1276_4, 1:r1276_6 +# 1276| m1276_8(unknown) = ^CallSideEffect : ~m1273_5 +# 1276| m1276_9(unknown) = Chi : total:m1273_5, partial:m1276_8 +# 1276| v1276_10(void) = ^BufferReadSideEffect[0] : &:r1276_4, ~m1275_2 +# 1276| m1276_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1276_4 +# 1276| m1276_12(A) = Chi : total:m1275_2, partial:m1276_11 +# 1277| r1277_1(glval) = FunctionAddress[static_member] : +# 1277| r1277_2(glval) = VariableAddress[a] : +# 1277| r1277_3(A *) = CopyValue : r1277_2 +# 1277| r1277_4(glval) = VariableAddress[int_arg] : +# 1277| r1277_5(int) = Load[int_arg] : &:r1277_4, m1270_6 +# 1277| v1277_6(void) = Call[static_member] : func:r1277_1, 0:r1277_3, 1:r1277_5 +# 1277| m1277_7(unknown) = ^CallSideEffect : ~m1276_9 +# 1277| m1277_8(unknown) = Chi : total:m1276_9, partial:m1277_7 +# 1277| v1277_9(void) = ^BufferReadSideEffect[0] : &:r1277_3, ~m1276_12 +# 1277| m1277_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r1277_3 +# 1277| m1277_11(A) = Chi : total:m1276_12, partial:m1277_10 +# 1279| r1279_1(glval) = VariableAddress[a] : +# 1279| r1279_2(A *) = CopyValue : r1279_1 +# 1279| r1279_3(glval) = FunctionAddress[static_member] : +# 1279| r1279_4(glval) = VariableAddress[a_arg] : +# 1279| r1279_5(A *) = Load[a_arg] : &:r1279_4, m1270_8 +# 1279| r1279_6(glval) = VariableAddress[int_arg] : +# 1279| r1279_7(int) = Load[int_arg] : &:r1279_6, m1270_6 +# 1279| r1279_8(int) = Constant[2] : +# 1279| r1279_9(int) = Add : r1279_7, r1279_8 +# 1279| v1279_10(void) = Call[static_member] : func:r1279_3, 0:r1279_5, 1:r1279_9 +# 1279| m1279_11(unknown) = ^CallSideEffect : ~m1277_8 +# 1279| m1279_12(unknown) = Chi : total:m1277_8, partial:m1279_11 +# 1279| v1279_13(void) = ^BufferReadSideEffect[0] : &:r1279_5, ~m1270_10 +# 1279| m1279_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r1279_5 +# 1279| m1279_15(unknown) = Chi : total:m1270_10, partial:m1279_14 +# 1280| r1280_1(glval) = VariableAddress[a_arg] : +# 1280| r1280_2(A *) = Load[a_arg] : &:r1280_1, m1270_8 +# 1280| r1280_3(glval) = CopyValue : r1280_2 +# 1280| r1280_4(glval) = FunctionAddress[static_member] : +# 1280| r1280_5(glval) = VariableAddress[a] : +# 1280| r1280_6(A *) = CopyValue : r1280_5 +# 1280| r1280_7(int) = Constant[99] : +# 1280| v1280_8(void) = Call[static_member] : func:r1280_4, 0:r1280_6, 1:r1280_7 +# 1280| m1280_9(unknown) = ^CallSideEffect : ~m1279_12 +# 1280| m1280_10(unknown) = Chi : total:m1279_12, partial:m1280_9 +# 1280| v1280_11(void) = ^BufferReadSideEffect[0] : &:r1280_6, ~m1277_11 +# 1280| m1280_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1280_6 +# 1280| m1280_13(A) = Chi : total:m1277_11, partial:m1280_12 +# 1281| r1281_1(glval) = VariableAddress[a_arg] : +# 1281| r1281_2(A *) = Load[a_arg] : &:r1281_1, m1270_8 +# 1281| r1281_3(glval) = FunctionAddress[static_member] : +# 1281| r1281_4(glval) = VariableAddress[a_arg] : +# 1281| r1281_5(A *) = Load[a_arg] : &:r1281_4, m1270_8 +# 1281| r1281_6(int) = Constant[-1] : +# 1281| v1281_7(void) = Call[static_member] : func:r1281_3, 0:r1281_5, 1:r1281_6 +# 1281| m1281_8(unknown) = ^CallSideEffect : ~m1280_10 +# 1281| m1281_9(unknown) = Chi : total:m1280_10, partial:m1281_8 +# 1281| v1281_10(void) = ^BufferReadSideEffect[0] : &:r1281_5, ~m1279_15 +# 1281| m1281_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1281_5 +# 1281| m1281_12(unknown) = Chi : total:m1279_15, partial:m1281_11 +# 1283| r1283_1(glval) = VariableAddress[a] : +# 1283| r1283_2(glval) = FunctionAddress[static_member_without_def] : +# 1283| v1283_3(void) = Call[static_member_without_def] : func:r1283_2 +# 1283| m1283_4(unknown) = ^CallSideEffect : ~m1281_9 +# 1283| m1283_5(unknown) = Chi : total:m1281_9, partial:m1283_4 +# 1284| r1284_1(glval) = FunctionAddress[static_member_without_def] : +# 1284| v1284_2(void) = Call[static_member_without_def] : func:r1284_1 +# 1284| m1284_3(unknown) = ^CallSideEffect : ~m1283_5 +# 1284| m1284_4(unknown) = Chi : total:m1283_5, partial:m1284_3 +# 1286| r1286_1(glval) = FunctionAddress[getAnInstanceOfA] : +# 1286| r1286_2(A *) = Call[getAnInstanceOfA] : func:r1286_1 +# 1286| m1286_3(unknown) = ^CallSideEffect : ~m1284_4 +# 1286| m1286_4(unknown) = Chi : total:m1284_4, partial:m1286_3 +# 1286| r1286_5(glval) = FunctionAddress[static_member_without_def] : +# 1286| v1286_6(void) = Call[static_member_without_def] : func:r1286_5 +# 1286| m1286_7(unknown) = ^CallSideEffect : ~m1286_4 +# 1286| m1286_8(unknown) = Chi : total:m1286_4, partial:m1286_7 +# 1287| v1287_1(void) = NoOp : +# 1270| v1270_11(void) = ReturnIndirection[a_arg] : &:r1270_9, m1281_12 +# 1270| v1270_12(void) = ReturnVoid : +# 1270| v1270_13(void) = AliasedUse : ~m1286_8 +# 1270| v1270_14(void) = ExitFunction : + +# 1289| int missingReturnValue(bool, int) +# 1289| Block 0 +# 1289| v1289_1(void) = EnterFunction : +# 1289| m1289_2(unknown) = AliasedDefinition : +# 1289| m1289_3(unknown) = InitializeNonLocal : +# 1289| m1289_4(unknown) = Chi : total:m1289_2, partial:m1289_3 +# 1289| r1289_5(glval) = VariableAddress[b] : +# 1289| m1289_6(bool) = InitializeParameter[b] : &:r1289_5 +# 1289| r1289_7(glval) = VariableAddress[x] : +# 1289| m1289_8(int) = InitializeParameter[x] : &:r1289_7 +# 1290| r1290_1(glval) = VariableAddress[b] : +# 1290| r1290_2(bool) = Load[b] : &:r1290_1, m1289_6 +# 1290| v1290_3(void) = ConditionalBranch : r1290_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 1289| Block 1 +# 1289| m1289_9(int) = Phi : from 2:m1291_4, from 3:m1293_2 +# 1289| r1289_10(glval) = VariableAddress[#return] : +# 1289| v1289_11(void) = ReturnValue : &:r1289_10, m1289_9 +# 1289| v1289_12(void) = AliasedUse : m1289_3 +# 1289| v1289_13(void) = ExitFunction : + +# 1291| Block 2 +# 1291| r1291_1(glval) = VariableAddress[#return] : +# 1291| r1291_2(glval) = VariableAddress[x] : +# 1291| r1291_3(int) = Load[x] : &:r1291_2, m1289_8 +# 1291| m1291_4(int) = Store[#return] : &:r1291_1, r1291_3 +#-----| Goto -> Block 1 + +# 1293| Block 3 +# 1293| r1293_1(glval) = VariableAddress[#return] : +# 1293| m1293_2(int) = Uninitialized[#return] : &:r1293_1 +#-----| Goto -> Block 1 + +# 1295| void returnVoid(int, int) +# 1295| Block 0 +# 1295| v1295_1(void) = EnterFunction : +# 1295| m1295_2(unknown) = AliasedDefinition : +# 1295| m1295_3(unknown) = InitializeNonLocal : +# 1295| m1295_4(unknown) = Chi : total:m1295_2, partial:m1295_3 +# 1295| r1295_5(glval) = VariableAddress[x] : +# 1295| m1295_6(int) = InitializeParameter[x] : &:r1295_5 +# 1295| r1295_7(glval) = VariableAddress[y] : +# 1295| m1295_8(int) = InitializeParameter[y] : &:r1295_7 +# 1296| r1296_1(glval) = FunctionAddress[IntegerOps] : +# 1296| r1296_2(glval) = VariableAddress[x] : +# 1296| r1296_3(int) = Load[x] : &:r1296_2, m1295_6 +# 1296| r1296_4(glval) = VariableAddress[y] : +# 1296| r1296_5(int) = Load[y] : &:r1296_4, m1295_8 +# 1296| v1296_6(void) = Call[IntegerOps] : func:r1296_1, 0:r1296_3, 1:r1296_5 +# 1296| m1296_7(unknown) = ^CallSideEffect : ~m1295_4 +# 1296| m1296_8(unknown) = Chi : total:m1295_4, partial:m1296_7 +# 1296| v1296_9(void) = NoOp : +# 1295| v1295_9(void) = ReturnVoid : +# 1295| v1295_10(void) = AliasedUse : ~m1296_8 +# 1295| v1295_11(void) = ExitFunction : + +# 1299| void gccBinaryConditional(bool, int, long) +# 1299| Block 0 +# 1299| v1299_1(void) = EnterFunction : +# 1299| m1299_2(unknown) = AliasedDefinition : +# 1299| m1299_3(unknown) = InitializeNonLocal : +# 1299| m1299_4(unknown) = Chi : total:m1299_2, partial:m1299_3 +# 1299| r1299_5(glval) = VariableAddress[b] : +# 1299| m1299_6(bool) = InitializeParameter[b] : &:r1299_5 +# 1299| r1299_7(glval) = VariableAddress[x] : +# 1299| m1299_8(int) = InitializeParameter[x] : &:r1299_7 +# 1299| r1299_9(glval) = VariableAddress[y] : +# 1299| m1299_10(long) = InitializeParameter[y] : &:r1299_9 +# 1300| r1300_1(glval) = VariableAddress[z] : +# 1300| r1300_2(glval) = VariableAddress[x] : +# 1300| r1300_3(int) = Load[x] : &:r1300_2, m1299_8 +# 1300| m1300_4(int) = Store[z] : &:r1300_1, r1300_3 +# 1301| r1301_1(glval) = VariableAddress[b] : +# 1301| r1301_2(bool) = Load[b] : &:r1301_1, m1299_6 +# 1301| v1301_3(void) = ConditionalBranch : r1301_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 1301| Block 1 +# 1301| m1301_4(int) = Phi : from 2:m1301_10, from 3:m1301_14 +# 1301| r1301_5(glval) = VariableAddress[#temp1301:9] : +# 1301| r1301_6(int) = Load[#temp1301:9] : &:r1301_5, m1301_4 +# 1301| r1301_7(glval) = VariableAddress[z] : +# 1301| m1301_8(int) = Store[z] : &:r1301_7, r1301_6 +# 1302| r1302_1(glval) = VariableAddress[b] : +# 1302| r1302_2(bool) = Load[b] : &:r1302_1, m1299_6 +# 1302| v1302_3(void) = ConditionalBranch : r1302_2 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 1301| Block 2 +# 1301| r1301_9(glval) = VariableAddress[#temp1301:9] : +# 1301| m1301_10(int) = Store[#temp1301:9] : &:r1301_9, r1301_2 +#-----| Goto -> Block 1 + +# 1301| Block 3 +# 1301| r1301_11(glval) = VariableAddress[x] : +# 1301| r1301_12(int) = Load[x] : &:r1301_11, m1299_8 +# 1301| r1301_13(glval) = VariableAddress[#temp1301:9] : +# 1301| m1301_14(int) = Store[#temp1301:9] : &:r1301_13, r1301_12 +#-----| Goto -> Block 1 + +# 1302| Block 4 +# 1302| m1302_4(long) = Phi : from 5:m1302_11, from 6:m1302_15 +# 1302| r1302_5(glval) = VariableAddress[#temp1302:9] : +# 1302| r1302_6(long) = Load[#temp1302:9] : &:r1302_5, m1302_4 +# 1302| r1302_7(int) = Convert : r1302_6 +# 1302| r1302_8(glval) = VariableAddress[z] : +# 1302| m1302_9(int) = Store[z] : &:r1302_8, r1302_7 +# 1303| r1303_1(glval) = VariableAddress[x] : +# 1303| r1303_2(int) = Load[x] : &:r1303_1, m1299_8 +# 1303| r1303_3(int) = Constant[0] : +# 1303| r1303_4(bool) = CompareNE : r1303_2, r1303_3 +# 1303| v1303_5(void) = ConditionalBranch : r1303_4 +#-----| False -> Block 9 +#-----| True -> Block 8 + +# 1302| Block 5 +# 1302| r1302_10(glval) = VariableAddress[#temp1302:9] : +# 1302| m1302_11(long) = Store[#temp1302:9] : &:r1302_10, r1302_2 +#-----| Goto -> Block 4 + +# 1302| Block 6 +# 1302| r1302_12(glval) = VariableAddress[y] : +# 1302| r1302_13(long) = Load[y] : &:r1302_12, m1299_10 +# 1302| r1302_14(glval) = VariableAddress[#temp1302:9] : +# 1302| m1302_15(long) = Store[#temp1302:9] : &:r1302_14, r1302_13 +#-----| Goto -> Block 4 + +# 1303| Block 7 +# 1303| m1303_6(int) = Phi : from 8:m1303_12, from 9:m1303_16 +# 1303| r1303_7(glval) = VariableAddress[#temp1303:9] : +# 1303| r1303_8(int) = Load[#temp1303:9] : &:r1303_7, m1303_6 +# 1303| r1303_9(glval) = VariableAddress[z] : +# 1303| m1303_10(int) = Store[z] : &:r1303_9, r1303_8 +# 1304| r1304_1(glval) = VariableAddress[x] : +# 1304| r1304_2(int) = Load[x] : &:r1304_1, m1299_8 +# 1304| r1304_3(int) = Constant[0] : +# 1304| r1304_4(bool) = CompareNE : r1304_2, r1304_3 +# 1304| v1304_5(void) = ConditionalBranch : r1304_4 +#-----| False -> Block 12 +#-----| True -> Block 11 + +# 1303| Block 8 +# 1303| r1303_11(glval) = VariableAddress[#temp1303:9] : +# 1303| m1303_12(int) = Store[#temp1303:9] : &:r1303_11, r1303_2 +#-----| Goto -> Block 7 + +# 1303| Block 9 +# 1303| r1303_13(glval) = VariableAddress[x] : +# 1303| r1303_14(int) = Load[x] : &:r1303_13, m1299_8 +# 1303| r1303_15(glval) = VariableAddress[#temp1303:9] : +# 1303| m1303_16(int) = Store[#temp1303:9] : &:r1303_15, r1303_14 +#-----| Goto -> Block 7 + +# 1304| Block 10 +# 1304| m1304_6(long) = Phi : from 11:m1304_13, from 12:m1304_17 +# 1304| r1304_7(glval) = VariableAddress[#temp1304:9] : +# 1304| r1304_8(long) = Load[#temp1304:9] : &:r1304_7, m1304_6 +# 1304| r1304_9(int) = Convert : r1304_8 +# 1304| r1304_10(glval) = VariableAddress[z] : +# 1304| m1304_11(int) = Store[z] : &:r1304_10, r1304_9 +# 1305| r1305_1(glval) = VariableAddress[y] : +# 1305| r1305_2(long) = Load[y] : &:r1305_1, m1299_10 +# 1305| r1305_3(long) = Constant[0] : +# 1305| r1305_4(bool) = CompareNE : r1305_2, r1305_3 +# 1305| v1305_5(void) = ConditionalBranch : r1305_4 +#-----| False -> Block 15 +#-----| True -> Block 14 + +# 1304| Block 11 +# 1304| r1304_12(glval) = VariableAddress[#temp1304:9] : +# 1304| m1304_13(long) = Store[#temp1304:9] : &:r1304_12, r1304_2 +#-----| Goto -> Block 10 + +# 1304| Block 12 +# 1304| r1304_14(glval) = VariableAddress[y] : +# 1304| r1304_15(long) = Load[y] : &:r1304_14, m1299_10 +# 1304| r1304_16(glval) = VariableAddress[#temp1304:9] : +# 1304| m1304_17(long) = Store[#temp1304:9] : &:r1304_16, r1304_15 +#-----| Goto -> Block 10 + +# 1305| Block 13 +# 1305| m1305_6(long) = Phi : from 14:m1305_13, from 15:m1305_18 +# 1305| r1305_7(glval) = VariableAddress[#temp1305:9] : +# 1305| r1305_8(long) = Load[#temp1305:9] : &:r1305_7, m1305_6 +# 1305| r1305_9(int) = Convert : r1305_8 +# 1305| r1305_10(glval) = VariableAddress[z] : +# 1305| m1305_11(int) = Store[z] : &:r1305_10, r1305_9 +# 1306| r1306_1(glval) = VariableAddress[y] : +# 1306| r1306_2(long) = Load[y] : &:r1306_1, m1299_10 +# 1306| r1306_3(long) = Constant[0] : +# 1306| r1306_4(bool) = CompareNE : r1306_2, r1306_3 +# 1306| v1306_5(void) = ConditionalBranch : r1306_4 +#-----| False -> Block 18 +#-----| True -> Block 17 + +# 1305| Block 14 +# 1305| r1305_12(glval) = VariableAddress[#temp1305:9] : +# 1305| m1305_13(long) = Store[#temp1305:9] : &:r1305_12, r1305_2 +#-----| Goto -> Block 13 + +# 1305| Block 15 +# 1305| r1305_14(glval) = VariableAddress[x] : +# 1305| r1305_15(int) = Load[x] : &:r1305_14, m1299_8 +# 1305| r1305_16(long) = Convert : r1305_15 +# 1305| r1305_17(glval) = VariableAddress[#temp1305:9] : +# 1305| m1305_18(long) = Store[#temp1305:9] : &:r1305_17, r1305_16 +#-----| Goto -> Block 13 + +# 1306| Block 16 +# 1306| m1306_6(long) = Phi : from 17:m1306_13, from 18:m1306_17 +# 1306| r1306_7(glval) = VariableAddress[#temp1306:9] : +# 1306| r1306_8(long) = Load[#temp1306:9] : &:r1306_7, m1306_6 +# 1306| r1306_9(int) = Convert : r1306_8 +# 1306| r1306_10(glval) = VariableAddress[z] : +# 1306| m1306_11(int) = Store[z] : &:r1306_10, r1306_9 +# 1308| r1308_1(glval) = VariableAddress[x] : +# 1308| r1308_2(int) = Load[x] : &:r1308_1, m1299_8 +# 1308| r1308_3(int) = Constant[0] : +# 1308| r1308_4(bool) = CompareNE : r1308_2, r1308_3 +# 1308| v1308_5(void) = ConditionalBranch : r1308_4 +#-----| False -> Block 25 +#-----| True -> Block 24 + +# 1306| Block 17 +# 1306| r1306_12(glval) = VariableAddress[#temp1306:9] : +# 1306| m1306_13(long) = Store[#temp1306:9] : &:r1306_12, r1306_2 +#-----| Goto -> Block 16 + +# 1306| Block 18 +# 1306| r1306_14(glval) = VariableAddress[y] : +# 1306| r1306_15(long) = Load[y] : &:r1306_14, m1299_10 +# 1306| r1306_16(glval) = VariableAddress[#temp1306:9] : +# 1306| m1306_17(long) = Store[#temp1306:9] : &:r1306_16, r1306_15 +#-----| Goto -> Block 16 + +# 1308| Block 19 +# 1308| m1308_6(int) = Phi : from 20:m1308_12, from 26:m1308_34 +# 1308| r1308_7(glval) = VariableAddress[#temp1308:9] : +# 1308| r1308_8(int) = Load[#temp1308:9] : &:r1308_7, m1308_6 +# 1308| r1308_9(glval) = VariableAddress[z] : +# 1308| m1308_10(int) = Store[z] : &:r1308_9, r1308_8 +# 1309| v1309_1(void) = NoOp : +# 1299| v1299_11(void) = ReturnVoid : +# 1299| v1299_12(void) = AliasedUse : m1299_3 +# 1299| v1299_13(void) = ExitFunction : + +# 1308| Block 20 +# 1308| r1308_11(glval) = VariableAddress[#temp1308:9] : +# 1308| m1308_12(int) = Store[#temp1308:9] : &:r1308_11, r1308_18 +#-----| Goto -> Block 19 + +# 1308| Block 21 +# 1308| r1308_13(glval) = VariableAddress[#temp1308:10] : +# 1308| r1308_14(bool) = Constant[0] : +# 1308| m1308_15(bool) = Store[#temp1308:10] : &:r1308_13, r1308_14 +#-----| Goto -> Block 22 + +# 1308| Block 22 +# 1308| m1308_16(bool) = Phi : from 21:m1308_15, from 23:m1308_22 +# 1308| r1308_17(glval) = VariableAddress[#temp1308:10] : +# 1308| r1308_18(bool) = Load[#temp1308:10] : &:r1308_17, m1308_16 +# 1308| v1308_19(void) = ConditionalBranch : r1308_18 +#-----| False -> Block 26 +#-----| True -> Block 20 + +# 1308| Block 23 +# 1308| r1308_20(glval) = VariableAddress[#temp1308:10] : +# 1308| r1308_21(bool) = Constant[1] : +# 1308| m1308_22(bool) = Store[#temp1308:10] : &:r1308_20, r1308_21 +#-----| Goto -> Block 22 + +# 1308| Block 24 +# 1308| r1308_23(glval) = VariableAddress[b] : +# 1308| r1308_24(bool) = Load[b] : &:r1308_23, m1299_6 +# 1308| v1308_25(void) = ConditionalBranch : r1308_24 +#-----| False -> Block 25 +#-----| True -> Block 23 + +# 1308| Block 25 +# 1308| r1308_26(glval) = VariableAddress[y] : +# 1308| r1308_27(long) = Load[y] : &:r1308_26, m1299_10 +# 1308| r1308_28(long) = Constant[0] : +# 1308| r1308_29(bool) = CompareNE : r1308_27, r1308_28 +# 1308| v1308_30(void) = ConditionalBranch : r1308_29 +#-----| False -> Block 21 +#-----| True -> Block 23 + +# 1308| Block 26 +# 1308| r1308_31(glval) = VariableAddress[x] : +# 1308| r1308_32(int) = Load[x] : &:r1308_31, m1299_8 +# 1308| r1308_33(glval) = VariableAddress[#temp1308:9] : +# 1308| m1308_34(int) = Store[#temp1308:9] : &:r1308_33, r1308_32 +#-----| Goto -> Block 19 + +# 1314| int shortCircuitConditional(int, int) +# 1314| Block 0 +# 1314| v1314_1(void) = EnterFunction : +# 1314| m1314_2(unknown) = AliasedDefinition : +# 1314| m1314_3(unknown) = InitializeNonLocal : +# 1314| m1314_4(unknown) = Chi : total:m1314_2, partial:m1314_3 +# 1314| r1314_5(glval) = VariableAddress[x] : +# 1314| m1314_6(int) = InitializeParameter[x] : &:r1314_5 +# 1314| r1314_7(glval) = VariableAddress[y] : +# 1314| m1314_8(int) = InitializeParameter[y] : &:r1314_7 +# 1315| r1315_1(glval) = VariableAddress[#return] : +# 1315| r1315_2(glval) = FunctionAddress[predicateA] : +# 1315| r1315_3(bool) = Call[predicateA] : func:r1315_2 +# 1315| m1315_4(unknown) = ^CallSideEffect : ~m1314_4 +# 1315| m1315_5(unknown) = Chi : total:m1314_4, partial:m1315_4 +# 1315| v1315_6(void) = ConditionalBranch : r1315_3 +#-----| False -> Block 4 +#-----| True -> Block 2 + +# 1315| Block 1 +# 1315| m1315_7(unknown) = Phi : from 3:~m1315_15, from 4:~m1315_21 +# 1315| m1315_8(int) = Phi : from 3:m1315_20, from 4:m1315_25 +# 1315| r1315_9(glval) = VariableAddress[#temp1315:12] : +# 1315| r1315_10(int) = Load[#temp1315:12] : &:r1315_9, m1315_8 +# 1315| m1315_11(int) = Store[#return] : &:r1315_1, r1315_10 +# 1314| r1314_9(glval) = VariableAddress[#return] : +# 1314| v1314_10(void) = ReturnValue : &:r1314_9, m1315_11 +# 1314| v1314_11(void) = AliasedUse : ~m1315_7 +# 1314| v1314_12(void) = ExitFunction : + +# 1315| Block 2 +# 1315| r1315_12(glval) = FunctionAddress[predicateB] : +# 1315| r1315_13(bool) = Call[predicateB] : func:r1315_12 +# 1315| m1315_14(unknown) = ^CallSideEffect : ~m1315_5 +# 1315| m1315_15(unknown) = Chi : total:m1315_5, partial:m1315_14 +# 1315| v1315_16(void) = ConditionalBranch : r1315_13 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 1315| Block 3 +# 1315| r1315_17(glval) = VariableAddress[x] : +# 1315| r1315_18(int) = Load[x] : &:r1315_17, m1314_6 +# 1315| r1315_19(glval) = VariableAddress[#temp1315:12] : +# 1315| m1315_20(int) = Store[#temp1315:12] : &:r1315_19, r1315_18 +#-----| Goto -> Block 1 + +# 1315| Block 4 +# 1315| m1315_21(unknown) = Phi : from 0:~m1315_5, from 2:~m1315_15 +# 1315| r1315_22(glval) = VariableAddress[y] : +# 1315| r1315_23(int) = Load[y] : &:r1315_22, m1314_8 +# 1315| r1315_24(glval) = VariableAddress[#temp1315:12] : +# 1315| m1315_25(int) = Store[#temp1315:12] : &:r1315_24, r1315_23 +#-----| Goto -> Block 1 + +# 1320| void f(int*) +# 1320| Block 0 +# 1320| v1320_1(void) = EnterFunction : +# 1320| m1320_2(unknown) = AliasedDefinition : +# 1320| m1320_3(unknown) = InitializeNonLocal : +# 1320| m1320_4(unknown) = Chi : total:m1320_2, partial:m1320_3 +# 1320| r1320_5(glval) = VariableAddress[p] : +# 1320| m1320_6(int *) = InitializeParameter[p] : &:r1320_5 +# 1320| r1320_7(int *) = Load[p] : &:r1320_5, m1320_6 +# 1320| m1320_8(unknown) = InitializeIndirection[p] : &:r1320_7 +# 1322| r1322_1(glval) = FunctionAddress[operator new] : +# 1322| r1322_2(unsigned long) = Constant[4] : +# 1322| r1322_3(glval) = VariableAddress[p] : +# 1322| r1322_4(int *) = Load[p] : &:r1322_3, m1320_6 +# 1322| r1322_5(void *) = Convert : r1322_4 +# 1322| r1322_6(void *) = Call[operator new] : func:r1322_1, 0:r1322_2, 1:r1322_5 +# 1322| m1322_7(unknown) = ^CallSideEffect : ~m1320_4 +# 1322| m1322_8(unknown) = Chi : total:m1320_4, partial:m1322_7 +# 1322| m1322_9(unknown) = ^InitializeDynamicAllocation : &:r1322_6 +# 1322| r1322_10(int *) = Convert : r1322_6 +# 1323| v1323_1(void) = NoOp : +# 1320| v1320_9(void) = ReturnIndirection[p] : &:r1320_7, m1320_8 +# 1320| v1320_10(void) = ReturnVoid : +# 1320| v1320_11(void) = AliasedUse : ~m1322_8 +# 1320| v1320_12(void) = ExitFunction : + +# 1326| Point defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| m1326_2(unknown) = AliasedDefinition : +# 1326| m1326_3(unknown) = InitializeNonLocal : +# 1326| m1326_4(unknown) = Chi : total:m1326_2, partial:m1326_3 +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| r1327_2(Point) = Constant[0] : +# 1327| m1327_3(Point) = Store[#return] : &:r1327_1, r1327_2 +# 1326| r1326_5(glval) = VariableAddress[#return] : +# 1326| v1326_6(void) = ReturnValue : &:r1326_5, m1327_3 +# 1326| v1326_7(void) = AliasedUse : m1326_3 +# 1326| v1326_8(void) = ExitFunction : + +# 1326| String defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| m1326_2(unknown) = AliasedDefinition : +# 1326| m1326_3(unknown) = InitializeNonLocal : +# 1326| m1326_4(unknown) = Chi : total:m1326_2, partial:m1326_3 +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| m1327_2(String) = Uninitialized[#return] : &:r1327_1 +# 1327| r1327_3(glval) = FunctionAddress[String] : +# 1327| v1327_4(void) = Call[String] : func:r1327_3, this:r1327_1 +# 1327| m1327_5(unknown) = ^CallSideEffect : ~m1326_4 +# 1327| m1327_6(unknown) = Chi : total:m1326_4, partial:m1327_5 +# 1327| m1327_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 +# 1327| m1327_8(String) = Chi : total:m1327_2, partial:m1327_7 +# 1326| r1326_5(glval) = VariableAddress[#return] : +# 1326| v1326_6(void) = ReturnValue : &:r1326_5, m1327_8 +# 1326| v1326_7(void) = AliasedUse : ~m1327_6 +# 1326| v1326_8(void) = ExitFunction : + +# 1326| copy_constructor defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| m1326_2(unknown) = AliasedDefinition : +# 1326| m1326_3(unknown) = InitializeNonLocal : +# 1326| m1326_4(unknown) = Chi : total:m1326_2, partial:m1326_3 +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| m1327_2(copy_constructor) = Uninitialized[#return] : &:r1327_1 +# 1327| r1327_3(glval) = FunctionAddress[copy_constructor] : +# 1327| v1327_4(void) = Call[copy_constructor] : func:r1327_3, this:r1327_1 +# 1327| m1327_5(unknown) = ^CallSideEffect : ~m1326_4 +# 1327| m1327_6(unknown) = Chi : total:m1326_4, partial:m1327_5 +# 1327| m1327_7(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 +# 1327| m1327_8(copy_constructor) = Chi : total:m1327_2, partial:m1327_7 +# 1326| r1326_5(glval) = VariableAddress[#return] : +# 1326| v1326_6(void) = ReturnValue : &:r1326_5, m1327_8 +# 1326| v1326_7(void) = AliasedUse : ~m1327_6 +# 1326| v1326_8(void) = ExitFunction : + +# 1326| destructor_only defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| m1326_2(unknown) = AliasedDefinition : +# 1326| m1326_3(unknown) = InitializeNonLocal : +# 1326| m1326_4(unknown) = Chi : total:m1326_2, partial:m1326_3 +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| r1327_2(destructor_only) = Constant[0] : +# 1327| m1327_3(destructor_only) = Store[#return] : &:r1327_1, r1327_2 +# 1326| r1326_5(glval) = VariableAddress[#return] : +# 1326| v1326_6(void) = ReturnValue : &:r1326_5, m1327_3 +# 1326| v1326_7(void) = AliasedUse : m1326_3 +# 1326| v1326_8(void) = ExitFunction : + +# 1365| void temporary_string() +# 1365| Block 0 +# 1365| v1365_1(void) = EnterFunction : +# 1365| m1365_2(unknown) = AliasedDefinition : +# 1365| m1365_3(unknown) = InitializeNonLocal : +# 1365| m1365_4(unknown) = Chi : total:m1365_2, partial:m1365_3 +# 1366| r1366_1(glval) = VariableAddress[s] : +# 1366| r1366_2(glval) = FunctionAddress[returnValue] : +# 1366| r1366_3(String) = Call[returnValue] : func:r1366_2 +# 1366| m1366_4(unknown) = ^CallSideEffect : ~m1365_4 +# 1366| m1366_5(unknown) = Chi : total:m1365_4, partial:m1366_4 +# 1366| m1366_6(String) = Store[s] : &:r1366_1, r1366_3 +# 1367| r1367_1(glval) = VariableAddress[rs] : +# 1367| r1367_2(glval) = VariableAddress[#temp1367:24] : +# 1367| r1367_3(glval) = FunctionAddress[returnValue] : +# 1367| r1367_4(String) = Call[returnValue] : func:r1367_3 +# 1367| m1367_5(unknown) = ^CallSideEffect : ~m1366_5 +# 1367| m1367_6(unknown) = Chi : total:m1366_5, partial:m1367_5 +# 1367| m1367_7(String) = Store[#temp1367:24] : &:r1367_2, r1367_4 +# 1367| r1367_8(glval) = Convert : r1367_2 +# 1367| r1367_9(String &) = CopyValue : r1367_8 +# 1367| m1367_10(String &) = Store[rs] : &:r1367_1, r1367_9 +# 1369| r1369_1(glval) = FunctionAddress[acceptRef] : +# 1369| r1369_2(glval) = VariableAddress[s] : +# 1369| r1369_3(glval) = Convert : r1369_2 +# 1369| r1369_4(String &) = CopyValue : r1369_3 +# 1369| v1369_5(void) = Call[acceptRef] : func:r1369_1, 0:r1369_4 +# 1369| m1369_6(unknown) = ^CallSideEffect : ~m1367_6 +# 1369| m1369_7(unknown) = Chi : total:m1367_6, partial:m1369_6 +# 1369| v1369_8(void) = ^BufferReadSideEffect[0] : &:r1369_4, ~m1366_6 +# 1370| r1370_1(glval) = FunctionAddress[acceptRef] : +# 1370| r1370_2(glval) = VariableAddress[#temp1370:23] : +# 1370| m1370_3(String) = Uninitialized[#temp1370:23] : &:r1370_2 +# 1370| r1370_4(glval) = FunctionAddress[String] : +# 1370| r1370_5(glval) = StringConstant["foo"] : +# 1370| r1370_6(char *) = Convert : r1370_5 +# 1370| v1370_7(void) = Call[String] : func:r1370_4, this:r1370_2, 0:r1370_6 +# 1370| m1370_8(unknown) = ^CallSideEffect : ~m1369_7 +# 1370| m1370_9(unknown) = Chi : total:m1369_7, partial:m1370_8 +# 1370| v1370_10(void) = ^BufferReadSideEffect[0] : &:r1370_6, ~m1365_3 +# 1370| m1370_11(String) = ^IndirectMayWriteSideEffect[-1] : &:r1370_2 +# 1370| m1370_12(String) = Chi : total:m1370_3, partial:m1370_11 +# 1370| r1370_13(String &) = CopyValue : r1370_2 +# 1370| v1370_14(void) = Call[acceptRef] : func:r1370_1, 0:r1370_13 +# 1370| m1370_15(unknown) = ^CallSideEffect : ~m1370_9 +# 1370| m1370_16(unknown) = Chi : total:m1370_9, partial:m1370_15 +# 1370| v1370_17(void) = ^BufferReadSideEffect[0] : &:r1370_13, ~m1370_12 +# 1371| r1371_1(glval) = FunctionAddress[acceptValue] : +# 1371| r1371_2(glval) = VariableAddress[#temp1371:17] : +# 1371| m1371_3(String) = Uninitialized[#temp1371:17] : &:r1371_2 +# 1371| r1371_4(glval) = FunctionAddress[String] : +# 1371| r1371_5(glval) = VariableAddress[s] : +# 1371| r1371_6(glval) = Convert : r1371_5 +# 1371| r1371_7(String &) = CopyValue : r1371_6 +# 1371| v1371_8(void) = Call[String] : func:r1371_4, this:r1371_2, 0:r1371_7 +# 1371| m1371_9(unknown) = ^CallSideEffect : ~m1370_16 +# 1371| m1371_10(unknown) = Chi : total:m1370_16, partial:m1371_9 +# 1371| v1371_11(void) = ^BufferReadSideEffect[0] : &:r1371_7, ~m1366_6 +# 1371| m1371_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1371_2 +# 1371| m1371_13(String) = Chi : total:m1371_3, partial:m1371_12 +# 1371| r1371_14(String) = Load[#temp1371:17] : &:r1371_2, m1371_13 +# 1371| v1371_15(void) = Call[acceptValue] : func:r1371_1, 0:r1371_14 +# 1371| m1371_16(unknown) = ^CallSideEffect : ~m1371_10 +# 1371| m1371_17(unknown) = Chi : total:m1371_10, partial:m1371_16 +# 1372| r1372_1(glval) = FunctionAddress[acceptValue] : +# 1372| r1372_2(glval) = VariableAddress[#temp1372:25] : +# 1372| m1372_3(String) = Uninitialized[#temp1372:25] : &:r1372_2 +# 1372| r1372_4(glval) = FunctionAddress[String] : +# 1372| r1372_5(glval) = StringConstant["foo"] : +# 1372| r1372_6(char *) = Convert : r1372_5 +# 1372| v1372_7(void) = Call[String] : func:r1372_4, this:r1372_2, 0:r1372_6 +# 1372| m1372_8(unknown) = ^CallSideEffect : ~m1371_17 +# 1372| m1372_9(unknown) = Chi : total:m1371_17, partial:m1372_8 +# 1372| v1372_10(void) = ^BufferReadSideEffect[0] : &:r1372_6, ~m1365_3 +# 1372| m1372_11(String) = ^IndirectMayWriteSideEffect[-1] : &:r1372_2 +# 1372| m1372_12(String) = Chi : total:m1372_3, partial:m1372_11 +# 1372| r1372_13(String) = Load[#temp1372:25] : &:r1372_2, m1372_12 +# 1372| v1372_14(void) = Call[acceptValue] : func:r1372_1, 0:r1372_13 +# 1372| m1372_15(unknown) = ^CallSideEffect : ~m1372_9 +# 1372| m1372_16(unknown) = Chi : total:m1372_9, partial:m1372_15 +# 1373| r1373_1(glval) = VariableAddress[#temp1373:5] : +# 1373| m1373_2(String) = Uninitialized[#temp1373:5] : &:r1373_1 +# 1373| r1373_3(glval) = FunctionAddress[String] : +# 1373| v1373_4(void) = Call[String] : func:r1373_3, this:r1373_1 +# 1373| m1373_5(unknown) = ^CallSideEffect : ~m1372_16 +# 1373| m1373_6(unknown) = Chi : total:m1372_16, partial:m1373_5 +# 1373| m1373_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_1 +# 1373| m1373_8(String) = Chi : total:m1373_2, partial:m1373_7 +# 1373| r1373_9(glval) = Convert : r1373_1 +# 1373| r1373_10(glval) = FunctionAddress[c_str] : +# 1373| r1373_11(char *) = Call[c_str] : func:r1373_10, this:r1373_9 +# 1373| m1373_12(unknown) = ^CallSideEffect : ~m1373_6 +# 1373| m1373_13(unknown) = Chi : total:m1373_6, partial:m1373_12 +# 1373| v1373_14(void) = ^IndirectReadSideEffect[-1] : &:r1373_9, m1373_8 +# 1374| r1374_1(glval) = VariableAddress[#temp1374:5] : +# 1374| r1374_2(glval) = FunctionAddress[returnValue] : +# 1374| r1374_3(String) = Call[returnValue] : func:r1374_2 +# 1374| m1374_4(unknown) = ^CallSideEffect : ~m1373_13 +# 1374| m1374_5(unknown) = Chi : total:m1373_13, partial:m1374_4 +# 1374| m1374_6(String) = Store[#temp1374:5] : &:r1374_1, r1374_3 +# 1374| r1374_7(glval) = Convert : r1374_1 +# 1374| r1374_8(glval) = FunctionAddress[c_str] : +# 1374| r1374_9(char *) = Call[c_str] : func:r1374_8, this:r1374_7 +# 1374| m1374_10(unknown) = ^CallSideEffect : ~m1374_5 +# 1374| m1374_11(unknown) = Chi : total:m1374_5, partial:m1374_10 +# 1374| v1374_12(void) = ^IndirectReadSideEffect[-1] : &:r1374_7, m1374_6 +# 1376| r1376_1(glval) = VariableAddress[#temp1376:5] : +# 1376| r1376_2(glval) = FunctionAddress[defaultConstruct] : +# 1376| r1376_3(String) = Call[defaultConstruct] : func:r1376_2 +# 1376| m1376_4(unknown) = ^CallSideEffect : ~m1374_11 +# 1376| m1376_5(unknown) = Chi : total:m1374_11, partial:m1376_4 +# 1376| m1376_6(String) = Store[#temp1376:5] : &:r1376_1, r1376_3 +# 1376| r1376_7(String) = Load[#temp1376:5] : &:r1376_1, m1376_6 +# 1377| v1377_1(void) = NoOp : +# 1365| v1365_5(void) = ReturnVoid : +# 1365| v1365_6(void) = AliasedUse : ~m1376_5 +# 1365| v1365_7(void) = ExitFunction : + +# 1379| void temporary_destructor_only() +# 1379| Block 0 +# 1379| v1379_1(void) = EnterFunction : +# 1379| m1379_2(unknown) = AliasedDefinition : +# 1379| m1379_3(unknown) = InitializeNonLocal : +# 1379| m1379_4(unknown) = Chi : total:m1379_2, partial:m1379_3 +# 1380| r1380_1(glval) = VariableAddress[d] : +# 1380| r1380_2(glval) = FunctionAddress[returnValue] : +# 1380| r1380_3(destructor_only) = Call[returnValue] : func:r1380_2 +# 1380| m1380_4(unknown) = ^CallSideEffect : ~m1379_4 +# 1380| m1380_5(unknown) = Chi : total:m1379_4, partial:m1380_4 +# 1380| m1380_6(destructor_only) = Store[d] : &:r1380_1, r1380_3 +# 1381| r1381_1(glval) = VariableAddress[rd] : +# 1381| r1381_2(glval) = VariableAddress[#temp1381:33] : +# 1381| r1381_3(glval) = FunctionAddress[returnValue] : +# 1381| r1381_4(destructor_only) = Call[returnValue] : func:r1381_3 +# 1381| m1381_5(unknown) = ^CallSideEffect : ~m1380_5 +# 1381| m1381_6(unknown) = Chi : total:m1380_5, partial:m1381_5 +# 1381| m1381_7(destructor_only) = Store[#temp1381:33] : &:r1381_2, r1381_4 +# 1381| r1381_8(glval) = Convert : r1381_2 +# 1381| r1381_9(destructor_only &) = CopyValue : r1381_8 +# 1381| m1381_10(destructor_only &) = Store[rd] : &:r1381_1, r1381_9 +# 1382| r1382_1(glval) = VariableAddress[d2] : +# 1382| m1382_2(destructor_only) = Uninitialized[d2] : &:r1382_1 +# 1383| r1383_1(glval) = FunctionAddress[acceptRef] : +# 1383| r1383_2(glval) = VariableAddress[d] : +# 1383| r1383_3(glval) = Convert : r1383_2 +# 1383| r1383_4(destructor_only &) = CopyValue : r1383_3 +# 1383| v1383_5(void) = Call[acceptRef] : func:r1383_1, 0:r1383_4 +# 1383| m1383_6(unknown) = ^CallSideEffect : ~m1381_6 +# 1383| m1383_7(unknown) = Chi : total:m1381_6, partial:m1383_6 +# 1383| v1383_8(void) = ^BufferReadSideEffect[0] : &:r1383_4, ~m1380_6 +# 1384| r1384_1(glval) = FunctionAddress[acceptValue] : +# 1384| r1384_2(glval) = VariableAddress[#temp1384:17] : +# 1384| r1384_3(glval) = VariableAddress[d] : +# 1384| r1384_4(destructor_only) = Load[d] : &:r1384_3, m1380_6 +# 1384| m1384_5(destructor_only) = Store[#temp1384:17] : &:r1384_2, r1384_4 +# 1384| r1384_6(destructor_only) = Load[#temp1384:17] : &:r1384_2, m1384_5 +# 1384| v1384_7(void) = Call[acceptValue] : func:r1384_1, 0:r1384_6 +# 1384| m1384_8(unknown) = ^CallSideEffect : ~m1383_7 +# 1384| m1384_9(unknown) = Chi : total:m1383_7, partial:m1384_8 +# 1385| r1385_1(glval) = VariableAddress[#temp1385:5] : +# 1385| r1385_2(destructor_only) = Constant[0] : +# 1385| m1385_3(destructor_only) = Store[#temp1385:5] : &:r1385_1, r1385_2 +# 1385| r1385_4(glval) = FunctionAddress[method] : +# 1385| v1385_5(void) = Call[method] : func:r1385_4, this:r1385_1 +# 1385| m1385_6(unknown) = ^CallSideEffect : ~m1384_9 +# 1385| m1385_7(unknown) = Chi : total:m1384_9, partial:m1385_6 +# 1385| v1385_8(void) = ^IndirectReadSideEffect[-1] : &:r1385_1, m1385_3 +# 1385| m1385_9(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1385_1 +# 1385| m1385_10(destructor_only) = Chi : total:m1385_3, partial:m1385_9 +# 1386| r1386_1(glval) = VariableAddress[#temp1386:5] : +# 1386| r1386_2(glval) = FunctionAddress[returnValue] : +# 1386| r1386_3(destructor_only) = Call[returnValue] : func:r1386_2 +# 1386| m1386_4(unknown) = ^CallSideEffect : ~m1385_7 +# 1386| m1386_5(unknown) = Chi : total:m1385_7, partial:m1386_4 +# 1386| m1386_6(destructor_only) = Store[#temp1386:5] : &:r1386_1, r1386_3 +# 1386| r1386_7(glval) = FunctionAddress[method] : +# 1386| v1386_8(void) = Call[method] : func:r1386_7, this:r1386_1 +# 1386| m1386_9(unknown) = ^CallSideEffect : ~m1386_5 +# 1386| m1386_10(unknown) = Chi : total:m1386_5, partial:m1386_9 +# 1386| v1386_11(void) = ^IndirectReadSideEffect[-1] : &:r1386_1, m1386_6 +# 1386| m1386_12(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1386_1 +# 1386| m1386_13(destructor_only) = Chi : total:m1386_6, partial:m1386_12 +# 1388| r1388_1(glval) = VariableAddress[#temp1388:5] : +# 1388| r1388_2(glval) = FunctionAddress[defaultConstruct] : +# 1388| r1388_3(destructor_only) = Call[defaultConstruct] : func:r1388_2 +# 1388| m1388_4(unknown) = ^CallSideEffect : ~m1386_10 +# 1388| m1388_5(unknown) = Chi : total:m1386_10, partial:m1388_4 +# 1388| m1388_6(destructor_only) = Store[#temp1388:5] : &:r1388_1, r1388_3 +# 1388| r1388_7(destructor_only) = Load[#temp1388:5] : &:r1388_1, m1388_6 +# 1389| v1389_1(void) = NoOp : +# 1379| v1379_5(void) = ReturnVoid : +# 1379| v1379_6(void) = AliasedUse : ~m1388_5 +# 1379| v1379_7(void) = ExitFunction : + +# 1391| void temporary_copy_constructor() +# 1391| Block 0 +# 1391| v1391_1(void) = EnterFunction : +# 1391| m1391_2(unknown) = AliasedDefinition : +# 1391| m1391_3(unknown) = InitializeNonLocal : +# 1391| m1391_4(unknown) = Chi : total:m1391_2, partial:m1391_3 +# 1392| r1392_1(glval) = VariableAddress[d] : +# 1392| r1392_2(glval) = FunctionAddress[returnValue] : +# 1392| r1392_3(copy_constructor) = Call[returnValue] : func:r1392_2 +# 1392| m1392_4(unknown) = ^CallSideEffect : ~m1391_4 +# 1392| m1392_5(unknown) = Chi : total:m1391_4, partial:m1392_4 +# 1392| m1392_6(copy_constructor) = Store[d] : &:r1392_1, r1392_3 +# 1393| r1393_1(glval) = VariableAddress[rd] : +# 1393| r1393_2(glval) = VariableAddress[#temp1393:34] : +# 1393| r1393_3(glval) = FunctionAddress[returnValue] : +# 1393| r1393_4(copy_constructor) = Call[returnValue] : func:r1393_3 +# 1393| m1393_5(unknown) = ^CallSideEffect : ~m1392_5 +# 1393| m1393_6(unknown) = Chi : total:m1392_5, partial:m1393_5 +# 1393| m1393_7(copy_constructor) = Store[#temp1393:34] : &:r1393_2, r1393_4 +# 1393| r1393_8(glval) = Convert : r1393_2 +# 1393| r1393_9(copy_constructor &) = CopyValue : r1393_8 +# 1393| m1393_10(copy_constructor &) = Store[rd] : &:r1393_1, r1393_9 +# 1394| r1394_1(glval) = VariableAddress[d2] : +# 1394| m1394_2(copy_constructor) = Uninitialized[d2] : &:r1394_1 +# 1394| r1394_3(glval) = FunctionAddress[copy_constructor] : +# 1394| v1394_4(void) = Call[copy_constructor] : func:r1394_3, this:r1394_1 +# 1394| m1394_5(unknown) = ^CallSideEffect : ~m1393_6 +# 1394| m1394_6(unknown) = Chi : total:m1393_6, partial:m1394_5 +# 1394| m1394_7(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1394_1 +# 1394| m1394_8(copy_constructor) = Chi : total:m1394_2, partial:m1394_7 +# 1395| r1395_1(glval) = FunctionAddress[acceptRef] : +# 1395| r1395_2(glval) = VariableAddress[d] : +# 1395| r1395_3(glval) = Convert : r1395_2 +# 1395| r1395_4(copy_constructor &) = CopyValue : r1395_3 +# 1395| v1395_5(void) = Call[acceptRef] : func:r1395_1, 0:r1395_4 +# 1395| m1395_6(unknown) = ^CallSideEffect : ~m1394_6 +# 1395| m1395_7(unknown) = Chi : total:m1394_6, partial:m1395_6 +# 1395| v1395_8(void) = ^BufferReadSideEffect[0] : &:r1395_4, ~m1392_6 +# 1396| r1396_1(glval) = FunctionAddress[acceptValue] : +# 1396| r1396_2(glval) = VariableAddress[#temp1396:17] : +# 1396| m1396_3(copy_constructor) = Uninitialized[#temp1396:17] : &:r1396_2 +# 1396| r1396_4(glval) = FunctionAddress[copy_constructor] : +# 1396| r1396_5(glval) = VariableAddress[d] : +# 1396| r1396_6(glval) = Convert : r1396_5 +# 1396| r1396_7(copy_constructor &) = CopyValue : r1396_6 +# 1396| v1396_8(void) = Call[copy_constructor] : func:r1396_4, this:r1396_2, 0:r1396_7 +# 1396| m1396_9(unknown) = ^CallSideEffect : ~m1395_7 +# 1396| m1396_10(unknown) = Chi : total:m1395_7, partial:m1396_9 +# 1396| v1396_11(void) = ^BufferReadSideEffect[0] : &:r1396_7, ~m1392_6 +# 1396| m1396_12(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1396_2 +# 1396| m1396_13(copy_constructor) = Chi : total:m1396_3, partial:m1396_12 +# 1396| r1396_14(copy_constructor) = Load[#temp1396:17] : &:r1396_2, m1396_13 +# 1396| v1396_15(void) = Call[acceptValue] : func:r1396_1, 0:r1396_14 +# 1396| m1396_16(unknown) = ^CallSideEffect : ~m1396_10 +# 1396| m1396_17(unknown) = Chi : total:m1396_10, partial:m1396_16 +# 1397| r1397_1(glval) = VariableAddress[#temp1397:5] : +# 1397| m1397_2(copy_constructor) = Uninitialized[#temp1397:5] : &:r1397_1 +# 1397| r1397_3(glval) = FunctionAddress[copy_constructor] : +# 1397| v1397_4(void) = Call[copy_constructor] : func:r1397_3, this:r1397_1 +# 1397| m1397_5(unknown) = ^CallSideEffect : ~m1396_17 +# 1397| m1397_6(unknown) = Chi : total:m1396_17, partial:m1397_5 +# 1397| m1397_7(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 +# 1397| m1397_8(copy_constructor) = Chi : total:m1397_2, partial:m1397_7 +# 1397| r1397_9(glval) = FunctionAddress[method] : +# 1397| v1397_10(void) = Call[method] : func:r1397_9, this:r1397_1 +# 1397| m1397_11(unknown) = ^CallSideEffect : ~m1397_6 +# 1397| m1397_12(unknown) = Chi : total:m1397_6, partial:m1397_11 +# 1397| v1397_13(void) = ^IndirectReadSideEffect[-1] : &:r1397_1, m1397_8 +# 1397| m1397_14(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 +# 1397| m1397_15(copy_constructor) = Chi : total:m1397_8, partial:m1397_14 +# 1398| r1398_1(glval) = VariableAddress[#temp1398:5] : +# 1398| r1398_2(glval) = FunctionAddress[returnValue] : +# 1398| r1398_3(copy_constructor) = Call[returnValue] : func:r1398_2 +# 1398| m1398_4(unknown) = ^CallSideEffect : ~m1397_12 +# 1398| m1398_5(unknown) = Chi : total:m1397_12, partial:m1398_4 +# 1398| m1398_6(copy_constructor) = Store[#temp1398:5] : &:r1398_1, r1398_3 +# 1398| r1398_7(glval) = FunctionAddress[method] : +# 1398| v1398_8(void) = Call[method] : func:r1398_7, this:r1398_1 +# 1398| m1398_9(unknown) = ^CallSideEffect : ~m1398_5 +# 1398| m1398_10(unknown) = Chi : total:m1398_5, partial:m1398_9 +# 1398| v1398_11(void) = ^IndirectReadSideEffect[-1] : &:r1398_1, m1398_6 +# 1398| m1398_12(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_1 +# 1398| m1398_13(copy_constructor) = Chi : total:m1398_6, partial:m1398_12 +# 1399| r1399_1(glval) = VariableAddress[#temp1399:5] : +# 1399| r1399_2(glval) = FunctionAddress[defaultConstruct] : +# 1399| r1399_3(copy_constructor) = Call[defaultConstruct] : func:r1399_2 +# 1399| m1399_4(unknown) = ^CallSideEffect : ~m1398_10 +# 1399| m1399_5(unknown) = Chi : total:m1398_10, partial:m1399_4 +# 1399| m1399_6(copy_constructor) = Store[#temp1399:5] : &:r1399_1, r1399_3 +# 1399| r1399_7(copy_constructor) = Load[#temp1399:5] : &:r1399_1, m1399_6 +# 1401| r1401_1(glval) = VariableAddress[y] : +# 1401| r1401_2(glval) = VariableAddress[#temp1401:13] : +# 1401| r1401_3(glval) = FunctionAddress[returnValue] : +# 1401| r1401_4(copy_constructor) = Call[returnValue] : func:r1401_3 +# 1401| m1401_5(unknown) = ^CallSideEffect : ~m1399_5 +# 1401| m1401_6(unknown) = Chi : total:m1399_5, partial:m1401_5 +# 1401| m1401_7(copy_constructor) = Store[#temp1401:13] : &:r1401_2, r1401_4 +# 1401| r1401_8(glval) = FieldAddress[y] : r1401_2 +# 1401| r1401_9(int) = Load[?] : &:r1401_8, ~m1401_7 +# 1401| m1401_10(int) = Store[y] : &:r1401_1, r1401_9 +# 1402| v1402_1(void) = NoOp : +# 1391| v1391_5(void) = ReturnVoid : +# 1391| v1391_6(void) = AliasedUse : ~m1401_6 +# 1391| v1391_7(void) = ExitFunction : + +# 1404| void temporary_point() +# 1404| Block 0 +# 1404| v1404_1(void) = EnterFunction : +# 1404| m1404_2(unknown) = AliasedDefinition : +# 1404| m1404_3(unknown) = InitializeNonLocal : +# 1404| m1404_4(unknown) = Chi : total:m1404_2, partial:m1404_3 +# 1405| r1405_1(glval) = VariableAddress[p] : +# 1405| r1405_2(glval) = FunctionAddress[returnValue] : +# 1405| r1405_3(Point) = Call[returnValue] : func:r1405_2 +# 1405| m1405_4(unknown) = ^CallSideEffect : ~m1404_4 +# 1405| m1405_5(unknown) = Chi : total:m1404_4, partial:m1405_4 +# 1405| m1405_6(Point) = Store[p] : &:r1405_1, r1405_3 +# 1406| r1406_1(glval) = VariableAddress[rp] : +# 1406| r1406_2(glval) = VariableAddress[#temp1406:23] : +# 1406| r1406_3(glval) = FunctionAddress[returnValue] : +# 1406| r1406_4(Point) = Call[returnValue] : func:r1406_3 +# 1406| m1406_5(unknown) = ^CallSideEffect : ~m1405_5 +# 1406| m1406_6(unknown) = Chi : total:m1405_5, partial:m1406_5 +# 1406| m1406_7(Point) = Store[#temp1406:23] : &:r1406_2, r1406_4 +# 1406| r1406_8(glval) = Convert : r1406_2 +# 1406| r1406_9(Point &) = CopyValue : r1406_8 +# 1406| m1406_10(Point &) = Store[rp] : &:r1406_1, r1406_9 +# 1408| r1408_1(glval) = FunctionAddress[acceptRef] : +# 1408| r1408_2(glval) = VariableAddress[p] : +# 1408| r1408_3(glval) = Convert : r1408_2 +# 1408| r1408_4(Point &) = CopyValue : r1408_3 +# 1408| v1408_5(void) = Call[acceptRef] : func:r1408_1, 0:r1408_4 +# 1408| m1408_6(unknown) = ^CallSideEffect : ~m1406_6 +# 1408| m1408_7(unknown) = Chi : total:m1406_6, partial:m1408_6 +# 1408| v1408_8(void) = ^BufferReadSideEffect[0] : &:r1408_4, ~m1405_6 +# 1409| r1409_1(glval) = FunctionAddress[acceptValue] : +# 1409| r1409_2(glval) = VariableAddress[p] : +# 1409| r1409_3(Point) = Load[p] : &:r1409_2, m1405_6 +# 1409| v1409_4(void) = Call[acceptValue] : func:r1409_1, 0:r1409_3 +# 1409| m1409_5(unknown) = ^CallSideEffect : ~m1408_7 +# 1409| m1409_6(unknown) = Chi : total:m1408_7, partial:m1409_5 +# 1410| r1410_1(int) = Constant[0] : +# 1411| r1411_1(glval) = VariableAddress[y] : +# 1411| r1411_2(glval) = FunctionAddress[returnValue] : +# 1411| r1411_3(Point) = Call[returnValue] : func:r1411_2 +# 1411| m1411_4(unknown) = ^CallSideEffect : ~m1409_6 +# 1411| m1411_5(unknown) = Chi : total:m1409_6, partial:m1411_4 +# 1411| r1411_6(glval) = VariableAddress[#temp1411:13] : +# 1411| m1411_7(Point) = Store[#temp1411:13] : &:r1411_6, r1411_3 +# 1411| r1411_8(glval) = FieldAddress[y] : r1411_6 +# 1411| r1411_9(int) = Load[?] : &:r1411_8, ~m1411_7 +# 1411| m1411_10(int) = Store[y] : &:r1411_1, r1411_9 +# 1413| r1413_1(glval) = FunctionAddress[defaultConstruct] : +# 1413| r1413_2(Point) = Call[defaultConstruct] : func:r1413_1 +# 1413| m1413_3(unknown) = ^CallSideEffect : ~m1411_5 +# 1413| m1413_4(unknown) = Chi : total:m1411_5, partial:m1413_3 +# 1414| v1414_1(void) = NoOp : +# 1404| v1404_5(void) = ReturnVoid : +# 1404| v1404_6(void) = AliasedUse : ~m1413_4 +# 1404| v1404_7(void) = ExitFunction : + +# 1421| void temporary_unusual_fields() +# 1421| Block 0 +# 1421| v1421_1(void) = EnterFunction : +# 1421| m1421_2(unknown) = AliasedDefinition : +# 1421| m1421_3(unknown) = InitializeNonLocal : +# 1421| m1421_4(unknown) = Chi : total:m1421_2, partial:m1421_3 +# 1422| r1422_1(glval) = VariableAddress[rx] : +# 1422| r1422_2(glval) = FunctionAddress[returnValue] : +# 1422| r1422_3(UnusualFields) = Call[returnValue] : func:r1422_2 +# 1422| m1422_4(unknown) = ^CallSideEffect : ~m1421_4 +# 1422| m1422_5(unknown) = Chi : total:m1421_4, partial:m1422_4 +# 1422| r1422_6(glval) = VariableAddress[#temp1422:21] : +# 1422| m1422_7(UnusualFields) = Store[#temp1422:21] : &:r1422_6, r1422_3 +# 1422| r1422_8(glval) = FieldAddress[r] : r1422_6 +# 1422| r1422_9(int &) = Load[?] : &:r1422_8, ~m1422_7 +# 1422| r1422_10(glval) = CopyValue : r1422_9 +# 1422| r1422_11(glval) = Convert : r1422_10 +# 1422| r1422_12(int &) = CopyValue : r1422_11 +# 1422| m1422_13(int &) = Store[rx] : &:r1422_1, r1422_12 +# 1423| r1423_1(glval) = VariableAddress[x] : +# 1423| r1423_2(glval) = FunctionAddress[returnValue] : +# 1423| r1423_3(UnusualFields) = Call[returnValue] : func:r1423_2 +# 1423| m1423_4(unknown) = ^CallSideEffect : ~m1422_5 +# 1423| m1423_5(unknown) = Chi : total:m1422_5, partial:m1423_4 +# 1423| r1423_6(glval) = VariableAddress[#temp1423:13] : +# 1423| m1423_7(UnusualFields) = Store[#temp1423:13] : &:r1423_6, r1423_3 +# 1423| r1423_8(glval) = FieldAddress[r] : r1423_6 +# 1423| r1423_9(int &) = Load[?] : &:r1423_8, ~m1423_7 +# 1423| r1423_10(int) = Load[?] : &:r1423_9, ~m1423_5 +# 1423| m1423_11(int) = Store[x] : &:r1423_1, r1423_10 +# 1425| r1425_1(glval) = VariableAddress[rf] : +# 1425| r1425_2(glval) = FunctionAddress[returnValue] : +# 1425| r1425_3(UnusualFields) = Call[returnValue] : func:r1425_2 +# 1425| m1425_4(unknown) = ^CallSideEffect : ~m1423_5 +# 1425| m1425_5(unknown) = Chi : total:m1423_5, partial:m1425_4 +# 1425| r1425_6(glval) = VariableAddress[#temp1425:23] : +# 1425| m1425_7(UnusualFields) = Store[#temp1425:23] : &:r1425_6, r1425_3 +# 1425| r1425_8(glval) = FieldAddress[a] : r1425_6 +# 1425| r1425_9(float *) = Convert : r1425_8 +# 1425| r1425_10(int) = Constant[3] : +# 1425| r1425_11(glval) = PointerAdd[4] : r1425_9, r1425_10 +# 1425| r1425_12(glval) = Convert : r1425_11 +# 1425| r1425_13(float &) = CopyValue : r1425_12 +# 1425| m1425_14(float &) = Store[rf] : &:r1425_1, r1425_13 +# 1426| r1426_1(glval) = VariableAddress[f] : +# 1426| r1426_2(glval) = FunctionAddress[returnValue] : +# 1426| r1426_3(UnusualFields) = Call[returnValue] : func:r1426_2 +# 1426| m1426_4(unknown) = ^CallSideEffect : ~m1425_5 +# 1426| m1426_5(unknown) = Chi : total:m1425_5, partial:m1426_4 +# 1426| r1426_6(glval) = VariableAddress[#temp1426:15] : +# 1426| m1426_7(UnusualFields) = Store[#temp1426:15] : &:r1426_6, r1426_3 +# 1426| r1426_8(glval) = FieldAddress[a] : r1426_6 +# 1426| r1426_9(float *) = Convert : r1426_8 +# 1426| r1426_10(int) = Constant[5] : +# 1426| r1426_11(glval) = PointerAdd[4] : r1426_9, r1426_10 +# 1426| r1426_12(float) = Load[?] : &:r1426_11, ~m1426_7 +# 1426| m1426_13(float) = Store[f] : &:r1426_1, r1426_12 +# 1427| v1427_1(void) = NoOp : +# 1421| v1421_5(void) = ReturnVoid : +# 1421| v1421_6(void) = AliasedUse : ~m1426_5 +# 1421| v1421_7(void) = ExitFunction : + +# 1443| void temporary_hierarchy() +# 1443| Block 0 +# 1443| v1443_1(void) = EnterFunction : +# 1443| m1443_2(unknown) = AliasedDefinition : +# 1443| m1443_3(unknown) = InitializeNonLocal : +# 1443| m1443_4(unknown) = Chi : total:m1443_2, partial:m1443_3 +# 1444| r1444_1(glval) = VariableAddress[b] : +#-----| r0_1(glval) = VariableAddress[#temp0:0] : +# 1444| r1444_2(glval) = FunctionAddress[returnValue] : +# 1444| r1444_3(POD_Middle) = Call[returnValue] : func:r1444_2 +# 1444| m1444_4(unknown) = ^CallSideEffect : ~m1443_4 +# 1444| m1444_5(unknown) = Chi : total:m1443_4, partial:m1444_4 +# 1444| m1444_6(POD_Middle) = Store[#temp0:0] : &:r0_1, r1444_3 +#-----| r0_2(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r0_1 +#-----| r0_3(POD_Base) = Load[?] : &:r0_2, ~m1444_6 +#-----| m0_4(POD_Base) = Store[b] : &:r1444_1, r0_3 +# 1445| r1445_1(glval) = VariableAddress[#temp1445:9] : +# 1445| r1445_2(glval) = FunctionAddress[returnValue] : +# 1445| r1445_3(POD_Derived) = Call[returnValue] : func:r1445_2 +# 1445| m1445_4(unknown) = ^CallSideEffect : ~m1444_5 +# 1445| m1445_5(unknown) = Chi : total:m1444_5, partial:m1445_4 +# 1445| m1445_6(POD_Derived) = Store[#temp1445:9] : &:r1445_1, r1445_3 +# 1445| r1445_7(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1445_1 +# 1445| r1445_8(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1445_7 +# 1445| r1445_9(POD_Base) = Load[?] : &:r1445_8, ~m1445_6 +# 1445| r1445_10(glval) = VariableAddress[b] : +# 1445| m1445_11(POD_Base) = Store[b] : &:r1445_10, r1445_9 +# 1446| r1446_1(glval) = VariableAddress[x] : +#-----| r0_5(glval) = VariableAddress[#temp0:0] : +# 1446| r1446_2(glval) = FunctionAddress[returnValue] : +# 1446| r1446_3(POD_Derived) = Call[returnValue] : func:r1446_2 +# 1446| m1446_4(unknown) = ^CallSideEffect : ~m1445_5 +# 1446| m1446_5(unknown) = Chi : total:m1445_5, partial:m1446_4 +# 1446| m1446_6(POD_Derived) = Store[#temp0:0] : &:r0_5, r1446_3 +#-----| r0_6(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r0_5 +#-----| r0_7(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r0_6 +# 1446| r1446_7(glval) = FieldAddress[x] : r0_7 +# 1446| r1446_8(int) = Load[?] : &:r1446_7, ~m1446_6 +# 1446| m1446_9(int) = Store[x] : &:r1446_1, r1446_8 +# 1447| r1447_1(glval) = VariableAddress[f] : +#-----| r0_8(glval) = VariableAddress[#temp0:0] : +# 1447| r1447_2(glval) = FunctionAddress[returnValue] : +# 1447| r1447_3(POD_Derived) = Call[returnValue] : func:r1447_2 +# 1447| m1447_4(unknown) = ^CallSideEffect : ~m1446_5 +# 1447| m1447_5(unknown) = Chi : total:m1446_5, partial:m1447_4 +# 1447| m1447_6(POD_Derived) = Store[#temp0:0] : &:r0_8, r1447_3 +#-----| r0_9(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r0_8 +#-----| r0_10(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r0_9 +#-----| r0_11(glval) = Convert : r0_10 +# 1447| r1447_7(glval) = FunctionAddress[f] : +# 1447| r1447_8(float) = Call[f] : func:r1447_7, this:r0_11 +# 1447| m1447_9(unknown) = ^CallSideEffect : ~m1447_5 +# 1447| m1447_10(unknown) = Chi : total:m1447_5, partial:m1447_9 +#-----| v0_12(void) = ^IndirectReadSideEffect[-1] : &:r0_11, ~m1447_6 +# 1447| m1447_11(float) = Store[f] : &:r1447_1, r1447_8 +# 1448| v1448_1(void) = NoOp : +# 1443| v1443_5(void) = ReturnVoid : +# 1443| v1443_6(void) = AliasedUse : ~m1447_10 +# 1443| v1443_7(void) = ExitFunction : + +# 1451| void Inheritance_Test_B::~Inheritance_Test_B() +# 1451| Block 0 +# 1451| v1451_1(void) = EnterFunction : +# 1451| m1451_2(unknown) = AliasedDefinition : +# 1451| m1451_3(unknown) = InitializeNonLocal : +# 1451| m1451_4(unknown) = Chi : total:m1451_2, partial:m1451_3 +# 1451| r1451_5(glval) = VariableAddress[#this] : +# 1451| m1451_6(glval) = InitializeParameter[#this] : &:r1451_5 +# 1451| r1451_7(glval) = Load[#this] : &:r1451_5, m1451_6 +# 1451| m1451_8(Inheritance_Test_B) = InitializeIndirection[#this] : &:r1451_7 +# 1451| v1451_9(void) = NoOp : +# 1451| v1451_10(void) = ReturnIndirection[#this] : &:r1451_7, m1451_8 +# 1451| v1451_11(void) = ReturnVoid : +# 1451| v1451_12(void) = AliasedUse : m1451_3 +# 1451| v1451_13(void) = ExitFunction : + +# 1457| void Inheritance_Test_A::Inheritance_Test_A() +# 1457| Block 0 +# 1457| v1457_1(void) = EnterFunction : +# 1457| m1457_2(unknown) = AliasedDefinition : +# 1457| m1457_3(unknown) = InitializeNonLocal : +# 1457| m1457_4(unknown) = Chi : total:m1457_2, partial:m1457_3 +# 1457| r1457_5(glval) = VariableAddress[#this] : +# 1457| m1457_6(glval) = InitializeParameter[#this] : &:r1457_5 +# 1457| r1457_7(glval) = Load[#this] : &:r1457_5, m1457_6 +# 1457| m1457_8(Inheritance_Test_A) = InitializeIndirection[#this] : &:r1457_7 +# 1457| r1457_9(glval) = FieldAddress[x] : m1457_6 +# 1457| r1457_10(int) = Constant[42] : +# 1457| m1457_11(int) = Store[?] : &:r1457_9, r1457_10 +# 1457| m1457_12(unknown) = Chi : total:m1457_8, partial:m1457_11 +# 1458| r1458_1(int) = Constant[3] : +# 1458| r1458_2(glval) = VariableAddress[#this] : +# 1458| r1458_3(Inheritance_Test_A *) = Load[#this] : &:r1458_2, m1457_6 +# 1458| r1458_4(glval) = FieldAddress[y] : r1458_3 +# 1458| m1458_5(int) = Store[?] : &:r1458_4, r1458_1 +# 1458| m1458_6(unknown) = Chi : total:m1457_12, partial:m1458_5 +# 1459| v1459_1(void) = NoOp : +# 1457| v1457_13(void) = ReturnIndirection[#this] : &:r1457_7, m1458_6 +# 1457| v1457_14(void) = ReturnVoid : +# 1457| v1457_15(void) = AliasedUse : m1457_3 +# 1457| v1457_16(void) = ExitFunction : + +# 1462| void array_structured_binding() +# 1462| Block 0 +# 1462| v1462_1(void) = EnterFunction : +# 1462| m1462_2(unknown) = AliasedDefinition : +# 1462| m1462_3(unknown) = InitializeNonLocal : +# 1462| m1462_4(unknown) = Chi : total:m1462_2, partial:m1462_3 +# 1463| r1463_1(glval) = VariableAddress[xs] : +# 1463| m1463_2(int[2]) = Uninitialized[xs] : &:r1463_1 +# 1463| r1463_3(int) = Constant[0] : +# 1463| r1463_4(glval) = PointerAdd[4] : r1463_1, r1463_3 +# 1463| r1463_5(int) = Constant[1] : +# 1463| m1463_6(int) = Store[?] : &:r1463_4, r1463_5 +# 1463| m1463_7(int[2]) = Chi : total:m1463_2, partial:m1463_6 +# 1463| r1463_8(int) = Constant[1] : +# 1463| r1463_9(glval) = PointerAdd[4] : r1463_1, r1463_8 +# 1463| r1463_10(int) = Constant[2] : +# 1463| m1463_11(int) = Store[?] : &:r1463_9, r1463_10 +# 1463| m1463_12(int[2]) = Chi : total:m1463_7, partial:m1463_11 +# 1466| r1466_1(glval) = VariableAddress[(unnamed local variable)] : +# 1466| r1466_2(glval) = VariableAddress[xs] : +# 1466| r1466_3(int(&)[2]) = CopyValue : r1466_2 +# 1466| m1466_4(int(&)[2]) = Store[(unnamed local variable)] : &:r1466_1, r1466_3 +# 1466| r1466_5(glval) = VariableAddress[x0] : +#-----| r0_1(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_2(int(&)[2]) = Load[(unnamed local variable)] : &:r0_1, m1466_4 +#-----| r0_3(glval) = CopyValue : r0_2 +#-----| r0_4(int *) = Convert : r0_3 +#-----| r0_5(unsigned long) = Constant[0] : +#-----| r0_6(glval) = PointerAdd[4] : r0_4, r0_5 +#-----| m0_7(int &) = Store[x0] : &:r1466_5, r0_6 +# 1466| r1466_6(glval) = VariableAddress[x1] : +#-----| r0_8(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_9(int(&)[2]) = Load[(unnamed local variable)] : &:r0_8, m1466_4 +#-----| r0_10(glval) = CopyValue : r0_9 +#-----| r0_11(int *) = Convert : r0_10 +#-----| r0_12(unsigned long) = Constant[1] : +#-----| r0_13(glval) = PointerAdd[4] : r0_11, r0_12 +#-----| m0_14(int &) = Store[x1] : &:r1466_6, r0_13 +# 1467| r1467_1(int) = Constant[3] : +# 1467| r1467_2(glval) = VariableAddress[x1] : +# 1467| r1467_3(int &) = Load[x1] : &:r1467_2, m0_14 +# 1467| m1467_4(int) = Store[?] : &:r1467_3, r1467_1 +# 1467| m1467_5(int[2]) = Chi : total:m1463_12, partial:m1467_4 +# 1468| r1468_1(glval) = VariableAddress[rx1] : +# 1468| r1468_2(glval) = VariableAddress[x1] : +# 1468| r1468_3(int &) = Load[x1] : &:r1468_2, m0_14 +# 1468| r1468_4(int &) = CopyValue : r1468_3 +# 1468| m1468_5(int &) = Store[rx1] : &:r1468_1, r1468_4 +# 1469| r1469_1(glval) = VariableAddress[x] : +# 1469| r1469_2(glval) = VariableAddress[x1] : +# 1469| r1469_3(int &) = Load[x1] : &:r1469_2, m0_14 +# 1469| r1469_4(int) = Load[?] : &:r1469_3, m1467_4 +# 1469| m1469_5(int) = Store[x] : &:r1469_1, r1469_4 +# 1473| r1473_1(glval) = VariableAddress[unnamed_local_variable] : +# 1473| r1473_2(glval) = VariableAddress[xs] : +# 1473| r1473_3(int(&)[2]) = CopyValue : r1473_2 +# 1473| m1473_4(int(&)[2]) = Store[unnamed_local_variable] : &:r1473_1, r1473_3 +# 1474| r1474_1(glval) = VariableAddress[x0] : +# 1474| r1474_2(glval) = VariableAddress[unnamed_local_variable] : +# 1474| r1474_3(int(&)[2]) = Load[unnamed_local_variable] : &:r1474_2, m1473_4 +# 1474| r1474_4(glval) = CopyValue : r1474_3 +# 1474| r1474_5(int *) = Convert : r1474_4 +# 1474| r1474_6(int) = Constant[0] : +# 1474| r1474_7(glval) = PointerAdd[4] : r1474_5, r1474_6 +# 1474| r1474_8(int &) = CopyValue : r1474_7 +# 1474| m1474_9(int &) = Store[x0] : &:r1474_1, r1474_8 +# 1475| r1475_1(glval) = VariableAddress[x1] : +# 1475| r1475_2(glval) = VariableAddress[unnamed_local_variable] : +# 1475| r1475_3(int(&)[2]) = Load[unnamed_local_variable] : &:r1475_2, m1473_4 +# 1475| r1475_4(glval) = CopyValue : r1475_3 +# 1475| r1475_5(int *) = Convert : r1475_4 +# 1475| r1475_6(int) = Constant[1] : +# 1475| r1475_7(glval) = PointerAdd[4] : r1475_5, r1475_6 +# 1475| r1475_8(int &) = CopyValue : r1475_7 +# 1475| m1475_9(int &) = Store[x1] : &:r1475_1, r1475_8 +# 1476| r1476_1(int) = Constant[3] : +# 1476| r1476_2(glval) = VariableAddress[x1] : +# 1476| r1476_3(int &) = Load[x1] : &:r1476_2, m1475_9 +# 1476| r1476_4(glval) = CopyValue : r1476_3 +# 1476| m1476_5(int) = Store[?] : &:r1476_4, r1476_1 +# 1476| m1476_6(int[2]) = Chi : total:m1467_5, partial:m1476_5 +# 1477| r1477_1(glval) = VariableAddress[rx1] : +# 1477| r1477_2(glval) = VariableAddress[x1] : +# 1477| r1477_3(int &) = Load[x1] : &:r1477_2, m1475_9 +# 1477| r1477_4(glval) = CopyValue : r1477_3 +# 1477| r1477_5(int &) = CopyValue : r1477_4 +# 1477| m1477_6(int &) = Store[rx1] : &:r1477_1, r1477_5 +# 1478| r1478_1(glval) = VariableAddress[x] : +# 1478| r1478_2(glval) = VariableAddress[x1] : +# 1478| r1478_3(int &) = Load[x1] : &:r1478_2, m1475_9 +# 1478| r1478_4(int) = Load[?] : &:r1478_3, m1476_5 +# 1478| m1478_5(int) = Store[x] : &:r1478_1, r1478_4 +# 1480| v1480_1(void) = NoOp : +# 1462| v1462_5(void) = ReturnVoid : +# 1462| v1462_6(void) = AliasedUse : m1462_3 +# 1462| v1462_7(void) = ExitFunction : + +# 1482| void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() +# 1482| Block 0 +# 1482| v1482_1(void) = EnterFunction : +# 1482| m1482_2(unknown) = AliasedDefinition : +# 1482| m1482_3(unknown) = InitializeNonLocal : +# 1482| m1482_4(unknown) = Chi : total:m1482_2, partial:m1482_3 +# 1482| r1482_5(glval) = VariableAddress[#this] : +# 1482| m1482_6(glval) = InitializeParameter[#this] : &:r1482_5 +# 1482| r1482_7(glval) = Load[#this] : &:r1482_5, m1482_6 +# 1482| m1482_8(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1482_7 +# 1482| v1482_9(void) = NoOp : +# 1482| v1482_10(void) = ReturnIndirection[#this] : &:r1482_7, m1482_8 +# 1482| v1482_11(void) = ReturnVoid : +# 1482| v1482_12(void) = AliasedUse : m1482_3 +# 1482| v1482_13(void) = ExitFunction : + +# 1486| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() +# 1486| Block 0 +# 1486| v1486_1(void) = EnterFunction : +# 1486| m1486_2(unknown) = AliasedDefinition : +# 1486| m1486_3(unknown) = InitializeNonLocal : +# 1486| m1486_4(unknown) = Chi : total:m1486_2, partial:m1486_3 +# 1486| r1486_5(glval) = VariableAddress[#this] : +# 1486| m1486_6(glval) = InitializeParameter[#this] : &:r1486_5 +# 1486| r1486_7(glval) = Load[#this] : &:r1486_5, m1486_6 +# 1486| m1486_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1486_7 +# 1486| v1486_9(void) = NoOp : +# 1486| v1486_10(void) = ReturnIndirection[#this] : &:r1486_7, m1486_8 +# 1486| v1486_11(void) = ReturnVoid : +# 1486| v1486_12(void) = AliasedUse : m1486_3 +# 1486| v1486_13(void) = ExitFunction : + +# 1486| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) +# 1486| Block 0 +# 1486| v1486_1(void) = EnterFunction : +# 1486| m1486_2(unknown) = AliasedDefinition : +# 1486| m1486_3(unknown) = InitializeNonLocal : +# 1486| m1486_4(unknown) = Chi : total:m1486_2, partial:m1486_3 +# 1486| r1486_5(glval) = VariableAddress[#this] : +# 1486| m1486_6(glval) = InitializeParameter[#this] : &:r1486_5 +# 1486| r1486_7(glval) = Load[#this] : &:r1486_5, m1486_6 +# 1486| m1486_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1486_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(StructuredBindingDataMemberStruct &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1486| r1486_9(glval) = FieldAddress[i] : m1486_6 +# 1486| r1486_10(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_11(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_10, m0_2 +# 1486| r1486_12(glval) = CopyValue : r1486_11 +# 1486| r1486_13(glval) = FieldAddress[i] : r1486_12 +# 1486| r1486_14(int) = Load[?] : &:r1486_13, ~m0_4 +# 1486| m1486_15(int) = Store[?] : &:r1486_9, r1486_14 +# 1486| m1486_16(unknown) = Chi : total:m1486_8, partial:m1486_15 +# 1486| r1486_17(glval) = FieldAddress[d] : m1486_6 +# 1486| r1486_18(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_19(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_18, m0_2 +# 1486| r1486_20(glval) = CopyValue : r1486_19 +# 1486| r1486_21(glval) = FieldAddress[d] : r1486_20 +# 1486| r1486_22(double) = Load[?] : &:r1486_21, ~m0_4 +# 1486| m1486_23(double) = Store[?] : &:r1486_17, r1486_22 +# 1486| m1486_24(unknown) = Chi : total:m1486_16, partial:m1486_23 +# 1486| r1486_25(glval) = FieldAddress[b] : m1486_6 +# 1486| r1486_26(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_27(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_26, m0_2 +# 1486| r1486_28(glval) = CopyValue : r1486_27 +# 1486| r1486_29(glval) = FieldAddress[b] : r1486_28 +# 1486| r1486_30(unsigned int) = Load[?] : &:r1486_29, ~m0_4 +# 1486| m1486_31(unsigned int) = Store[?] : &:r1486_25, r1486_30 +# 1486| m1486_32(unknown) = Chi : total:m1486_24, partial:m1486_31 +# 1486| r1486_33(glval) = FieldAddress[r] : m1486_6 +# 1486| r1486_34(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_35(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_34, m0_2 +# 1486| r1486_36(glval) = CopyValue : r1486_35 +# 1486| r1486_37(glval) = FieldAddress[r] : r1486_36 +# 1486| r1486_38(int &) = Load[?] : &:r1486_37, ~m0_4 +# 1486| m1486_39(int &) = Store[?] : &:r1486_33, r1486_38 +# 1486| m1486_40(unknown) = Chi : total:m1486_32, partial:m1486_39 +# 1486| r1486_41(glval) = FieldAddress[p] : m1486_6 +# 1486| r1486_42(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_43(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_42, m0_2 +# 1486| r1486_44(glval) = CopyValue : r1486_43 +# 1486| r1486_45(glval) = FieldAddress[p] : r1486_44 +# 1486| r1486_46(int *) = Load[?] : &:r1486_45, ~m0_4 +# 1486| m1486_47(int *) = Store[?] : &:r1486_41, r1486_46 +# 1486| m1486_48(unknown) = Chi : total:m1486_40, partial:m1486_47 +# 1486| r1486_49(glval) = FieldAddress[xs] : m1486_6 +# 1486| r1486_50(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_51(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_50, m0_2 +# 1486| r1486_52(glval) = CopyValue : r1486_51 +# 1486| r1486_53(glval) = FieldAddress[xs] : r1486_52 +# 1486| r1486_54(int[2]) = Load[?] : &:r1486_53, ~m0_4 +# 1486| m1486_55(int[2]) = Store[?] : &:r1486_49, r1486_54 +# 1486| m1486_56(unknown) = Chi : total:m1486_48, partial:m1486_55 +# 1486| r1486_57(glval) = FieldAddress[r_alt] : m1486_6 +# 1486| r1486_58(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_59(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_58, m0_2 +# 1486| r1486_60(glval) = CopyValue : r1486_59 +# 1486| r1486_61(glval) = FieldAddress[r_alt] : r1486_60 +# 1486| r1486_62(int &) = Load[?] : &:r1486_61, ~m0_4 +# 1486| m1486_63(int &) = Store[?] : &:r1486_57, r1486_62 +# 1486| m1486_64(unknown) = Chi : total:m1486_56, partial:m1486_63 +# 1486| r1486_65(glval) = FieldAddress[m] : m1486_6 +# 1486| r1486_66(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_67(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_66, m0_2 +# 1486| r1486_68(glval) = CopyValue : r1486_67 +# 1486| r1486_69(glval) = FieldAddress[m] : r1486_68 +# 1486| r1486_70(StructuredBindingDataMemberMemberStruct) = Load[?] : &:r1486_69, ~m0_4 +# 1486| m1486_71(StructuredBindingDataMemberMemberStruct) = Store[?] : &:r1486_65, r1486_70 +# 1486| m1486_72(unknown) = Chi : total:m1486_64, partial:m1486_71 +# 1486| v1486_73(void) = NoOp : +# 1486| v1486_74(void) = ReturnIndirection[#this] : &:r1486_7, m1486_72 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 1486| v1486_75(void) = ReturnVoid : +# 1486| v1486_76(void) = AliasedUse : m1486_3 +# 1486| v1486_77(void) = ExitFunction : + +# 1499| void data_member_structured_binding() +# 1499| Block 0 +# 1499| v1499_1(void) = EnterFunction : +# 1499| m1499_2(unknown) = AliasedDefinition : +# 1499| m1499_3(unknown) = InitializeNonLocal : +# 1499| m1499_4(unknown) = Chi : total:m1499_2, partial:m1499_3 +# 1500| r1500_1(glval) = VariableAddress[s] : +# 1500| m1500_2(StructuredBindingDataMemberStruct) = Uninitialized[s] : &:r1500_1 +# 1500| r1500_3(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : +# 1500| v1500_4(void) = Call[StructuredBindingDataMemberStruct] : func:r1500_3, this:r1500_1 +# 1500| m1500_5(unknown) = ^CallSideEffect : ~m1499_4 +# 1500| m1500_6(unknown) = Chi : total:m1499_4, partial:m1500_5 +# 1500| m1500_7(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1500_1 +# 1500| m1500_8(StructuredBindingDataMemberStruct) = Chi : total:m1500_2, partial:m1500_7 +# 1503| r1503_1(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_2(glval) = VariableAddress[s] : +# 1503| r1503_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1503_2, m1500_8 +# 1503| m1503_4(StructuredBindingDataMemberStruct) = Store[(unnamed local variable)] : &:r1503_1, r1503_3 +# 1503| r1503_5(glval) = VariableAddress[i] : +# 1503| r1503_6(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_7(glval) = FieldAddress[i] : r1503_6 +# 1503| m1503_8(int &) = Store[i] : &:r1503_5, r1503_7 +# 1503| r1503_9(glval) = VariableAddress[d] : +# 1503| r1503_10(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_11(glval) = FieldAddress[d] : r1503_10 +# 1503| m1503_12(double &) = Store[d] : &:r1503_9, r1503_11 +# 1503| r1503_13(glval) = VariableAddress[b] : +# 1503| r1503_14(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_15(glval) = FieldAddress[b] : r1503_14 +# 1503| m1503_16(unsigned int &) = Store[b] : &:r1503_13, r1503_15 +# 1503| r1503_17(glval) = VariableAddress[r] : +# 1503| r1503_18(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_19(glval) = FieldAddress[r] : r1503_18 +# 1503| r1503_20(int &) = Load[?] : &:r1503_19, ~m1503_4 +# 1503| r1503_21(glval) = CopyValue : r1503_20 +# 1503| m1503_22(int &) = Store[r] : &:r1503_17, r1503_21 +# 1503| r1503_23(glval) = VariableAddress[p] : +# 1503| r1503_24(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_25(glval) = FieldAddress[p] : r1503_24 +# 1503| m1503_26(int *&) = Store[p] : &:r1503_23, r1503_25 +# 1503| r1503_27(glval) = VariableAddress[xs] : +# 1503| r1503_28(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_29(glval) = FieldAddress[xs] : r1503_28 +# 1503| m1503_30(int(&)[2]) = Store[xs] : &:r1503_27, r1503_29 +# 1503| r1503_31(glval) = VariableAddress[r_alt] : +# 1503| r1503_32(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_33(glval) = FieldAddress[r_alt] : r1503_32 +# 1503| r1503_34(int &) = Load[?] : &:r1503_33, ~m1503_4 +# 1503| r1503_35(glval) = CopyValue : r1503_34 +# 1503| m1503_36(int &) = Store[r_alt] : &:r1503_31, r1503_35 +# 1503| r1503_37(glval) = VariableAddress[m] : +# 1503| r1503_38(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_39(glval) = FieldAddress[m] : r1503_38 +# 1503| m1503_40(StructuredBindingDataMemberMemberStruct &) = Store[m] : &:r1503_37, r1503_39 +# 1504| r1504_1(double) = Constant[4.0] : +# 1504| r1504_2(glval) = VariableAddress[d] : +# 1504| r1504_3(double &) = Load[d] : &:r1504_2, m1503_12 +# 1504| m1504_4(double) = Store[?] : &:r1504_3, r1504_1 +# 1504| m1504_5(StructuredBindingDataMemberStruct) = Chi : total:m1503_4, partial:m1504_4 +# 1505| r1505_1(glval) = VariableAddress[rd] : +# 1505| r1505_2(glval) = VariableAddress[d] : +# 1505| r1505_3(double &) = Load[d] : &:r1505_2, m1503_12 +# 1505| r1505_4(double &) = CopyValue : r1505_3 +# 1505| m1505_5(double &) = Store[rd] : &:r1505_1, r1505_4 +# 1506| r1506_1(glval) = VariableAddress[v] : +# 1506| r1506_2(glval) = VariableAddress[i] : +# 1506| r1506_3(int &) = Load[i] : &:r1506_2, m1503_8 +# 1506| r1506_4(int) = Load[?] : &:r1506_3, ~m1503_4 +# 1506| m1506_5(int) = Store[v] : &:r1506_1, r1506_4 +# 1507| r1507_1(int) = Constant[5] : +# 1507| r1507_2(glval) = VariableAddress[r] : +# 1507| r1507_3(int &) = Load[r] : &:r1507_2, m1503_22 +# 1507| m1507_4(int) = Store[?] : &:r1507_3, r1507_1 +# 1507| m1507_5(unknown) = Chi : total:m1500_6, partial:m1507_4 +# 1508| r1508_1(int) = Constant[6] : +# 1508| r1508_2(glval) = VariableAddress[p] : +# 1508| r1508_3(int *&) = Load[p] : &:r1508_2, m1503_26 +# 1508| r1508_4(int *) = Load[?] : &:r1508_3, ~m1503_4 +# 1508| r1508_5(glval) = CopyValue : r1508_4 +# 1508| m1508_6(int) = Store[?] : &:r1508_5, r1508_1 +# 1508| m1508_7(unknown) = Chi : total:m1507_5, partial:m1508_6 +# 1509| r1509_1(glval) = VariableAddress[rr] : +# 1509| r1509_2(glval) = VariableAddress[r] : +# 1509| r1509_3(int &) = Load[r] : &:r1509_2, m1503_22 +# 1509| r1509_4(int &) = CopyValue : r1509_3 +# 1509| m1509_5(int &) = Store[rr] : &:r1509_1, r1509_4 +# 1510| r1510_1(glval) = VariableAddress[pr] : +# 1510| r1510_2(glval) = VariableAddress[r] : +# 1510| r1510_3(int &) = Load[r] : &:r1510_2, m1503_22 +# 1510| r1510_4(int *) = CopyValue : r1510_3 +# 1510| m1510_5(int *) = Store[pr] : &:r1510_1, r1510_4 +# 1511| r1511_1(glval) = VariableAddress[w] : +# 1511| r1511_2(glval) = VariableAddress[r] : +# 1511| r1511_3(int &) = Load[r] : &:r1511_2, m1503_22 +# 1511| r1511_4(int) = Load[?] : &:r1511_3, ~m1508_7 +# 1511| m1511_5(int) = Store[w] : &:r1511_1, r1511_4 +# 1515| r1515_1(glval) = VariableAddress[unnamed_local_variable] : +# 1515| r1515_2(glval) = VariableAddress[s] : +# 1515| r1515_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1515_2, m1500_8 +# 1515| m1515_4(StructuredBindingDataMemberStruct) = Store[unnamed_local_variable] : &:r1515_1, r1515_3 +# 1516| r1516_1(glval) = VariableAddress[i] : +# 1516| r1516_2(glval) = VariableAddress[unnamed_local_variable] : +# 1516| r1516_3(glval) = FieldAddress[i] : r1516_2 +# 1516| r1516_4(int &) = CopyValue : r1516_3 +# 1516| m1516_5(int &) = Store[i] : &:r1516_1, r1516_4 +# 1517| r1517_1(glval) = VariableAddress[d] : +# 1517| r1517_2(glval) = VariableAddress[unnamed_local_variable] : +# 1517| r1517_3(glval) = FieldAddress[d] : r1517_2 +# 1517| r1517_4(double &) = CopyValue : r1517_3 +# 1517| m1517_5(double &) = Store[d] : &:r1517_1, r1517_4 +# 1519| r1519_1(glval) = VariableAddress[r] : +# 1519| r1519_2(glval) = VariableAddress[unnamed_local_variable] : +# 1519| r1519_3(glval) = FieldAddress[r] : r1519_2 +# 1519| r1519_4(int &) = Load[?] : &:r1519_3, ~m1515_4 +# 1519| r1519_5(glval) = CopyValue : r1519_4 +# 1519| r1519_6(int &) = CopyValue : r1519_5 +# 1519| m1519_7(int &) = Store[r] : &:r1519_1, r1519_6 +# 1520| r1520_1(glval) = VariableAddress[p] : +# 1520| r1520_2(glval) = VariableAddress[unnamed_local_variable] : +# 1520| r1520_3(glval) = FieldAddress[p] : r1520_2 +# 1520| r1520_4(int *&) = CopyValue : r1520_3 +# 1520| m1520_5(int *&) = Store[p] : &:r1520_1, r1520_4 +# 1521| r1521_1(double) = Constant[4.0] : +# 1521| r1521_2(glval) = VariableAddress[d] : +# 1521| r1521_3(double &) = Load[d] : &:r1521_2, m1517_5 +# 1521| r1521_4(glval) = CopyValue : r1521_3 +# 1521| m1521_5(double) = Store[?] : &:r1521_4, r1521_1 +# 1521| m1521_6(StructuredBindingDataMemberStruct) = Chi : total:m1515_4, partial:m1521_5 +# 1522| r1522_1(glval) = VariableAddress[rd] : +# 1522| r1522_2(glval) = VariableAddress[d] : +# 1522| r1522_3(double &) = Load[d] : &:r1522_2, m1517_5 +# 1522| r1522_4(glval) = CopyValue : r1522_3 +# 1522| r1522_5(double &) = CopyValue : r1522_4 +# 1522| m1522_6(double &) = Store[rd] : &:r1522_1, r1522_5 +# 1523| r1523_1(glval) = VariableAddress[v] : +# 1523| r1523_2(glval) = VariableAddress[i] : +# 1523| r1523_3(int &) = Load[i] : &:r1523_2, m1516_5 +# 1523| r1523_4(int) = Load[?] : &:r1523_3, ~m1515_4 +# 1523| m1523_5(int) = Store[v] : &:r1523_1, r1523_4 +# 1524| r1524_1(int) = Constant[5] : +# 1524| r1524_2(glval) = VariableAddress[r] : +# 1524| r1524_3(int &) = Load[r] : &:r1524_2, m1519_7 +# 1524| r1524_4(glval) = CopyValue : r1524_3 +# 1524| m1524_5(int) = Store[?] : &:r1524_4, r1524_1 +# 1524| m1524_6(unknown) = Chi : total:m1508_7, partial:m1524_5 +# 1525| r1525_1(int) = Constant[6] : +# 1525| r1525_2(glval) = VariableAddress[p] : +# 1525| r1525_3(int *&) = Load[p] : &:r1525_2, m1520_5 +# 1525| r1525_4(int *) = Load[?] : &:r1525_3, ~m1515_4 +# 1525| r1525_5(glval) = CopyValue : r1525_4 +# 1525| m1525_6(int) = Store[?] : &:r1525_5, r1525_1 +# 1525| m1525_7(unknown) = Chi : total:m1524_6, partial:m1525_6 +# 1526| r1526_1(glval) = VariableAddress[rr] : +# 1526| r1526_2(glval) = VariableAddress[r] : +# 1526| r1526_3(int &) = Load[r] : &:r1526_2, m1519_7 +# 1526| r1526_4(glval) = CopyValue : r1526_3 +# 1526| r1526_5(int &) = CopyValue : r1526_4 +# 1526| m1526_6(int &) = Store[rr] : &:r1526_1, r1526_5 +# 1527| r1527_1(glval) = VariableAddress[pr] : +# 1527| r1527_2(glval) = VariableAddress[r] : +# 1527| r1527_3(int &) = Load[r] : &:r1527_2, m1519_7 +# 1527| r1527_4(glval) = CopyValue : r1527_3 +# 1527| r1527_5(int *) = CopyValue : r1527_4 +# 1527| m1527_6(int *) = Store[pr] : &:r1527_1, r1527_5 +# 1528| r1528_1(glval) = VariableAddress[w] : +# 1528| r1528_2(glval) = VariableAddress[r] : +# 1528| r1528_3(int &) = Load[r] : &:r1528_2, m1519_7 +# 1528| r1528_4(int) = Load[?] : &:r1528_3, ~m1525_7 +# 1528| m1528_5(int) = Store[w] : &:r1528_1, r1528_4 +# 1530| v1530_1(void) = NoOp : +# 1499| v1499_5(void) = ReturnVoid : +# 1499| v1499_6(void) = AliasedUse : ~m1525_7 +# 1499| v1499_7(void) = ExitFunction : + +# 1539| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() +# 1539| Block 0 +# 1539| v1539_1(void) = EnterFunction : +# 1539| m1539_2(unknown) = AliasedDefinition : +# 1539| m1539_3(unknown) = InitializeNonLocal : +# 1539| m1539_4(unknown) = Chi : total:m1539_2, partial:m1539_3 +# 1539| r1539_5(glval) = VariableAddress[#this] : +# 1539| m1539_6(glval) = InitializeParameter[#this] : &:r1539_5 +# 1539| r1539_7(glval) = Load[#this] : &:r1539_5, m1539_6 +# 1539| m1539_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1539_7 +# 1539| v1539_9(void) = NoOp : +# 1539| v1539_10(void) = ReturnIndirection[#this] : &:r1539_7, m1539_8 +# 1539| v1539_11(void) = ReturnVoid : +# 1539| v1539_12(void) = AliasedUse : m1539_3 +# 1539| v1539_13(void) = ExitFunction : + +# 1539| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) +# 1539| Block 0 +# 1539| v1539_1(void) = EnterFunction : +# 1539| m1539_2(unknown) = AliasedDefinition : +# 1539| m1539_3(unknown) = InitializeNonLocal : +# 1539| m1539_4(unknown) = Chi : total:m1539_2, partial:m1539_3 +# 1539| r1539_5(glval) = VariableAddress[#this] : +# 1539| m1539_6(glval) = InitializeParameter[#this] : &:r1539_5 +# 1539| r1539_7(glval) = Load[#this] : &:r1539_5, m1539_6 +# 1539| m1539_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1539_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(StructuredBindingTupleRefGet &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1539| r1539_9(glval) = FieldAddress[i] : m1539_6 +# 1539| r1539_10(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_11(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_10, m0_2 +# 1539| r1539_12(glval) = CopyValue : r1539_11 +# 1539| r1539_13(glval) = FieldAddress[i] : r1539_12 +# 1539| r1539_14(int) = Load[?] : &:r1539_13, ~m0_4 +# 1539| m1539_15(int) = Store[?] : &:r1539_9, r1539_14 +# 1539| m1539_16(unknown) = Chi : total:m1539_8, partial:m1539_15 +# 1539| r1539_17(glval) = FieldAddress[d] : m1539_6 +# 1539| r1539_18(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_19(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_18, m0_2 +# 1539| r1539_20(glval) = CopyValue : r1539_19 +# 1539| r1539_21(glval) = FieldAddress[d] : r1539_20 +# 1539| r1539_22(double) = Load[?] : &:r1539_21, ~m0_4 +# 1539| m1539_23(double) = Store[?] : &:r1539_17, r1539_22 +# 1539| m1539_24(unknown) = Chi : total:m1539_16, partial:m1539_23 +# 1539| r1539_25(glval) = FieldAddress[r] : m1539_6 +# 1539| r1539_26(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_27(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_26, m0_2 +# 1539| r1539_28(glval) = CopyValue : r1539_27 +# 1539| r1539_29(glval) = FieldAddress[r] : r1539_28 +# 1539| r1539_30(int &) = Load[?] : &:r1539_29, ~m0_4 +# 1539| m1539_31(int &) = Store[?] : &:r1539_25, r1539_30 +# 1539| m1539_32(unknown) = Chi : total:m1539_24, partial:m1539_31 +# 1539| v1539_33(void) = NoOp : +# 1539| v1539_34(void) = ReturnIndirection[#this] : &:r1539_7, m1539_32 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 1539| v1539_35(void) = ReturnVoid : +# 1539| v1539_36(void) = AliasedUse : m1539_3 +# 1539| v1539_37(void) = ExitFunction : + +# 1567| std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1567| Block 0 +# 1567| v1567_1(void) = EnterFunction : +# 1567| m1567_2(unknown) = AliasedDefinition : +# 1567| m1567_3(unknown) = InitializeNonLocal : +# 1567| m1567_4(unknown) = Chi : total:m1567_2, partial:m1567_3 +# 1567| r1567_5(glval) = VariableAddress[#this] : +# 1567| m1567_6(glval) = InitializeParameter[#this] : &:r1567_5 +# 1567| r1567_7(glval) = Load[#this] : &:r1567_5, m1567_6 +# 1567| m1567_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1567_7 +# 1568| r1568_1(glval) = VariableAddress[#return] : +# 1568| r1568_2(glval) = VariableAddress[#this] : +# 1568| r1568_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1568_2, m1567_6 +# 1568| r1568_4(glval) = FieldAddress[i] : r1568_3 +#-----| r0_1(int &) = CopyValue : r1568_4 +#-----| m0_2(int &) = Store[#return] : &:r1568_1, r0_1 +# 1567| v1567_9(void) = ReturnIndirection[#this] : &:r1567_7, m1567_8 +# 1567| r1567_10(glval) = VariableAddress[#return] : +# 1567| v1567_11(void) = ReturnValue : &:r1567_10, m0_2 +# 1567| v1567_12(void) = AliasedUse : m1567_3 +# 1567| v1567_13(void) = ExitFunction : + +# 1571| std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1571| Block 0 +# 1571| v1571_1(void) = EnterFunction : +# 1571| m1571_2(unknown) = AliasedDefinition : +# 1571| m1571_3(unknown) = InitializeNonLocal : +# 1571| m1571_4(unknown) = Chi : total:m1571_2, partial:m1571_3 +# 1571| r1571_5(glval) = VariableAddress[#this] : +# 1571| m1571_6(glval) = InitializeParameter[#this] : &:r1571_5 +# 1571| r1571_7(glval) = Load[#this] : &:r1571_5, m1571_6 +# 1571| m1571_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1571_7 +# 1572| r1572_1(glval) = VariableAddress[#return] : +# 1572| r1572_2(glval) = VariableAddress[#this] : +# 1572| r1572_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1572_2, m1571_6 +# 1572| r1572_4(glval) = FieldAddress[d] : r1572_3 +#-----| r0_1(double &) = CopyValue : r1572_4 +#-----| m0_2(double &) = Store[#return] : &:r1572_1, r0_1 +# 1571| v1571_9(void) = ReturnIndirection[#this] : &:r1571_7, m1571_8 +# 1571| r1571_10(glval) = VariableAddress[#return] : +# 1571| v1571_11(void) = ReturnValue : &:r1571_10, m0_2 +# 1571| v1571_12(void) = AliasedUse : m1571_3 +# 1571| v1571_13(void) = ExitFunction : + +# 1575| std::tuple_element::type StructuredBindingTupleRefGet::get() +# 1575| Block 0 +# 1575| v1575_1(void) = EnterFunction : +# 1575| m1575_2(unknown) = AliasedDefinition : +# 1575| m1575_3(unknown) = InitializeNonLocal : +# 1575| m1575_4(unknown) = Chi : total:m1575_2, partial:m1575_3 +# 1575| r1575_5(glval) = VariableAddress[#this] : +# 1575| m1575_6(glval) = InitializeParameter[#this] : &:r1575_5 +# 1575| r1575_7(glval) = Load[#this] : &:r1575_5, m1575_6 +# 1575| m1575_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1575_7 +# 1576| r1576_1(glval) = VariableAddress[#return] : +# 1576| r1576_2(glval) = VariableAddress[#this] : +# 1576| r1576_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1576_2, m1575_6 +# 1576| r1576_4(glval) = FieldAddress[r] : r1576_3 +# 1576| r1576_5(int &) = Load[?] : &:r1576_4, ~m1575_8 +# 1576| r1576_6(glval) = CopyValue : r1576_5 +# 1576| r1576_7(int &) = CopyValue : r1576_6 +# 1576| m1576_8(int &) = Store[#return] : &:r1576_1, r1576_7 +# 1575| v1575_9(void) = ReturnIndirection[#this] : &:r1575_7, m1575_8 +# 1575| r1575_10(glval) = VariableAddress[#return] : +# 1575| v1575_11(void) = ReturnValue : &:r1575_10, m1576_8 +# 1575| v1575_12(void) = AliasedUse : m1575_3 +# 1575| v1575_13(void) = ExitFunction : + +# 1579| void tuple_structured_binding_ref_get() +# 1579| Block 0 +# 1579| v1579_1(void) = EnterFunction : +# 1579| m1579_2(unknown) = AliasedDefinition : +# 1579| m1579_3(unknown) = InitializeNonLocal : +# 1579| m1579_4(unknown) = Chi : total:m1579_2, partial:m1579_3 +# 1580| r1580_1(glval) = VariableAddress[t] : +# 1580| m1580_2(StructuredBindingTupleRefGet) = Uninitialized[t] : &:r1580_1 +# 1580| r1580_3(glval) = FunctionAddress[StructuredBindingTupleRefGet] : +# 1580| v1580_4(void) = Call[StructuredBindingTupleRefGet] : func:r1580_3, this:r1580_1 +# 1580| m1580_5(unknown) = ^CallSideEffect : ~m1579_4 +# 1580| m1580_6(unknown) = Chi : total:m1579_4, partial:m1580_5 +# 1580| m1580_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1580_1 +# 1580| m1580_8(StructuredBindingTupleRefGet) = Chi : total:m1580_2, partial:m1580_7 +# 1583| r1583_1(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_2(glval) = VariableAddress[t] : +# 1583| r1583_3(StructuredBindingTupleRefGet) = Load[t] : &:r1583_2, m1580_8 +# 1583| m1583_4(StructuredBindingTupleRefGet) = Store[(unnamed local variable)] : &:r1583_1, r1583_3 +# 1583| r1583_5(glval) = VariableAddress[i] : +# 1583| r1583_6(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_7(glval) = FunctionAddress[get] : +# 1583| r1583_8(int &) = Call[get] : func:r1583_7, this:r1583_6 +# 1583| m1583_9(unknown) = ^CallSideEffect : ~m1580_6 +# 1583| m1583_10(unknown) = Chi : total:m1580_6, partial:m1583_9 +# 1583| v1583_11(void) = ^IndirectReadSideEffect[-1] : &:r1583_6, m1583_4 +# 1583| m1583_12(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_6 +# 1583| m1583_13(StructuredBindingTupleRefGet) = Chi : total:m1583_4, partial:m1583_12 +# 1583| r1583_14(glval) = CopyValue : r1583_8 +# 1583| r1583_15(int &) = CopyValue : r1583_14 +# 1583| m1583_16(int &) = Store[i] : &:r1583_5, r1583_15 +# 1583| r1583_17(glval) = VariableAddress[d] : +# 1583| r1583_18(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_19(glval) = FunctionAddress[get] : +# 1583| r1583_20(double &) = Call[get] : func:r1583_19, this:r1583_18 +# 1583| m1583_21(unknown) = ^CallSideEffect : ~m1583_10 +# 1583| m1583_22(unknown) = Chi : total:m1583_10, partial:m1583_21 +# 1583| v1583_23(void) = ^IndirectReadSideEffect[-1] : &:r1583_18, m1583_13 +# 1583| m1583_24(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_18 +# 1583| m1583_25(StructuredBindingTupleRefGet) = Chi : total:m1583_13, partial:m1583_24 +# 1583| r1583_26(glval) = CopyValue : r1583_20 +# 1583| r1583_27(double &) = CopyValue : r1583_26 +# 1583| m1583_28(double &) = Store[d] : &:r1583_17, r1583_27 +# 1583| r1583_29(glval) = VariableAddress[r] : +# 1583| r1583_30(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_31(glval) = FunctionAddress[get] : +# 1583| r1583_32(int &) = Call[get] : func:r1583_31, this:r1583_30 +# 1583| m1583_33(unknown) = ^CallSideEffect : ~m1583_22 +# 1583| m1583_34(unknown) = Chi : total:m1583_22, partial:m1583_33 +# 1583| v1583_35(void) = ^IndirectReadSideEffect[-1] : &:r1583_30, m1583_25 +# 1583| m1583_36(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_30 +# 1583| m1583_37(StructuredBindingTupleRefGet) = Chi : total:m1583_25, partial:m1583_36 +# 1583| r1583_38(glval) = CopyValue : r1583_32 +# 1583| r1583_39(int &) = CopyValue : r1583_38 +# 1583| m1583_40(int &) = Store[r] : &:r1583_29, r1583_39 +# 1584| r1584_1(double) = Constant[4.0] : +# 1584| r1584_2(glval) = VariableAddress[d] : +# 1584| r1584_3(double &) = Load[d] : &:r1584_2, m1583_28 +# 1584| r1584_4(glval) = CopyValue : r1584_3 +# 1584| m1584_5(double) = Store[?] : &:r1584_4, r1584_1 +# 1584| m1584_6(StructuredBindingTupleRefGet) = Chi : total:m1583_37, partial:m1584_5 +# 1585| r1585_1(glval) = VariableAddress[rd] : +# 1585| r1585_2(glval) = VariableAddress[d] : +# 1585| r1585_3(double &) = Load[d] : &:r1585_2, m1583_28 +# 1585| r1585_4(glval) = CopyValue : r1585_3 +# 1585| r1585_5(double &) = CopyValue : r1585_4 +# 1585| m1585_6(double &) = Store[rd] : &:r1585_1, r1585_5 +# 1586| r1586_1(glval) = VariableAddress[v] : +# 1586| r1586_2(glval) = VariableAddress[i] : +# 1586| r1586_3(int &) = Load[i] : &:r1586_2, m1583_16 +# 1586| r1586_4(int) = Load[?] : &:r1586_3, ~m1583_37 +# 1586| m1586_5(int) = Store[v] : &:r1586_1, r1586_4 +# 1587| r1587_1(int) = Constant[5] : +# 1587| r1587_2(glval) = VariableAddress[r] : +# 1587| r1587_3(int &) = Load[r] : &:r1587_2, m1583_40 +# 1587| r1587_4(glval) = CopyValue : r1587_3 +# 1587| m1587_5(int) = Store[?] : &:r1587_4, r1587_1 +# 1587| m1587_6(unknown) = Chi : total:m1583_34, partial:m1587_5 +# 1588| r1588_1(glval) = VariableAddress[rr] : +# 1588| r1588_2(glval) = VariableAddress[r] : +# 1588| r1588_3(int &) = Load[r] : &:r1588_2, m1583_40 +# 1588| r1588_4(glval) = CopyValue : r1588_3 +# 1588| r1588_5(int &) = CopyValue : r1588_4 +# 1588| m1588_6(int &) = Store[rr] : &:r1588_1, r1588_5 +# 1589| r1589_1(glval) = VariableAddress[w] : +# 1589| r1589_2(glval) = VariableAddress[r] : +# 1589| r1589_3(int &) = Load[r] : &:r1589_2, m1583_40 +# 1589| r1589_4(int) = Load[?] : &:r1589_3, ~m1587_6 +# 1589| m1589_5(int) = Store[w] : &:r1589_1, r1589_4 +# 1593| r1593_1(glval) = VariableAddress[unnamed_local_variable] : +# 1593| r1593_2(glval) = VariableAddress[t] : +# 1593| r1593_3(StructuredBindingTupleRefGet) = Load[t] : &:r1593_2, m1580_8 +# 1593| m1593_4(StructuredBindingTupleRefGet) = Store[unnamed_local_variable] : &:r1593_1, r1593_3 +# 1594| r1594_1(glval) = VariableAddress[i] : +# 1594| r1594_2(glval) = VariableAddress[unnamed_local_variable] : +# 1594| r1594_3(glval) = FunctionAddress[get] : +# 1594| r1594_4(int &) = Call[get] : func:r1594_3, this:r1594_2 +# 1594| m1594_5(unknown) = ^CallSideEffect : ~m1587_6 +# 1594| m1594_6(unknown) = Chi : total:m1587_6, partial:m1594_5 +# 1594| v1594_7(void) = ^IndirectReadSideEffect[-1] : &:r1594_2, m1593_4 +# 1594| m1594_8(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1594_2 +# 1594| m1594_9(StructuredBindingTupleRefGet) = Chi : total:m1593_4, partial:m1594_8 +# 1594| r1594_10(glval) = CopyValue : r1594_4 +# 1594| r1594_11(int &) = CopyValue : r1594_10 +# 1594| m1594_12(int &) = Store[i] : &:r1594_1, r1594_11 +# 1595| r1595_1(glval) = VariableAddress[d] : +# 1595| r1595_2(glval) = VariableAddress[unnamed_local_variable] : +# 1595| r1595_3(glval) = FunctionAddress[get] : +# 1595| r1595_4(double &) = Call[get] : func:r1595_3, this:r1595_2 +# 1595| m1595_5(unknown) = ^CallSideEffect : ~m1594_6 +# 1595| m1595_6(unknown) = Chi : total:m1594_6, partial:m1595_5 +# 1595| v1595_7(void) = ^IndirectReadSideEffect[-1] : &:r1595_2, m1594_9 +# 1595| m1595_8(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1595_2 +# 1595| m1595_9(StructuredBindingTupleRefGet) = Chi : total:m1594_9, partial:m1595_8 +# 1595| r1595_10(glval) = CopyValue : r1595_4 +# 1595| r1595_11(double &) = CopyValue : r1595_10 +# 1595| m1595_12(double &) = Store[d] : &:r1595_1, r1595_11 +# 1596| r1596_1(glval) = VariableAddress[r] : +# 1596| r1596_2(glval) = VariableAddress[unnamed_local_variable] : +# 1596| r1596_3(glval) = FunctionAddress[get] : +# 1596| r1596_4(int &) = Call[get] : func:r1596_3, this:r1596_2 +# 1596| m1596_5(unknown) = ^CallSideEffect : ~m1595_6 +# 1596| m1596_6(unknown) = Chi : total:m1595_6, partial:m1596_5 +# 1596| v1596_7(void) = ^IndirectReadSideEffect[-1] : &:r1596_2, m1595_9 +# 1596| m1596_8(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1596_2 +# 1596| m1596_9(StructuredBindingTupleRefGet) = Chi : total:m1595_9, partial:m1596_8 +# 1596| r1596_10(glval) = CopyValue : r1596_4 +# 1596| r1596_11(int &) = CopyValue : r1596_10 +# 1596| m1596_12(int &) = Store[r] : &:r1596_1, r1596_11 +# 1597| r1597_1(double) = Constant[4.0] : +# 1597| r1597_2(glval) = VariableAddress[d] : +# 1597| r1597_3(double &) = Load[d] : &:r1597_2, m1595_12 +# 1597| r1597_4(glval) = CopyValue : r1597_3 +# 1597| m1597_5(double) = Store[?] : &:r1597_4, r1597_1 +# 1597| m1597_6(StructuredBindingTupleRefGet) = Chi : total:m1596_9, partial:m1597_5 +# 1598| r1598_1(glval) = VariableAddress[rd] : +# 1598| r1598_2(glval) = VariableAddress[d] : +# 1598| r1598_3(double &) = Load[d] : &:r1598_2, m1595_12 +# 1598| r1598_4(glval) = CopyValue : r1598_3 +# 1598| r1598_5(double &) = CopyValue : r1598_4 +# 1598| m1598_6(double &) = Store[rd] : &:r1598_1, r1598_5 +# 1599| r1599_1(glval) = VariableAddress[v] : +# 1599| r1599_2(glval) = VariableAddress[i] : +# 1599| r1599_3(int &) = Load[i] : &:r1599_2, m1594_12 +# 1599| r1599_4(int) = Load[?] : &:r1599_3, ~m1596_9 +# 1599| m1599_5(int) = Store[v] : &:r1599_1, r1599_4 +# 1600| r1600_1(int) = Constant[5] : +# 1600| r1600_2(glval) = VariableAddress[r] : +# 1600| r1600_3(int &) = Load[r] : &:r1600_2, m1596_12 +# 1600| r1600_4(glval) = CopyValue : r1600_3 +# 1600| m1600_5(int) = Store[?] : &:r1600_4, r1600_1 +# 1600| m1600_6(unknown) = Chi : total:m1596_6, partial:m1600_5 +# 1601| r1601_1(glval) = VariableAddress[rr] : +# 1601| r1601_2(glval) = VariableAddress[r] : +# 1601| r1601_3(int &) = Load[r] : &:r1601_2, m1596_12 +# 1601| r1601_4(glval) = CopyValue : r1601_3 +# 1601| r1601_5(int &) = CopyValue : r1601_4 +# 1601| m1601_6(int &) = Store[rr] : &:r1601_1, r1601_5 +# 1602| r1602_1(glval) = VariableAddress[w] : +# 1602| r1602_2(glval) = VariableAddress[r] : +# 1602| r1602_3(int &) = Load[r] : &:r1602_2, m1596_12 +# 1602| r1602_4(int) = Load[?] : &:r1602_3, ~m1600_6 +# 1602| m1602_5(int) = Store[w] : &:r1602_1, r1602_4 +# 1604| v1604_1(void) = NoOp : +# 1579| v1579_5(void) = ReturnVoid : +# 1579| v1579_6(void) = AliasedUse : ~m1600_6 +# 1579| v1579_7(void) = ExitFunction : + +# 1606| void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() +# 1606| Block 0 +# 1606| v1606_1(void) = EnterFunction : +# 1606| m1606_2(unknown) = AliasedDefinition : +# 1606| m1606_3(unknown) = InitializeNonLocal : +# 1606| m1606_4(unknown) = Chi : total:m1606_2, partial:m1606_3 +# 1606| r1606_5(glval) = VariableAddress[#this] : +# 1606| m1606_6(glval) = InitializeParameter[#this] : &:r1606_5 +# 1606| r1606_7(glval) = Load[#this] : &:r1606_5, m1606_6 +# 1606| m1606_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1606_7 +# 1606| v1606_9(void) = NoOp : +# 1606| v1606_10(void) = ReturnIndirection[#this] : &:r1606_7, m1606_8 +# 1606| v1606_11(void) = ReturnVoid : +# 1606| v1606_12(void) = AliasedUse : m1606_3 +# 1606| v1606_13(void) = ExitFunction : + +# 1633| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1633| Block 0 +# 1633| v1633_1(void) = EnterFunction : +# 1633| m1633_2(unknown) = AliasedDefinition : +# 1633| m1633_3(unknown) = InitializeNonLocal : +# 1633| m1633_4(unknown) = Chi : total:m1633_2, partial:m1633_3 +# 1633| r1633_5(glval) = VariableAddress[#this] : +# 1633| m1633_6(glval) = InitializeParameter[#this] : &:r1633_5 +# 1633| r1633_7(glval) = Load[#this] : &:r1633_5, m1633_6 +# 1633| m1633_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1633_7 +# 1634| r1634_1(glval) = VariableAddress[#return] : +# 1634| r1634_2(glval) = VariableAddress[#this] : +# 1634| r1634_3(StructuredBindingTupleNoRefGet *) = Load[#this] : &:r1634_2, m1633_6 +# 1634| r1634_4(glval) = FieldAddress[i] : r1634_3 +# 1634| r1634_5(int) = Load[?] : &:r1634_4, ~m1633_8 +# 1634| m1634_6(int) = Store[#return] : &:r1634_1, r1634_5 +# 1633| v1633_9(void) = ReturnIndirection[#this] : &:r1633_7, m1633_8 +# 1633| r1633_10(glval) = VariableAddress[#return] : +# 1633| v1633_11(void) = ReturnValue : &:r1633_10, m1634_6 +# 1633| v1633_12(void) = AliasedUse : m1633_3 +# 1633| v1633_13(void) = ExitFunction : + +# 1637| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1637| Block 0 +# 1637| v1637_1(void) = EnterFunction : +# 1637| m1637_2(unknown) = AliasedDefinition : +# 1637| m1637_3(unknown) = InitializeNonLocal : +# 1637| m1637_4(unknown) = Chi : total:m1637_2, partial:m1637_3 +# 1637| r1637_5(glval) = VariableAddress[#this] : +# 1637| m1637_6(glval) = InitializeParameter[#this] : &:r1637_5 +# 1637| r1637_7(glval) = Load[#this] : &:r1637_5, m1637_6 +# 1637| m1637_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1637_7 +# 1638| r1638_1(glval) = VariableAddress[#return] : +# 1638| r1638_2(glval) = VariableAddress[#this] : +# 1638| r1638_3(StructuredBindingTupleNoRefGet *) = Load[#this] : &:r1638_2, m1637_6 +# 1638| r1638_4(glval) = FieldAddress[r] : r1638_3 +# 1638| r1638_5(int &) = Load[?] : &:r1638_4, ~m1637_8 +# 1638| r1638_6(glval) = CopyValue : r1638_5 +# 1638| r1638_7(int &) = CopyValue : r1638_6 +# 1638| m1638_8(int &) = Store[#return] : &:r1638_1, r1638_7 +# 1637| v1637_9(void) = ReturnIndirection[#this] : &:r1637_7, m1637_8 +# 1637| r1637_10(glval) = VariableAddress[#return] : +# 1637| v1637_11(void) = ReturnValue : &:r1637_10, m1638_8 +# 1637| v1637_12(void) = AliasedUse : m1637_3 +# 1637| v1637_13(void) = ExitFunction : + +# 1641| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1641| Block 0 +# 1641| v1641_1(void) = EnterFunction : +# 1641| m1641_2(unknown) = AliasedDefinition : +# 1641| m1641_3(unknown) = InitializeNonLocal : +# 1641| m1641_4(unknown) = Chi : total:m1641_2, partial:m1641_3 +# 1641| r1641_5(glval) = VariableAddress[#this] : +# 1641| m1641_6(glval) = InitializeParameter[#this] : &:r1641_5 +# 1641| r1641_7(glval) = Load[#this] : &:r1641_5, m1641_6 +# 1641| m1641_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1641_7 +# 1642| r1642_1(glval) = VariableAddress[#return] : +# 1642| r1642_2(glval) = VariableAddress[#temp1642:12] : +# 1642| r1642_3(int) = Constant[5] : +# 1642| m1642_4(int) = Store[#temp1642:12] : &:r1642_2, r1642_3 +# 1642| r1642_5(int &) = CopyValue : r1642_2 +# 1642| m1642_6(int &&) = Store[#return] : &:r1642_1, r1642_5 +# 1641| v1641_9(void) = ReturnIndirection[#this] : &:r1641_7, m1641_8 +# 1641| r1641_10(glval) = VariableAddress[#return] : +# 1641| v1641_11(void) = ReturnValue : &:r1641_10, m1642_6 +# 1641| v1641_12(void) = AliasedUse : m1641_3 +# 1641| v1641_13(void) = ExitFunction : + +# 1645| void tuple_structured_binding_no_ref_get() +# 1645| Block 0 +# 1645| v1645_1(void) = EnterFunction : +# 1645| m1645_2(unknown) = AliasedDefinition : +# 1645| m1645_3(unknown) = InitializeNonLocal : +# 1645| m1645_4(unknown) = Chi : total:m1645_2, partial:m1645_3 +# 1646| r1646_1(glval) = VariableAddress[t] : +# 1646| m1646_2(StructuredBindingTupleNoRefGet) = Uninitialized[t] : &:r1646_1 +# 1646| r1646_3(glval) = FunctionAddress[StructuredBindingTupleNoRefGet] : +# 1646| v1646_4(void) = Call[StructuredBindingTupleNoRefGet] : func:r1646_3, this:r1646_1 +# 1646| m1646_5(unknown) = ^CallSideEffect : ~m1645_4 +# 1646| m1646_6(unknown) = Chi : total:m1645_4, partial:m1646_5 +# 1646| m1646_7(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1646_1 +# 1646| m1646_8(StructuredBindingTupleNoRefGet) = Chi : total:m1646_2, partial:m1646_7 +# 1649| r1649_1(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_2(glval) = VariableAddress[t] : +# 1649| r1649_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1649_2 +# 1649| m1649_4(StructuredBindingTupleNoRefGet &) = Store[(unnamed local variable)] : &:r1649_1, r1649_3 +# 1649| r1649_5(glval) = VariableAddress[i] : +# 1649| r1649_6(glval) = VariableAddress[#temp1649:16] : +# 1649| r1649_7(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_8(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_7, m1649_4 +# 1649| r1649_9(glval) = CopyValue : r1649_8 +# 1649| r1649_10(glval) = FunctionAddress[get] : +# 1649| r1649_11(int) = Call[get] : func:r1649_10, this:r1649_9 +# 1649| m1649_12(unknown) = ^CallSideEffect : ~m1646_6 +# 1649| m1649_13(unknown) = Chi : total:m1646_6, partial:m1649_12 +# 1649| v1649_14(void) = ^IndirectReadSideEffect[-1] : &:r1649_9, m1646_8 +# 1649| m1649_15(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_9 +# 1649| m1649_16(StructuredBindingTupleNoRefGet) = Chi : total:m1646_8, partial:m1649_15 +# 1649| m1649_17(int) = Store[#temp1649:16] : &:r1649_6, r1649_11 +# 1649| r1649_18(int &) = CopyValue : r1649_6 +# 1649| m1649_19(int &&) = Store[i] : &:r1649_5, r1649_18 +# 1649| r1649_20(glval) = VariableAddress[r] : +# 1649| r1649_21(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_22(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_21, m1649_4 +# 1649| r1649_23(glval) = CopyValue : r1649_22 +# 1649| r1649_24(glval) = FunctionAddress[get] : +# 1649| r1649_25(int &) = Call[get] : func:r1649_24, this:r1649_23 +# 1649| m1649_26(unknown) = ^CallSideEffect : ~m1649_13 +# 1649| m1649_27(unknown) = Chi : total:m1649_13, partial:m1649_26 +# 1649| v1649_28(void) = ^IndirectReadSideEffect[-1] : &:r1649_23, m1649_16 +# 1649| m1649_29(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_23 +# 1649| m1649_30(StructuredBindingTupleNoRefGet) = Chi : total:m1649_16, partial:m1649_29 +# 1649| r1649_31(glval) = CopyValue : r1649_25 +# 1649| r1649_32(int &) = CopyValue : r1649_31 +# 1649| m1649_33(int &) = Store[r] : &:r1649_20, r1649_32 +# 1649| r1649_34(glval) = VariableAddress[rv] : +# 1649| r1649_35(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_36(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_35, m1649_4 +# 1649| r1649_37(glval) = CopyValue : r1649_36 +# 1649| r1649_38(glval) = FunctionAddress[get] : +# 1649| r1649_39(int &&) = Call[get] : func:r1649_38, this:r1649_37 +# 1649| m1649_40(unknown) = ^CallSideEffect : ~m1649_27 +# 1649| m1649_41(unknown) = Chi : total:m1649_27, partial:m1649_40 +# 1649| v1649_42(void) = ^IndirectReadSideEffect[-1] : &:r1649_37, m1649_30 +# 1649| m1649_43(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_37 +# 1649| m1649_44(StructuredBindingTupleNoRefGet) = Chi : total:m1649_30, partial:m1649_43 +# 1649| r1649_45(glval) = CopyValue : r1649_39 +# 1649| r1649_46(int &) = CopyValue : r1649_45 +# 1649| m1649_47(int &&) = Store[rv] : &:r1649_34, r1649_46 +# 1650| r1650_1(int) = Constant[4] : +# 1650| r1650_2(glval) = VariableAddress[i] : +# 1650| r1650_3(int &&) = Load[i] : &:r1650_2, m1649_19 +# 1650| r1650_4(glval) = CopyValue : r1650_3 +# 1650| m1650_5(int) = Store[?] : &:r1650_4, r1650_1 +# 1651| r1651_1(glval) = VariableAddress[ri] : +# 1651| r1651_2(glval) = VariableAddress[i] : +# 1651| r1651_3(int &&) = Load[i] : &:r1651_2, m1649_19 +# 1651| r1651_4(glval) = CopyValue : r1651_3 +# 1651| r1651_5(int &) = CopyValue : r1651_4 +# 1651| m1651_6(int &) = Store[ri] : &:r1651_1, r1651_5 +# 1652| r1652_1(glval) = VariableAddress[v] : +# 1652| r1652_2(glval) = VariableAddress[i] : +# 1652| r1652_3(int &&) = Load[i] : &:r1652_2, m1649_19 +# 1652| r1652_4(int) = Load[?] : &:r1652_3, m1650_5 +# 1652| m1652_5(int) = Store[v] : &:r1652_1, r1652_4 +# 1653| r1653_1(int) = Constant[5] : +# 1653| r1653_2(glval) = VariableAddress[r] : +# 1653| r1653_3(int &) = Load[r] : &:r1653_2, m1649_33 +# 1653| r1653_4(glval) = CopyValue : r1653_3 +# 1653| m1653_5(int) = Store[?] : &:r1653_4, r1653_1 +# 1653| m1653_6(unknown) = Chi : total:m1649_41, partial:m1653_5 +# 1654| r1654_1(glval) = VariableAddress[rr] : +# 1654| r1654_2(glval) = VariableAddress[r] : +# 1654| r1654_3(int &) = Load[r] : &:r1654_2, m1649_33 +# 1654| r1654_4(glval) = CopyValue : r1654_3 +# 1654| r1654_5(int &) = CopyValue : r1654_4 +# 1654| m1654_6(int &) = Store[rr] : &:r1654_1, r1654_5 +# 1655| r1655_1(glval) = VariableAddress[w] : +# 1655| r1655_2(glval) = VariableAddress[r] : +# 1655| r1655_3(int &) = Load[r] : &:r1655_2, m1649_33 +# 1655| r1655_4(int) = Load[?] : &:r1655_3, ~m1653_6 +# 1655| m1655_5(int) = Store[w] : &:r1655_1, r1655_4 +# 1659| r1659_1(glval) = VariableAddress[unnamed_local_variable] : +# 1659| r1659_2(glval) = VariableAddress[t] : +# 1659| r1659_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1659_2 +# 1659| m1659_4(StructuredBindingTupleNoRefGet &) = Store[unnamed_local_variable] : &:r1659_1, r1659_3 +# 1660| r1660_1(glval) = VariableAddress[i] : +# 1660| r1660_2(glval) = VariableAddress[#temp1660:20] : +# 1660| r1660_3(glval) = VariableAddress[unnamed_local_variable] : +# 1660| r1660_4(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1660_3, m1659_4 +# 1660| r1660_5(glval) = CopyValue : r1660_4 +# 1660| r1660_6(glval) = FunctionAddress[get] : +# 1660| r1660_7(int) = Call[get] : func:r1660_6, this:r1660_5 +# 1660| m1660_8(unknown) = ^CallSideEffect : ~m1653_6 +# 1660| m1660_9(unknown) = Chi : total:m1653_6, partial:m1660_8 +# 1660| v1660_10(void) = ^IndirectReadSideEffect[-1] : &:r1660_5, m1649_44 +# 1660| m1660_11(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1660_5 +# 1660| m1660_12(StructuredBindingTupleNoRefGet) = Chi : total:m1649_44, partial:m1660_11 +# 1660| m1660_13(int) = Store[#temp1660:20] : &:r1660_2, r1660_7 +# 1660| r1660_14(int &) = CopyValue : r1660_2 +# 1660| m1660_15(int &&) = Store[i] : &:r1660_1, r1660_14 +# 1661| r1661_1(glval) = VariableAddress[r] : +# 1661| r1661_2(glval) = VariableAddress[unnamed_local_variable] : +# 1661| r1661_3(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1661_2, m1659_4 +# 1661| r1661_4(glval) = CopyValue : r1661_3 +# 1661| r1661_5(glval) = FunctionAddress[get] : +# 1661| r1661_6(int &) = Call[get] : func:r1661_5, this:r1661_4 +# 1661| m1661_7(unknown) = ^CallSideEffect : ~m1660_9 +# 1661| m1661_8(unknown) = Chi : total:m1660_9, partial:m1661_7 +# 1661| v1661_9(void) = ^IndirectReadSideEffect[-1] : &:r1661_4, m1660_12 +# 1661| m1661_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1661_4 +# 1661| m1661_11(StructuredBindingTupleNoRefGet) = Chi : total:m1660_12, partial:m1661_10 +# 1661| r1661_12(glval) = CopyValue : r1661_6 +# 1661| r1661_13(int &) = CopyValue : r1661_12 +# 1661| m1661_14(int &) = Store[r] : &:r1661_1, r1661_13 +# 1662| r1662_1(glval) = VariableAddress[rv] : +# 1662| r1662_2(glval) = VariableAddress[unnamed_local_variable] : +# 1662| r1662_3(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1662_2, m1659_4 +# 1662| r1662_4(glval) = CopyValue : r1662_3 +# 1662| r1662_5(glval) = FunctionAddress[get] : +# 1662| r1662_6(int &&) = Call[get] : func:r1662_5, this:r1662_4 +# 1662| m1662_7(unknown) = ^CallSideEffect : ~m1661_8 +# 1662| m1662_8(unknown) = Chi : total:m1661_8, partial:m1662_7 +# 1662| v1662_9(void) = ^IndirectReadSideEffect[-1] : &:r1662_4, m1661_11 +# 1662| m1662_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1662_4 +# 1662| m1662_11(StructuredBindingTupleNoRefGet) = Chi : total:m1661_11, partial:m1662_10 +# 1662| r1662_12(glval) = CopyValue : r1662_6 +# 1662| r1662_13(int &) = CopyValue : r1662_12 +# 1662| m1662_14(int &&) = Store[rv] : &:r1662_1, r1662_13 +# 1663| r1663_1(int) = Constant[4] : +# 1663| r1663_2(glval) = VariableAddress[i] : +# 1663| r1663_3(int &&) = Load[i] : &:r1663_2, m1660_15 +# 1663| r1663_4(glval) = CopyValue : r1663_3 +# 1663| m1663_5(int) = Store[?] : &:r1663_4, r1663_1 +# 1664| r1664_1(glval) = VariableAddress[ri] : +# 1664| r1664_2(glval) = VariableAddress[i] : +# 1664| r1664_3(int &&) = Load[i] : &:r1664_2, m1660_15 +# 1664| r1664_4(glval) = CopyValue : r1664_3 +# 1664| r1664_5(int &) = CopyValue : r1664_4 +# 1664| m1664_6(int &) = Store[ri] : &:r1664_1, r1664_5 +# 1665| r1665_1(glval) = VariableAddress[v] : +# 1665| r1665_2(glval) = VariableAddress[i] : +# 1665| r1665_3(int &&) = Load[i] : &:r1665_2, m1660_15 +# 1665| r1665_4(int) = Load[?] : &:r1665_3, m1663_5 +# 1665| m1665_5(int) = Store[v] : &:r1665_1, r1665_4 +# 1666| r1666_1(int) = Constant[5] : +# 1666| r1666_2(glval) = VariableAddress[r] : +# 1666| r1666_3(int &) = Load[r] : &:r1666_2, m1661_14 +# 1666| r1666_4(glval) = CopyValue : r1666_3 +# 1666| m1666_5(int) = Store[?] : &:r1666_4, r1666_1 +# 1666| m1666_6(unknown) = Chi : total:m1662_8, partial:m1666_5 +# 1667| r1667_1(glval) = VariableAddress[rr] : +# 1667| r1667_2(glval) = VariableAddress[r] : +# 1667| r1667_3(int &) = Load[r] : &:r1667_2, m1661_14 +# 1667| r1667_4(glval) = CopyValue : r1667_3 +# 1667| r1667_5(int &) = CopyValue : r1667_4 +# 1667| m1667_6(int &) = Store[rr] : &:r1667_1, r1667_5 +# 1668| r1668_1(glval) = VariableAddress[w] : +# 1668| r1668_2(glval) = VariableAddress[r] : +# 1668| r1668_3(int &) = Load[r] : &:r1668_2, m1661_14 +# 1668| r1668_4(int) = Load[?] : &:r1668_3, ~m1666_6 +# 1668| m1668_5(int) = Store[w] : &:r1668_1, r1668_4 +# 1670| v1670_1(void) = NoOp : +# 1645| v1645_5(void) = ReturnVoid : +# 1645| v1645_6(void) = AliasedUse : ~m1666_6 +# 1645| v1645_7(void) = ExitFunction : + +# 1672| void array_structured_binding_non_ref_init() +# 1672| Block 0 +# 1672| v1672_1(void) = EnterFunction : +# 1672| m1672_2(unknown) = AliasedDefinition : +# 1672| m1672_3(unknown) = InitializeNonLocal : +# 1672| m1672_4(unknown) = Chi : total:m1672_2, partial:m1672_3 +# 1673| r1673_1(glval) = VariableAddress[xs] : +# 1673| m1673_2(int[2]) = Uninitialized[xs] : &:r1673_1 +# 1673| r1673_3(int) = Constant[0] : +# 1673| r1673_4(glval) = PointerAdd[4] : r1673_1, r1673_3 +# 1673| r1673_5(int) = Constant[1] : +# 1673| m1673_6(int) = Store[?] : &:r1673_4, r1673_5 +# 1673| m1673_7(int[2]) = Chi : total:m1673_2, partial:m1673_6 +# 1673| r1673_8(int) = Constant[1] : +# 1673| r1673_9(glval) = PointerAdd[4] : r1673_1, r1673_8 +# 1673| r1673_10(int) = Constant[2] : +# 1673| m1673_11(int) = Store[?] : &:r1673_9, r1673_10 +# 1673| m1673_12(int[2]) = Chi : total:m1673_7, partial:m1673_11 +# 1674| r1674_1(glval) = VariableAddress[(unnamed local variable)] : +# 1674| r1674_2(glval) = VariableAddress[xs] : +# 1674| r1674_3(int[2]) = Load[xs] : &:r1674_2, m1673_12 +# 1674| m1674_4(int[2]) = Store[(unnamed local variable)] : &:r1674_1, r1674_3 +# 1674| r1674_5(glval) = VariableAddress[x0] : +#-----| r0_1(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_2(int *) = Convert : r0_1 +#-----| r0_3(unsigned long) = Constant[0] : +#-----| r0_4(glval) = PointerAdd[4] : r0_2, r0_3 +#-----| m0_5(int &) = Store[x0] : &:r1674_5, r0_4 +# 1674| r1674_6(glval) = VariableAddress[x1] : +#-----| r0_6(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_7(int *) = Convert : r0_6 +#-----| r0_8(unsigned long) = Constant[1] : +#-----| r0_9(glval) = PointerAdd[4] : r0_7, r0_8 +#-----| m0_10(int &) = Store[x1] : &:r1674_6, r0_9 +# 1675| v1675_1(void) = NoOp : +# 1672| v1672_5(void) = ReturnVoid : +# 1672| v1672_6(void) = AliasedUse : m1672_3 +# 1672| v1672_7(void) = ExitFunction : + +# 1680| void CapturedLambdaMyObj::CapturedLambdaMyObj() +# 1680| Block 0 +# 1680| v1680_1(void) = EnterFunction : +# 1680| m1680_2(unknown) = AliasedDefinition : +# 1680| m1680_3(unknown) = InitializeNonLocal : +# 1680| m1680_4(unknown) = Chi : total:m1680_2, partial:m1680_3 +# 1680| r1680_5(glval) = VariableAddress[#this] : +# 1680| m1680_6(glval) = InitializeParameter[#this] : &:r1680_5 +# 1680| r1680_7(glval) = Load[#this] : &:r1680_5, m1680_6 +# 1680| m1680_8(CapturedLambdaMyObj) = InitializeIndirection[#this] : &:r1680_7 +# 1680| v1680_9(void) = NoOp : +# 1680| v1680_10(void) = ReturnIndirection[#this] : &:r1680_7, m1680_8 +# 1680| v1680_11(void) = ReturnVoid : +# 1680| v1680_12(void) = AliasedUse : m1680_3 +# 1680| v1680_13(void) = ExitFunction : + +# 1683| void captured_lambda(int, int&, int&&) +# 1683| Block 0 +# 1683| v1683_1(void) = EnterFunction : +# 1683| m1683_2(unknown) = AliasedDefinition : +# 1683| m1683_3(unknown) = InitializeNonLocal : +# 1683| m1683_4(unknown) = Chi : total:m1683_2, partial:m1683_3 +# 1683| r1683_5(glval) = VariableAddress[x] : +# 1683| m1683_6(int) = InitializeParameter[x] : &:r1683_5 +# 1683| r1683_7(glval) = VariableAddress[y] : +# 1683| m1683_8(int &) = InitializeParameter[y] : &:r1683_7 +# 1683| r1683_9(int &) = Load[y] : &:r1683_7, m1683_8 +# 1683| m1683_10(unknown) = InitializeIndirection[y] : &:r1683_9 +# 1683| r1683_11(glval) = VariableAddress[z] : +# 1683| m1683_12(int &&) = InitializeParameter[z] : &:r1683_11 +# 1683| r1683_13(int &&) = Load[z] : &:r1683_11, m1683_12 +# 1683| m1683_14(unknown) = InitializeIndirection[z] : &:r1683_13 +# 1685| r1685_1(glval) = VariableAddress[obj1] : +# 1685| r1685_2(glval) = VariableAddress[#temp1685:24] : +# 1685| m1685_3(CapturedLambdaMyObj) = Uninitialized[#temp1685:24] : &:r1685_2 +# 1685| r1685_4(glval) = FunctionAddress[CapturedLambdaMyObj] : +# 1685| v1685_5(void) = Call[CapturedLambdaMyObj] : func:r1685_4, this:r1685_2 +# 1685| m1685_6(unknown) = ^CallSideEffect : ~m1683_4 +# 1685| m1685_7(unknown) = Chi : total:m1683_4, partial:m1685_6 +# 1685| m1685_8(CapturedLambdaMyObj) = ^IndirectMayWriteSideEffect[-1] : &:r1685_2 +# 1685| m1685_9(CapturedLambdaMyObj) = Chi : total:m1685_3, partial:m1685_8 +# 1685| r1685_10(glval) = Convert : r1685_2 +# 1685| r1685_11(CapturedLambdaMyObj &) = CopyValue : r1685_10 +# 1685| m1685_12(CapturedLambdaMyObj &) = Store[obj1] : &:r1685_1, r1685_11 +# 1686| r1686_1(glval) = VariableAddress[obj2] : +# 1686| m1686_2(CapturedLambdaMyObj) = Uninitialized[obj2] : &:r1686_1 +# 1686| r1686_3(glval) = FunctionAddress[CapturedLambdaMyObj] : +# 1686| v1686_4(void) = Call[CapturedLambdaMyObj] : func:r1686_3, this:r1686_1 +# 1686| m1686_5(unknown) = ^CallSideEffect : ~m1685_7 +# 1686| m1686_6(unknown) = Chi : total:m1685_7, partial:m1686_5 +# 1686| m1686_7(CapturedLambdaMyObj) = ^IndirectMayWriteSideEffect[-1] : &:r1686_1 +# 1686| m1686_8(CapturedLambdaMyObj) = Chi : total:m1686_2, partial:m1686_7 +# 1688| r1688_1(glval) = VariableAddress[lambda_outer] : +# 1688| r1688_2(glval) = VariableAddress[#temp1688:24] : +# 1688| m1688_3(decltype([...](...){...})) = Uninitialized[#temp1688:24] : &:r1688_2 +# 1688| r1688_4(glval) = FieldAddress[obj1] : r1688_2 +# 1688| r1688_5(glval) = VariableAddress[obj1] : +# 1688| r1688_6(CapturedLambdaMyObj &) = Load[obj1] : &:r1688_5, m1685_12 +#-----| r0_1(CapturedLambdaMyObj) = Load[?] : &:r1688_6, m1685_9 +#-----| m0_2(CapturedLambdaMyObj) = Store[?] : &:r1688_4, r0_1 +#-----| m0_3(decltype([...](...){...})) = Chi : total:m1688_3, partial:m0_2 +# 1688| r1688_7(glval) = FieldAddress[obj2] : r1688_2 +# 1688| r1688_8(glval) = VariableAddress[obj2] : +# 1688| r1688_9(CapturedLambdaMyObj) = Load[obj2] : &:r1688_8, m1686_8 +# 1688| m1688_10(CapturedLambdaMyObj) = Store[?] : &:r1688_7, r1688_9 +# 1688| m1688_11(decltype([...](...){...})) = Chi : total:m0_3, partial:m1688_10 +# 1688| r1688_12(glval) = FieldAddress[x] : r1688_2 +# 1688| r1688_13(glval) = VariableAddress[x] : +# 1688| r1688_14(int) = Load[x] : &:r1688_13, m1683_6 +# 1688| m1688_15(int) = Store[?] : &:r1688_12, r1688_14 +# 1688| m1688_16(decltype([...](...){...})) = Chi : total:m1688_11, partial:m1688_15 +# 1688| r1688_17(glval) = FieldAddress[y] : r1688_2 +# 1688| r1688_18(glval) = VariableAddress[y] : +# 1688| r1688_19(int &) = Load[y] : &:r1688_18, m1683_8 +# 1690| r1690_1(int) = Load[?] : &:r1688_19, ~m1683_10 +# 1690| m1690_2(int) = Store[?] : &:r1688_17, r1690_1 +# 1690| m1690_3(decltype([...](...){...})) = Chi : total:m1688_16, partial:m1690_2 +# 1688| r1688_20(glval) = FieldAddress[z] : r1688_2 +# 1688| r1688_21(glval) = VariableAddress[z] : +# 1688| r1688_22(int &&) = Load[z] : &:r1688_21, m1683_12 +# 1690| r1690_4(int) = Load[?] : &:r1688_22, ~m1683_14 +# 1690| m1690_5(int) = Store[?] : &:r1688_20, r1690_4 +# 1690| m1690_6(decltype([...](...){...})) = Chi : total:m1690_3, partial:m1690_5 +# 1688| r1688_23(decltype([...](...){...})) = Load[#temp1688:24] : &:r1688_2, m1690_6 +# 1688| m1688_24(decltype([...](...){...})) = Store[lambda_outer] : &:r1688_1, r1688_23 +# 1691| v1691_1(void) = NoOp : +# 1683| v1683_15(void) = ReturnIndirection[y] : &:r1683_9, m1683_10 +# 1683| v1683_16(void) = ReturnIndirection[z] : &:r1683_13, m1683_14 +# 1683| v1683_17(void) = ReturnVoid : +# 1683| v1683_18(void) = AliasedUse : ~m1686_6 +# 1683| v1683_19(void) = ExitFunction : + +# 1688| void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const +# 1688| Block 0 +# 1688| v1688_1(void) = EnterFunction : +# 1688| m1688_2(unknown) = AliasedDefinition : +# 1688| m1688_3(unknown) = InitializeNonLocal : +# 1688| m1688_4(unknown) = Chi : total:m1688_2, partial:m1688_3 +# 1688| r1688_5(glval) = VariableAddress[#this] : +# 1688| m1688_6(glval) = InitializeParameter[#this] : &:r1688_5 +# 1688| r1688_7(glval) = Load[#this] : &:r1688_5, m1688_6 +# 1688| m1688_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1688_7 +# 1689| r1689_1(glval) = VariableAddress[lambda_inner] : +# 1689| r1689_2(glval) = VariableAddress[#temp1689:28] : +# 1689| m1689_3(decltype([...](...){...})) = Uninitialized[#temp1689:28] : &:r1689_2 +# 1689| r1689_4(glval) = FieldAddress[obj1] : r1689_2 +# 1689| r1689_5(glval) = VariableAddress[#this] : +# 1689| r1689_6(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_5, m1688_6 +# 1689| r1689_7(glval) = FieldAddress[obj1] : r1689_6 +# 1689| r1689_8(CapturedLambdaMyObj) = Load[?] : &:r1689_7, ~m1688_8 +# 1689| m1689_9(CapturedLambdaMyObj) = Store[?] : &:r1689_4, r1689_8 +# 1689| m1689_10(decltype([...](...){...})) = Chi : total:m1689_3, partial:m1689_9 +# 1689| r1689_11(glval) = FieldAddress[obj2] : r1689_2 +# 1689| r1689_12(glval) = VariableAddress[#this] : +# 1689| r1689_13(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_12, m1688_6 +# 1689| r1689_14(glval) = FieldAddress[obj2] : r1689_13 +# 1689| r1689_15(CapturedLambdaMyObj) = Load[?] : &:r1689_14, ~m1688_8 +# 1689| m1689_16(CapturedLambdaMyObj) = Store[?] : &:r1689_11, r1689_15 +# 1689| m1689_17(decltype([...](...){...})) = Chi : total:m1689_10, partial:m1689_16 +# 1689| r1689_18(glval) = FieldAddress[x] : r1689_2 +# 1689| r1689_19(glval) = VariableAddress[#this] : +# 1689| r1689_20(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_19, m1688_6 +# 1689| r1689_21(glval) = FieldAddress[x] : r1689_20 +# 1689| r1689_22(int) = Load[?] : &:r1689_21, ~m1688_8 +# 1689| m1689_23(int) = Store[?] : &:r1689_18, r1689_22 +# 1689| m1689_24(decltype([...](...){...})) = Chi : total:m1689_17, partial:m1689_23 +# 1689| r1689_25(glval) = FieldAddress[y] : r1689_2 +# 1689| r1689_26(glval) = VariableAddress[#this] : +# 1689| r1689_27(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_26, m1688_6 +# 1689| r1689_28(glval) = FieldAddress[y] : r1689_27 +# 1689| r1689_29(int) = Load[?] : &:r1689_28, ~m1688_8 +# 1689| m1689_30(int) = Store[?] : &:r1689_25, r1689_29 +# 1689| m1689_31(decltype([...](...){...})) = Chi : total:m1689_24, partial:m1689_30 +# 1689| r1689_32(glval) = FieldAddress[z] : r1689_2 +# 1689| r1689_33(glval) = VariableAddress[#this] : +# 1689| r1689_34(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_33, m1688_6 +# 1689| r1689_35(glval) = FieldAddress[z] : r1689_34 +# 1689| r1689_36(int) = Load[?] : &:r1689_35, ~m1688_8 +# 1689| m1689_37(int) = Store[?] : &:r1689_32, r1689_36 +# 1689| m1689_38(decltype([...](...){...})) = Chi : total:m1689_31, partial:m1689_37 +# 1689| r1689_39(decltype([...](...){...})) = Load[#temp1689:28] : &:r1689_2, m1689_38 +# 1689| m1689_40(decltype([...](...){...})) = Store[lambda_inner] : &:r1689_1, r1689_39 +# 1690| v1690_1(void) = NoOp : +# 1688| v1688_9(void) = ReturnIndirection[#this] : &:r1688_7, m1688_8 +# 1688| v1688_10(void) = ReturnVoid : +# 1688| v1688_11(void) = AliasedUse : m1688_3 +# 1688| v1688_12(void) = ExitFunction : + +# 1689| void (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::operator()() const +# 1689| Block 0 +# 1689| v1689_1(void) = EnterFunction : +# 1689| m1689_2(unknown) = AliasedDefinition : +# 1689| m1689_3(unknown) = InitializeNonLocal : +# 1689| m1689_4(unknown) = Chi : total:m1689_2, partial:m1689_3 +# 1689| r1689_5(glval) = VariableAddress[#this] : +# 1689| m1689_6(glval) = InitializeParameter[#this] : &:r1689_5 +# 1689| r1689_7(glval) = Load[#this] : &:r1689_5, m1689_6 +# 1689| m1689_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1689_7 +# 1689| v1689_9(void) = NoOp : +# 1689| v1689_10(void) = NoOp : +# 1689| v1689_11(void) = ReturnIndirection[#this] : &:r1689_7, m1689_8 +# 1689| v1689_12(void) = ReturnVoid : +# 1689| v1689_13(void) = AliasedUse : m1689_3 +# 1689| v1689_14(void) = ExitFunction : + +# 1693| int goto_on_same_line() +# 1693| Block 0 +# 1693| v1693_1(void) = EnterFunction : +# 1693| m1693_2(unknown) = AliasedDefinition : +# 1693| m1693_3(unknown) = InitializeNonLocal : +# 1693| m1693_4(unknown) = Chi : total:m1693_2, partial:m1693_3 +# 1694| r1694_1(glval) = VariableAddress[x] : +# 1694| r1694_2(int) = Constant[42] : +# 1694| m1694_3(int) = Store[x] : &:r1694_1, r1694_2 +# 1695| v1695_1(void) = NoOp : +# 1695| v1695_2(void) = NoOp : +# 1696| r1696_1(glval) = VariableAddress[#return] : +# 1696| r1696_2(glval) = VariableAddress[x] : +# 1696| r1696_3(int) = Load[x] : &:r1696_2, m1694_3 +# 1696| m1696_4(int) = Store[#return] : &:r1696_1, r1696_3 +# 1693| r1693_5(glval) = VariableAddress[#return] : +# 1693| v1693_6(void) = ReturnValue : &:r1693_5, m1696_4 +# 1693| v1693_7(void) = AliasedUse : m1693_3 +# 1693| v1693_8(void) = ExitFunction : + +# 1701| void TrivialLambdaClass::m() const +# 1701| Block 0 +# 1701| v1701_1(void) = EnterFunction : +# 1701| m1701_2(unknown) = AliasedDefinition : +# 1701| m1701_3(unknown) = InitializeNonLocal : +# 1701| m1701_4(unknown) = Chi : total:m1701_2, partial:m1701_3 +# 1701| r1701_5(glval) = VariableAddress[#this] : +# 1701| m1701_6(glval) = InitializeParameter[#this] : &:r1701_5 +# 1701| r1701_7(glval) = Load[#this] : &:r1701_5, m1701_6 +# 1701| m1701_8(TrivialLambdaClass) = InitializeIndirection[#this] : &:r1701_7 +# 1702| r1702_1(glval) = VariableAddress[l_m_outer] : +# 1702| r1702_2(glval) = VariableAddress[#temp1702:25] : +# 1702| m1702_3(decltype([...](...){...})) = Uninitialized[#temp1702:25] : &:r1702_2 +# 1702| r1702_4(glval) = FieldAddress[(captured this)] : r1702_2 +# 1702| r1702_5(glval) = VariableAddress[#this] : +# 1702| r1702_6(TrivialLambdaClass *) = Load[#this] : &:r1702_5, m1701_6 +# 1702| r1702_7(TrivialLambdaClass) = Load[?] : &:r1702_6, ~m1701_8 +# 1702| m1702_8(TrivialLambdaClass) = Store[?] : &:r1702_4, r1702_7 +# 1702| r1702_9(decltype([...](...){...})) = Load[#temp1702:25] : &:r1702_2, ~m1702_8 +# 1702| m1702_10(decltype([...](...){...})) = Store[l_m_outer] : &:r1702_1, r1702_9 +# 1709| v1709_1(void) = NoOp : +# 1701| v1701_9(void) = ReturnIndirection[#this] : &:r1701_7, m1701_8 +# 1701| v1701_10(void) = ReturnVoid : +# 1701| v1701_11(void) = AliasedUse : m1701_3 +# 1701| v1701_12(void) = ExitFunction : + +# 1702| void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const +# 1702| Block 0 +# 1702| v1702_1(void) = EnterFunction : +# 1702| m1702_2(unknown) = AliasedDefinition : +# 1702| m1702_3(unknown) = InitializeNonLocal : +# 1702| m1702_4(unknown) = Chi : total:m1702_2, partial:m1702_3 +# 1702| r1702_5(glval) = VariableAddress[#this] : +# 1702| m1702_6(glval) = InitializeParameter[#this] : &:r1702_5 +# 1702| r1702_7(glval) = Load[#this] : &:r1702_5, m1702_6 +# 1702| m1702_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1702_7 +# 1703| r1703_1(glval) = VariableAddress[#this] : +# 1703| r1703_2(lambda [] type at line 1702, col. 26 *) = Load[#this] : &:r1703_1, m1702_6 +# 1703| r1703_3(glval) = FieldAddress[(captured this)] : r1703_2 +# 1703| r1703_4(TrivialLambdaClass *) = CopyValue : r1703_3 +# 1703| r1703_5(glval) = FunctionAddress[m] : +# 1703| v1703_6(void) = Call[m] : func:r1703_5, this:r1703_4 +# 1703| m1703_7(unknown) = ^CallSideEffect : ~m1702_4 +# 1703| m1703_8(unknown) = Chi : total:m1702_4, partial:m1703_7 +# 1703| v1703_9(void) = ^IndirectReadSideEffect[-1] : &:r1703_4, ~m1702_8 +# 1705| r1705_1(glval) = VariableAddress[l_m_inner] : +# 1705| r1705_2(glval) = VariableAddress[#temp1705:29] : +# 1705| m1705_3(decltype([...](...){...})) = Uninitialized[#temp1705:29] : &:r1705_2 +# 1705| r1705_4(glval) = FieldAddress[(captured this)] : r1705_2 +# 1705| r1705_5(glval) = VariableAddress[#this] : +# 1705| r1705_6(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1705_5, m1702_6 +# 1705| r1705_7(glval) = FieldAddress[(captured this)] : r1705_6 +# 1705| r1705_8(TrivialLambdaClass) = Load[?] : &:r1705_7, ~m1702_8 +# 1705| m1705_9(TrivialLambdaClass) = Store[?] : &:r1705_4, r1705_8 +# 1705| r1705_10(decltype([...](...){...})) = Load[#temp1705:29] : &:r1705_2, ~m1705_9 +# 1705| m1705_11(decltype([...](...){...})) = Store[l_m_inner] : &:r1705_1, r1705_10 +# 1708| v1708_1(void) = NoOp : +# 1702| v1702_9(void) = ReturnIndirection[#this] : &:r1702_7, m1702_8 +# 1702| v1702_10(void) = ReturnVoid : +# 1702| v1702_11(void) = AliasedUse : ~m1703_8 +# 1702| v1702_12(void) = ExitFunction : + +# 1705| void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator()() const +# 1705| Block 0 +# 1705| v1705_1(void) = EnterFunction : +# 1705| m1705_2(unknown) = AliasedDefinition : +# 1705| m1705_3(unknown) = InitializeNonLocal : +# 1705| m1705_4(unknown) = Chi : total:m1705_2, partial:m1705_3 +# 1705| r1705_5(glval) = VariableAddress[#this] : +# 1705| m1705_6(glval) = InitializeParameter[#this] : &:r1705_5 +# 1705| r1705_7(glval) = Load[#this] : &:r1705_5, m1705_6 +# 1705| m1705_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1705_7 +# 1706| r1706_1(glval) = VariableAddress[#this] : +# 1706| r1706_2(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1706_1, m1705_6 +# 1706| r1706_3(glval) = FieldAddress[(captured this)] : r1706_2 +# 1706| r1706_4(TrivialLambdaClass *) = CopyValue : r1706_3 +# 1706| r1706_5(glval) = FunctionAddress[m] : +# 1706| v1706_6(void) = Call[m] : func:r1706_5, this:r1706_4 +# 1706| m1706_7(unknown) = ^CallSideEffect : ~m1705_4 +# 1706| m1706_8(unknown) = Chi : total:m1705_4, partial:m1706_7 +# 1706| v1706_9(void) = ^IndirectReadSideEffect[-1] : &:r1706_4, ~m1705_8 +# 1707| v1707_1(void) = NoOp : +# 1705| v1705_9(void) = ReturnIndirection[#this] : &:r1705_7, m1705_8 +# 1705| v1705_10(void) = ReturnVoid : +# 1705| v1705_11(void) = AliasedUse : ~m1706_8 +# 1705| v1705_12(void) = ExitFunction : + +# 1712| void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) +# 1712| Block 0 +# 1712| v1712_1(void) = EnterFunction : +# 1712| m1712_2(unknown) = AliasedDefinition : +# 1712| m1712_3(unknown) = InitializeNonLocal : +# 1712| m1712_4(unknown) = Chi : total:m1712_2, partial:m1712_3 +# 1712| r1712_5(glval) = VariableAddress[p1] : +# 1712| m1712_6(TrivialLambdaClass) = InitializeParameter[p1] : &:r1712_5 +# 1712| r1712_7(glval) = VariableAddress[p2] : +# 1712| m1712_8(TrivialLambdaClass &) = InitializeParameter[p2] : &:r1712_7 +# 1712| r1712_9(TrivialLambdaClass &) = Load[p2] : &:r1712_7, m1712_8 +# 1712| m1712_10(unknown) = InitializeIndirection[p2] : &:r1712_9 +# 1712| r1712_11(glval) = VariableAddress[p3] : +# 1712| m1712_12(TrivialLambdaClass &&) = InitializeParameter[p3] : &:r1712_11 +# 1712| r1712_13(TrivialLambdaClass &&) = Load[p3] : &:r1712_11, m1712_12 +# 1712| m1712_14(unknown) = InitializeIndirection[p3] : &:r1712_13 +# 1713| r1713_1(glval) = VariableAddress[l1] : +# 1713| m1713_2(TrivialLambdaClass) = Uninitialized[l1] : &:r1713_1 +# 1714| r1714_1(glval) = VariableAddress[l2] : +# 1714| r1714_2(glval) = VariableAddress[#temp1714:36] : +# 1714| r1714_3(glval) = VariableAddress[#temp1714:36] : +# 1714| r1714_4(TrivialLambdaClass) = Constant[0] : +# 1714| m1714_5(TrivialLambdaClass) = Store[#temp1714:36] : &:r1714_3, r1714_4 +# 1714| r1714_6(TrivialLambdaClass) = Load[#temp1714:36] : &:r1714_3, m1714_5 +# 1714| m1714_7(TrivialLambdaClass) = Store[#temp1714:36] : &:r1714_2, r1714_6 +# 1714| r1714_8(glval) = Convert : r1714_2 +# 1714| r1714_9(TrivialLambdaClass &) = CopyValue : r1714_8 +# 1714| m1714_10(TrivialLambdaClass &) = Store[l2] : &:r1714_1, r1714_9 +# 1716| r1716_1(glval) = VariableAddress[l_outer1] : +# 1716| r1716_2(glval) = VariableAddress[#temp1716:20] : +# 1716| m1716_3(decltype([...](...){...})) = Uninitialized[#temp1716:20] : &:r1716_2 +# 1716| r1716_4(glval) = FieldAddress[p1] : r1716_2 +# 1716| r1716_5(glval) = VariableAddress[p1] : +# 1716| r1716_6(TrivialLambdaClass) = Load[p1] : &:r1716_5, m1712_6 +# 1716| m1716_7(TrivialLambdaClass) = Store[?] : &:r1716_4, r1716_6 +# 1716| m1716_8(decltype([...](...){...})) = Chi : total:m1716_3, partial:m1716_7 +# 1716| r1716_9(glval) = FieldAddress[p2] : r1716_2 +# 1716| r1716_10(glval) = VariableAddress[p2] : +# 1716| r1716_11(TrivialLambdaClass &) = Load[p2] : &:r1716_10, m1712_8 +#-----| r0_1(TrivialLambdaClass) = Load[?] : &:r1716_11, ~m1712_10 +#-----| m0_2(TrivialLambdaClass) = Store[?] : &:r1716_9, r0_1 +#-----| m0_3(decltype([...](...){...})) = Chi : total:m1716_8, partial:m0_2 +# 1716| r1716_12(glval) = FieldAddress[p3] : r1716_2 +# 1716| r1716_13(glval) = VariableAddress[p3] : +# 1716| r1716_14(TrivialLambdaClass &&) = Load[p3] : &:r1716_13, m1712_12 +#-----| r0_4(TrivialLambdaClass) = Load[?] : &:r1716_14, ~m1712_14 +#-----| m0_5(TrivialLambdaClass) = Store[?] : &:r1716_12, r0_4 +#-----| m0_6(decltype([...](...){...})) = Chi : total:m0_3, partial:m0_5 +# 1716| r1716_15(glval) = FieldAddress[l1] : r1716_2 +# 1716| r1716_16(glval) = VariableAddress[l1] : +# 1716| r1716_17(TrivialLambdaClass) = Load[l1] : &:r1716_16, m1713_2 +# 1716| m1716_18(TrivialLambdaClass) = Store[?] : &:r1716_15, r1716_17 +# 1716| m1716_19(decltype([...](...){...})) = Chi : total:m0_6, partial:m1716_18 +# 1716| r1716_20(glval) = FieldAddress[l2] : r1716_2 +# 1716| r1716_21(glval) = VariableAddress[l2] : +# 1716| r1716_22(TrivialLambdaClass &) = Load[l2] : &:r1716_21, m1714_10 +#-----| r0_7(TrivialLambdaClass) = Load[?] : &:r1716_22, m1714_7 +#-----| m0_8(TrivialLambdaClass) = Store[?] : &:r1716_20, r0_7 +#-----| m0_9(decltype([...](...){...})) = Chi : total:m1716_19, partial:m0_8 +# 1716| r1716_23(decltype([...](...){...})) = Load[#temp1716:20] : &:r1716_2, m0_9 +# 1716| m1716_24(decltype([...](...){...})) = Store[l_outer1] : &:r1716_1, r1716_23 +# 1719| v1719_1(void) = NoOp : +# 1712| v1712_15(void) = ReturnIndirection[p2] : &:r1712_9, m1712_10 +# 1712| v1712_16(void) = ReturnIndirection[p3] : &:r1712_13, m1712_14 +# 1712| v1712_17(void) = ReturnVoid : +# 1712| v1712_18(void) = AliasedUse : m1712_3 +# 1712| v1712_19(void) = ExitFunction : + +# 1716| void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const +# 1716| Block 0 +# 1716| v1716_1(void) = EnterFunction : +# 1716| m1716_2(unknown) = AliasedDefinition : +# 1716| m1716_3(unknown) = InitializeNonLocal : +# 1716| m1716_4(unknown) = Chi : total:m1716_2, partial:m1716_3 +# 1716| r1716_5(glval) = VariableAddress[#this] : +# 1716| m1716_6(glval) = InitializeParameter[#this] : &:r1716_5 +# 1716| r1716_7(glval) = Load[#this] : &:r1716_5, m1716_6 +# 1716| m1716_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1716_7 +# 1717| r1717_1(glval) = VariableAddress[l_inner1] : +# 1717| r1717_2(glval) = VariableAddress[#temp1717:24] : +# 1717| m1717_3(decltype([...](...){...})) = Uninitialized[#temp1717:24] : &:r1717_2 +# 1717| r1717_4(glval) = FieldAddress[p1] : r1717_2 +# 1717| r1717_5(glval) = VariableAddress[#this] : +# 1717| r1717_6(lambda [] type at line 1717, col. 25 *) = Load[#this] : &:r1717_5, m1716_6 +# 1717| r1717_7(glval) = FieldAddress[p1] : r1717_6 +# 1717| r1717_8(TrivialLambdaClass) = Load[?] : &:r1717_7, ~m1716_8 +# 1717| m1717_9(TrivialLambdaClass) = Store[?] : &:r1717_4, r1717_8 +# 1717| r1717_10(decltype([...](...){...})) = Load[#temp1717:24] : &:r1717_2, ~m1717_9 +# 1717| m1717_11(decltype([...](...){...})) = Store[l_inner1] : &:r1717_1, r1717_10 +# 1718| v1718_1(void) = NoOp : +# 1716| v1716_9(void) = ReturnIndirection[#this] : &:r1716_7, m1716_8 +# 1716| v1716_10(void) = ReturnVoid : +# 1716| v1716_11(void) = AliasedUse : m1716_3 +# 1716| v1716_12(void) = ExitFunction : + +# 1717| void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator()() const +# 1717| Block 0 +# 1717| v1717_1(void) = EnterFunction : +# 1717| m1717_2(unknown) = AliasedDefinition : +# 1717| m1717_3(unknown) = InitializeNonLocal : +# 1717| m1717_4(unknown) = Chi : total:m1717_2, partial:m1717_3 +# 1717| r1717_5(glval) = VariableAddress[#this] : +# 1717| m1717_6(glval) = InitializeParameter[#this] : &:r1717_5 +# 1717| r1717_7(glval) = Load[#this] : &:r1717_5, m1717_6 +# 1717| m1717_8(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1717_7 +# 1717| v1717_9(void) = NoOp : +# 1717| v1717_10(void) = ReturnIndirection[#this] : &:r1717_7, m1717_8 +# 1717| v1717_11(void) = ReturnVoid : +# 1717| v1717_12(void) = AliasedUse : m1717_3 +# 1717| v1717_13(void) = ExitFunction : + +# 1724| void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass() +# 1724| Block 0 +# 1724| v1724_1(void) = EnterFunction : +# 1724| m1724_2(unknown) = AliasedDefinition : +# 1724| m1724_3(unknown) = InitializeNonLocal : +# 1724| m1724_4(unknown) = Chi : total:m1724_2, partial:m1724_3 +# 1724| r1724_5(glval) = VariableAddress[#this] : +# 1724| m1724_6(glval) = InitializeParameter[#this] : &:r1724_5 +# 1724| r1724_7(glval) = Load[#this] : &:r1724_5, m1724_6 +# 1724| m1724_8(CopyConstructorWithImplicitArgumentClass) = InitializeIndirection[#this] : &:r1724_7 +# 1724| v1724_9(void) = NoOp : +# 1724| v1724_10(void) = ReturnIndirection[#this] : &:r1724_7, m1724_8 +# 1724| v1724_11(void) = ReturnVoid : +# 1724| v1724_12(void) = AliasedUse : m1724_3 +# 1724| v1724_13(void) = ExitFunction : + +# 1725| void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass(CopyConstructorWithImplicitArgumentClass const&) +# 1725| Block 0 +# 1725| v1725_1(void) = EnterFunction : +# 1725| m1725_2(unknown) = AliasedDefinition : +# 1725| m1725_3(unknown) = InitializeNonLocal : +# 1725| m1725_4(unknown) = Chi : total:m1725_2, partial:m1725_3 +# 1725| r1725_5(glval) = VariableAddress[#this] : +# 1725| m1725_6(glval) = InitializeParameter[#this] : &:r1725_5 +# 1725| r1725_7(glval) = Load[#this] : &:r1725_5, m1725_6 +# 1725| m1725_8(CopyConstructorWithImplicitArgumentClass) = InitializeIndirection[#this] : &:r1725_7 +# 1725| r1725_9(glval) = VariableAddress[c] : +# 1725| m1725_10(CopyConstructorWithImplicitArgumentClass &) = InitializeParameter[c] : &:r1725_9 +# 1725| r1725_11(CopyConstructorWithImplicitArgumentClass &) = Load[c] : &:r1725_9, m1725_10 +# 1725| m1725_12(unknown) = InitializeIndirection[c] : &:r1725_11 +# 1726| r1726_1(glval) = VariableAddress[c] : +# 1726| r1726_2(CopyConstructorWithImplicitArgumentClass &) = Load[c] : &:r1726_1, m1725_10 +# 1726| r1726_3(glval) = CopyValue : r1726_2 +# 1726| r1726_4(glval) = FieldAddress[x] : r1726_3 +# 1726| r1726_5(int) = Load[?] : &:r1726_4, ~m1725_12 +# 1726| r1726_6(glval) = VariableAddress[#this] : +# 1726| r1726_7(CopyConstructorWithImplicitArgumentClass *) = Load[#this] : &:r1726_6, m1725_6 +# 1726| r1726_8(glval) = FieldAddress[x] : r1726_7 +# 1726| m1726_9(int) = Store[?] : &:r1726_8, r1726_5 +# 1726| m1726_10(unknown) = Chi : total:m1725_8, partial:m1726_9 +# 1727| v1727_1(void) = NoOp : +# 1725| v1725_13(void) = ReturnIndirection[#this] : &:r1725_7, m1726_10 +# 1725| v1725_14(void) = ReturnIndirection[c] : &:r1725_11, m1725_12 +# 1725| v1725_15(void) = ReturnVoid : +# 1725| v1725_16(void) = AliasedUse : m1725_3 +# 1725| v1725_17(void) = ExitFunction : + +# 1733| void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass() +# 1733| Block 0 +# 1733| v1733_1(void) = EnterFunction : +# 1733| m1733_2(unknown) = AliasedDefinition : +# 1733| m1733_3(unknown) = InitializeNonLocal : +# 1733| m1733_4(unknown) = Chi : total:m1733_2, partial:m1733_3 +# 1733| r1733_5(glval) = VariableAddress[#this] : +# 1733| m1733_6(glval) = InitializeParameter[#this] : &:r1733_5 +# 1733| r1733_7(glval) = Load[#this] : &:r1733_5, m1733_6 +# 1733| m1733_8(CopyConstructorWithBitwiseCopyClass) = InitializeIndirection[#this] : &:r1733_7 +# 1733| v1733_9(void) = NoOp : +# 1733| v1733_10(void) = ReturnIndirection[#this] : &:r1733_7, m1733_8 +# 1733| v1733_11(void) = ReturnVoid : +# 1733| v1733_12(void) = AliasedUse : m1733_3 +# 1733| v1733_13(void) = ExitFunction : + +# 1736| void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass(CopyConstructorTestNonVirtualClass const&) +# 1736| Block 0 +# 1736| v1736_1(void) = EnterFunction : +# 1736| m1736_2(unknown) = AliasedDefinition : +# 1736| m1736_3(unknown) = InitializeNonLocal : +# 1736| m1736_4(unknown) = Chi : total:m1736_2, partial:m1736_3 +# 1736| r1736_5(glval) = VariableAddress[#this] : +# 1736| m1736_6(glval) = InitializeParameter[#this] : &:r1736_5 +# 1736| r1736_7(glval) = Load[#this] : &:r1736_5, m1736_6 +# 1736| m1736_8(CopyConstructorTestNonVirtualClass) = InitializeIndirection[#this] : &:r1736_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(CopyConstructorTestNonVirtualClass &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(CopyConstructorTestNonVirtualClass &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1736| r1736_9(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : m1736_6 +# 1736| r1736_10(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1736| r1736_11(glval) = VariableAddress[(unnamed parameter 0)] : +# 1736| r1736_12(CopyConstructorTestNonVirtualClass &) = Load[(unnamed parameter 0)] : &:r1736_11, m0_2 +# 1736| r1736_13(glval) = CopyValue : r1736_12 +# 1736| r1736_14(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : r1736_13 +# 1736| r1736_15(CopyConstructorWithImplicitArgumentClass &) = CopyValue : r1736_14 +# 1736| v1736_16(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1736_10, this:r1736_9, 0:r1736_15 +# 1736| m1736_17(unknown) = ^CallSideEffect : ~m1736_4 +# 1736| m1736_18(unknown) = Chi : total:m1736_4, partial:m1736_17 +# 1736| v1736_19(void) = ^BufferReadSideEffect[0] : &:r1736_15, ~m0_4 +# 1736| m1736_20(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1736_9 +# 1736| m1736_21(unknown) = Chi : total:m1736_8, partial:m1736_20 +# 1736| v1736_22(void) = NoOp : +# 1736| v1736_23(void) = ReturnIndirection[#this] : &:r1736_7, m1736_21 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 1736| v1736_24(void) = ReturnVoid : +# 1736| v1736_25(void) = AliasedUse : ~m1736_18 +# 1736| v1736_26(void) = ExitFunction : + +# 1740| void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass() +# 1740| Block 0 +# 1740| v1740_1(void) = EnterFunction : +# 1740| m1740_2(unknown) = AliasedDefinition : +# 1740| m1740_3(unknown) = InitializeNonLocal : +# 1740| m1740_4(unknown) = Chi : total:m1740_2, partial:m1740_3 +# 1740| r1740_5(glval) = VariableAddress[#this] : +# 1740| m1740_6(glval) = InitializeParameter[#this] : &:r1740_5 +# 1740| r1740_7(glval) = Load[#this] : &:r1740_5, m1740_6 +# 1740| m1740_8(CopyConstructorTestNonVirtualClass) = InitializeIndirection[#this] : &:r1740_7 +# 1740| r1740_9(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : m1740_6 +# 1740| r1740_10(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1740| v1740_11(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1740_10, this:r1740_9 +# 1740| m1740_12(unknown) = ^CallSideEffect : ~m1740_4 +# 1740| m1740_13(unknown) = Chi : total:m1740_4, partial:m1740_12 +# 1740| m1740_14(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1740_9 +# 1740| m1740_15(unknown) = Chi : total:m1740_8, partial:m1740_14 +# 1740| r1740_16(glval) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithBitwiseCopyClass] : m1740_6 +# 1740| r1740_17(glval) = FunctionAddress[CopyConstructorWithBitwiseCopyClass] : +# 1740| v1740_18(void) = Call[CopyConstructorWithBitwiseCopyClass] : func:r1740_17, this:r1740_16 +# 1740| m1740_19(unknown) = ^CallSideEffect : ~m1740_13 +# 1740| m1740_20(unknown) = Chi : total:m1740_13, partial:m1740_19 +# 1740| m1740_21(CopyConstructorWithBitwiseCopyClass) = ^IndirectMayWriteSideEffect[-1] : &:r1740_16 +# 1740| m1740_22(unknown) = Chi : total:m1740_15, partial:m1740_21 +# 1740| v1740_23(void) = NoOp : +# 1740| v1740_24(void) = ReturnIndirection[#this] : &:r1740_7, m1740_22 +# 1740| v1740_25(void) = ReturnVoid : +# 1740| v1740_26(void) = AliasedUse : ~m1740_20 +# 1740| v1740_27(void) = ExitFunction : + +# 1743| void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass(CopyConstructorTestVirtualClass const&) +# 1743| Block 0 +# 1743| v1743_1(void) = EnterFunction : +# 1743| m1743_2(unknown) = AliasedDefinition : +# 1743| m1743_3(unknown) = InitializeNonLocal : +# 1743| m1743_4(unknown) = Chi : total:m1743_2, partial:m1743_3 +# 1743| r1743_5(glval) = VariableAddress[#this] : +# 1743| m1743_6(glval) = InitializeParameter[#this] : &:r1743_5 +# 1743| r1743_7(glval) = Load[#this] : &:r1743_5, m1743_6 +# 1743| m1743_8(CopyConstructorTestVirtualClass) = InitializeIndirection[#this] : &:r1743_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(CopyConstructorTestVirtualClass &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(CopyConstructorTestVirtualClass &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1743| r1743_9(glval) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : m1743_6 +# 1743| r1743_10(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1743| r1743_11(glval) = VariableAddress[(unnamed parameter 0)] : +# 1743| r1743_12(CopyConstructorTestVirtualClass &) = Load[(unnamed parameter 0)] : &:r1743_11, m0_2 +# 1743| r1743_13(glval) = CopyValue : r1743_12 +# 1743| r1743_14(glval) = ConvertToVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : r1743_13 +# 1743| r1743_15(CopyConstructorWithImplicitArgumentClass &) = CopyValue : r1743_14 +# 1743| v1743_16(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1743_10, this:r1743_9, 0:r1743_15 +# 1743| m1743_17(unknown) = ^CallSideEffect : ~m1743_4 +# 1743| m1743_18(unknown) = Chi : total:m1743_4, partial:m1743_17 +# 1743| v1743_19(void) = ^BufferReadSideEffect[0] : &:r1743_15, ~m0_4 +# 1743| m1743_20(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1743_9 +# 1743| m1743_21(unknown) = Chi : total:m1743_18, partial:m1743_20 +# 1743| v1743_22(void) = NoOp : +# 1743| v1743_23(void) = ReturnIndirection[#this] : &:r1743_7, m1743_8 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 1743| v1743_24(void) = ReturnVoid : +# 1743| v1743_25(void) = AliasedUse : ~m1743_21 +# 1743| v1743_26(void) = ExitFunction : + +# 1747| void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass() +# 1747| Block 0 +# 1747| v1747_1(void) = EnterFunction : +# 1747| m1747_2(unknown) = AliasedDefinition : +# 1747| m1747_3(unknown) = InitializeNonLocal : +# 1747| m1747_4(unknown) = Chi : total:m1747_2, partial:m1747_3 +# 1747| r1747_5(glval) = VariableAddress[#this] : +# 1747| m1747_6(glval) = InitializeParameter[#this] : &:r1747_5 +# 1747| r1747_7(glval) = Load[#this] : &:r1747_5, m1747_6 +# 1747| m1747_8(CopyConstructorTestVirtualClass) = InitializeIndirection[#this] : &:r1747_7 +# 1747| r1747_9(glval) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : m1747_6 +# 1747| r1747_10(glval) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] : +# 1747| v1747_11(void) = Call[CopyConstructorWithImplicitArgumentClass] : func:r1747_10, this:r1747_9 +# 1747| m1747_12(unknown) = ^CallSideEffect : ~m1747_4 +# 1747| m1747_13(unknown) = Chi : total:m1747_4, partial:m1747_12 +# 1747| m1747_14(CopyConstructorWithImplicitArgumentClass) = ^IndirectMayWriteSideEffect[-1] : &:r1747_9 +# 1747| m1747_15(unknown) = Chi : total:m1747_13, partial:m1747_14 +# 1747| r1747_16(glval) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithBitwiseCopyClass] : m1747_6 +# 1747| r1747_17(glval) = FunctionAddress[CopyConstructorWithBitwiseCopyClass] : +# 1747| v1747_18(void) = Call[CopyConstructorWithBitwiseCopyClass] : func:r1747_17, this:r1747_16 +# 1747| m1747_19(unknown) = ^CallSideEffect : ~m1747_15 +# 1747| m1747_20(unknown) = Chi : total:m1747_15, partial:m1747_19 +# 1747| m1747_21(CopyConstructorWithBitwiseCopyClass) = ^IndirectMayWriteSideEffect[-1] : &:r1747_16 +# 1747| m1747_22(unknown) = Chi : total:m1747_20, partial:m1747_21 +# 1747| v1747_23(void) = NoOp : +# 1747| v1747_24(void) = ReturnIndirection[#this] : &:r1747_7, m1747_8 +# 1747| v1747_25(void) = ReturnVoid : +# 1747| v1747_26(void) = AliasedUse : ~m1747_22 +# 1747| v1747_27(void) = ExitFunction : + +# 1750| int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) +# 1750| Block 0 +# 1750| v1750_1(void) = EnterFunction : +# 1750| m1750_2(unknown) = AliasedDefinition : +# 1750| m1750_3(unknown) = InitializeNonLocal : +# 1750| m1750_4(unknown) = Chi : total:m1750_2, partial:m1750_3 +# 1751| r1751_1(glval) = VariableAddress[x] : +# 1751| m1751_2(CopyConstructorTestNonVirtualClass &) = InitializeParameter[x] : &:r1751_1 +# 1751| r1751_3(CopyConstructorTestNonVirtualClass &) = Load[x] : &:r1751_1, m1751_2 +# 1751| m1751_4(unknown) = InitializeIndirection[x] : &:r1751_3 +# 1752| r1752_1(glval) = VariableAddress[y] : +# 1752| m1752_2(CopyConstructorTestVirtualClass &) = InitializeParameter[y] : &:r1752_1 +# 1752| r1752_3(CopyConstructorTestVirtualClass &) = Load[y] : &:r1752_1, m1752_2 +# 1752| m1752_4(unknown) = InitializeIndirection[y] : &:r1752_3 +# 1753| r1753_1(glval) = VariableAddress[cx] : +# 1753| m1753_2(CopyConstructorTestNonVirtualClass) = Uninitialized[cx] : &:r1753_1 +# 1753| r1753_3(glval) = FunctionAddress[CopyConstructorTestNonVirtualClass] : +# 1753| r1753_4(glval) = VariableAddress[x] : +# 1753| r1753_5(CopyConstructorTestNonVirtualClass &) = Load[x] : &:r1753_4, m1751_2 +# 1753| r1753_6(glval) = CopyValue : r1753_5 +# 1753| r1753_7(CopyConstructorTestNonVirtualClass &) = CopyValue : r1753_6 +# 1753| v1753_8(void) = Call[CopyConstructorTestNonVirtualClass] : func:r1753_3, this:r1753_1, 0:r1753_7 +# 1753| m1753_9(unknown) = ^CallSideEffect : ~m1750_4 +# 1753| m1753_10(unknown) = Chi : total:m1750_4, partial:m1753_9 +# 1753| v1753_11(void) = ^BufferReadSideEffect[0] : &:r1753_7, ~m1751_4 +# 1753| m1753_12(CopyConstructorTestNonVirtualClass) = ^IndirectMayWriteSideEffect[-1] : &:r1753_1 +# 1753| m1753_13(CopyConstructorTestNonVirtualClass) = Chi : total:m1753_2, partial:m1753_12 +# 1754| r1754_1(glval) = VariableAddress[cy] : +# 1754| m1754_2(CopyConstructorTestVirtualClass) = Uninitialized[cy] : &:r1754_1 +# 1754| r1754_3(glval) = FunctionAddress[CopyConstructorTestVirtualClass] : +# 1754| r1754_4(glval) = VariableAddress[y] : +# 1754| r1754_5(CopyConstructorTestVirtualClass &) = Load[y] : &:r1754_4, m1752_2 +# 1754| r1754_6(glval) = CopyValue : r1754_5 +# 1754| r1754_7(CopyConstructorTestVirtualClass &) = CopyValue : r1754_6 +# 1754| v1754_8(void) = Call[CopyConstructorTestVirtualClass] : func:r1754_3, this:r1754_1, 0:r1754_7 +# 1754| m1754_9(unknown) = ^CallSideEffect : ~m1753_10 +# 1754| m1754_10(unknown) = Chi : total:m1753_10, partial:m1754_9 +# 1754| v1754_11(void) = ^BufferReadSideEffect[0] : &:r1754_7, ~m1752_4 +# 1754| m1754_12(CopyConstructorTestVirtualClass) = ^IndirectMayWriteSideEffect[-1] : &:r1754_1 +# 1754| m1754_13(CopyConstructorTestVirtualClass) = Chi : total:m1754_2, partial:m1754_12 +# 1755| r1755_1(glval) = VariableAddress[#return] : +# 1755| m1755_2(int) = Uninitialized[#return] : &:r1755_1 +# 1751| v1751_5(void) = ReturnIndirection[x] : &:r1751_3, m1751_4 +# 1752| v1752_5(void) = ReturnIndirection[y] : &:r1752_3, m1752_4 +# 1750| r1750_5(glval) = VariableAddress[#return] : +# 1750| v1750_6(void) = ReturnValue : &:r1750_5, m1755_2 +# 1750| v1750_7(void) = AliasedUse : ~m1754_10 +# 1750| v1750_8(void) = ExitFunction : + +# 1757| void if_initialization(int) +# 1757| Block 0 +# 1757| v1757_1(void) = EnterFunction : +# 1757| m1757_2(unknown) = AliasedDefinition : +# 1757| m1757_3(unknown) = InitializeNonLocal : +# 1757| m1757_4(unknown) = Chi : total:m1757_2, partial:m1757_3 +# 1757| r1757_5(glval) = VariableAddress[x] : +# 1757| m1757_6(int) = InitializeParameter[x] : &:r1757_5 +# 1758| r1758_1(glval) = VariableAddress[y] : +# 1758| r1758_2(glval) = VariableAddress[x] : +# 1758| r1758_3(int) = Load[x] : &:r1758_2, m1757_6 +# 1758| m1758_4(int) = Store[y] : &:r1758_1, r1758_3 +# 1758| r1758_5(glval) = VariableAddress[x] : +# 1758| r1758_6(int) = Load[x] : &:r1758_5, m1757_6 +# 1758| r1758_7(int) = Constant[1] : +# 1758| r1758_8(int) = Add : r1758_6, r1758_7 +# 1758| r1758_9(int) = Constant[0] : +# 1758| r1758_10(bool) = CompareNE : r1758_8, r1758_9 +# 1758| v1758_11(void) = ConditionalBranch : r1758_10 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 1759| Block 1 +# 1759| r1759_1(glval) = VariableAddress[x] : +# 1759| r1759_2(int) = Load[x] : &:r1759_1, m1757_6 +# 1759| r1759_3(glval) = VariableAddress[y] : +# 1759| r1759_4(int) = Load[y] : &:r1759_3, m1758_4 +# 1759| r1759_5(int) = Add : r1759_2, r1759_4 +# 1759| r1759_6(glval) = VariableAddress[x] : +# 1759| m1759_7(int) = Store[x] : &:r1759_6, r1759_5 +#-----| Goto -> Block 2 + +# 1762| Block 2 +# 1762| m1762_1(int) = Phi : from 0:m1757_6, from 1:m1759_7 +# 1762| r1762_2(glval) = VariableAddress[w] : +# 1762| m1762_3(int) = Uninitialized[w] : &:r1762_2 +# 1763| r1763_1(glval) = VariableAddress[x] : +# 1763| r1763_2(int) = Load[x] : &:r1763_1, m1762_1 +# 1763| r1763_3(glval) = VariableAddress[w] : +# 1763| m1763_4(int) = Store[w] : &:r1763_3, r1763_2 +# 1763| r1763_5(glval) = VariableAddress[x] : +# 1763| r1763_6(int) = Load[x] : &:r1763_5, m1762_1 +# 1763| r1763_7(int) = Constant[1] : +# 1763| r1763_8(int) = Add : r1763_6, r1763_7 +# 1763| r1763_9(int) = Constant[0] : +# 1763| r1763_10(bool) = CompareNE : r1763_8, r1763_9 +# 1763| v1763_11(void) = ConditionalBranch : r1763_10 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 1764| Block 3 +# 1764| r1764_1(glval) = VariableAddress[x] : +# 1764| r1764_2(int) = Load[x] : &:r1764_1, m1762_1 +# 1764| r1764_3(glval) = VariableAddress[w] : +# 1764| r1764_4(int) = Load[w] : &:r1764_3, m1763_4 +# 1764| r1764_5(int) = Add : r1764_2, r1764_4 +# 1764| r1764_6(glval) = VariableAddress[x] : +# 1764| m1764_7(int) = Store[x] : &:r1764_6, r1764_5 +#-----| Goto -> Block 4 + +# 1767| Block 4 +# 1767| m1767_1(int) = Phi : from 2:m1762_1, from 3:m1764_7 +# 1767| r1767_2(glval) = VariableAddress[x] : +# 1767| r1767_3(int) = Load[x] : &:r1767_2, m1767_1 +# 1767| r1767_4(glval) = VariableAddress[w] : +# 1767| m1767_5(int) = Store[w] : &:r1767_4, r1767_3 +# 1767| r1767_6(glval) = VariableAddress[w2] : +# 1767| r1767_7(glval) = VariableAddress[w] : +# 1767| r1767_8(int) = Load[w] : &:r1767_7, m1767_5 +# 1767| m1767_9(int) = Store[w2] : &:r1767_6, r1767_8 +# 1767| r1767_10(glval) = VariableAddress[w2] : +# 1767| r1767_11(int) = Load[w2] : &:r1767_10, m1767_9 +# 1767| r1767_12(int) = Constant[0] : +# 1767| r1767_13(bool) = CompareNE : r1767_11, r1767_12 +# 1767| r1767_14(bool) = CopyValue : r1767_13 +# 1767| v1767_15(void) = ConditionalBranch : r1767_14 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 1768| Block 5 +# 1768| r1768_1(glval) = VariableAddress[x] : +# 1768| r1768_2(int) = Load[x] : &:r1768_1, m1767_1 +# 1768| r1768_3(glval) = VariableAddress[w] : +# 1768| r1768_4(int) = Load[w] : &:r1768_3, m1767_5 +# 1768| r1768_5(int) = Add : r1768_2, r1768_4 +# 1768| r1768_6(glval) = VariableAddress[x] : +# 1768| m1768_7(int) = Store[x] : &:r1768_6, r1768_5 +#-----| Goto -> Block 6 + +# 1771| Block 6 +# 1771| m1771_1(int) = Phi : from 4:m1767_1, from 5:m1768_7 +# 1771| r1771_2(glval) = VariableAddress[v] : +# 1771| r1771_3(glval) = VariableAddress[x] : +# 1771| r1771_4(int) = Load[x] : &:r1771_3, m1771_1 +# 1771| m1771_5(int) = Store[v] : &:r1771_2, r1771_4 +# 1771| r1771_6(glval) = VariableAddress[v2] : +# 1771| r1771_7(glval) = VariableAddress[v] : +# 1771| r1771_8(int) = Load[v] : &:r1771_7, m1771_5 +# 1771| m1771_9(int) = Store[v2] : &:r1771_6, r1771_8 +# 1771| r1771_10(glval) = VariableAddress[v2] : +# 1771| r1771_11(int) = Load[v2] : &:r1771_10, m1771_9 +# 1771| r1771_12(int) = Constant[0] : +# 1771| r1771_13(bool) = CompareNE : r1771_11, r1771_12 +# 1771| r1771_14(bool) = CopyValue : r1771_13 +# 1771| v1771_15(void) = ConditionalBranch : r1771_14 +#-----| False -> Block 8 +#-----| True -> Block 7 + +# 1772| Block 7 +# 1772| r1772_1(glval) = VariableAddress[x] : +# 1772| r1772_2(int) = Load[x] : &:r1772_1, m1771_1 +# 1772| r1772_3(glval) = VariableAddress[v] : +# 1772| r1772_4(int) = Load[v] : &:r1772_3, m1771_5 +# 1772| r1772_5(int) = Add : r1772_2, r1772_4 +# 1772| r1772_6(glval) = VariableAddress[x] : +# 1772| m1772_7(int) = Store[x] : &:r1772_6, r1772_5 +#-----| Goto -> Block 8 + +# 1775| Block 8 +# 1775| m1775_1(int) = Phi : from 6:m1771_1, from 7:m1772_7 +# 1775| r1775_2(glval) = VariableAddress[z] : +# 1775| r1775_3(glval) = VariableAddress[x] : +# 1775| r1775_4(int) = Load[x] : &:r1775_3, m1775_1 +# 1775| m1775_5(int) = Store[z] : &:r1775_2, r1775_4 +# 1776| r1776_1(glval) = VariableAddress[z] : +# 1776| r1776_2(int) = Load[z] : &:r1776_1, m1775_5 +# 1776| r1776_3(int) = Constant[0] : +# 1776| r1776_4(bool) = CompareNE : r1776_2, r1776_3 +# 1776| v1776_5(void) = ConditionalBranch : r1776_4 +#-----| False -> Block 10 +#-----| True -> Block 9 + +# 1777| Block 9 +# 1777| r1777_1(glval) = VariableAddress[x] : +# 1777| r1777_2(int) = Load[x] : &:r1777_1, m1775_1 +# 1777| r1777_3(glval) = VariableAddress[z] : +# 1777| r1777_4(int) = Load[z] : &:r1777_3, m1775_5 +# 1777| r1777_5(int) = Add : r1777_2, r1777_4 +# 1777| r1777_6(glval) = VariableAddress[x] : +# 1777| m1777_7(int) = Store[x] : &:r1777_6, r1777_5 +#-----| Goto -> Block 10 + +# 1780| Block 10 +# 1780| m1780_1(int) = Phi : from 8:m1775_1, from 9:m1777_7 +# 1780| r1780_2(glval) = VariableAddress[z2] : +# 1780| r1780_3(glval) = VariableAddress[z] : +# 1780| r1780_4(int) = Load[z] : &:r1780_3, m1775_5 +# 1780| m1780_5(int) = Store[z2] : &:r1780_2, r1780_4 +# 1780| r1780_6(glval) = VariableAddress[z2] : +# 1780| r1780_7(int) = Load[z2] : &:r1780_6, m1780_5 +# 1780| r1780_8(int) = Constant[0] : +# 1780| r1780_9(bool) = CompareNE : r1780_7, r1780_8 +# 1780| r1780_10(bool) = CopyValue : r1780_9 +# 1780| v1780_11(void) = ConditionalBranch : r1780_10 +#-----| False -> Block 12 +#-----| True -> Block 11 + +# 1781| Block 11 +# 1781| r1781_1(glval) = VariableAddress[z2] : +# 1781| r1781_2(int) = Load[z2] : &:r1781_1, m1780_5 +# 1781| r1781_3(glval) = VariableAddress[x] : +# 1781| r1781_4(int) = Load[x] : &:r1781_3, m1780_1 +# 1781| r1781_5(int) = Add : r1781_4, r1781_2 +# 1781| m1781_6(int) = Store[x] : &:r1781_3, r1781_5 +#-----| Goto -> Block 12 + +# 1783| Block 12 +# 1783| v1783_1(void) = NoOp : +# 1757| v1757_7(void) = ReturnVoid : +# 1757| v1757_8(void) = AliasedUse : m1757_3 +# 1757| v1757_9(void) = ExitFunction : + +# 1785| void switch_initialization(int) +# 1785| Block 0 +# 1785| v1785_1(void) = EnterFunction : +# 1785| m1785_2(unknown) = AliasedDefinition : +# 1785| m1785_3(unknown) = InitializeNonLocal : +# 1785| m1785_4(unknown) = Chi : total:m1785_2, partial:m1785_3 +# 1785| r1785_5(glval) = VariableAddress[x] : +# 1785| m1785_6(int) = InitializeParameter[x] : &:r1785_5 +# 1786| r1786_1(glval) = VariableAddress[y] : +# 1786| r1786_2(glval) = VariableAddress[x] : +# 1786| r1786_3(int) = Load[x] : &:r1786_2, m1785_6 +# 1786| m1786_4(int) = Store[y] : &:r1786_1, r1786_3 +# 1786| r1786_5(glval) = VariableAddress[x] : +# 1786| r1786_6(int) = Load[x] : &:r1786_5, m1785_6 +# 1786| r1786_7(int) = Constant[1] : +# 1786| r1786_8(int) = Add : r1786_6, r1786_7 +# 1786| v1786_9(void) = Switch : r1786_8 +#-----| Default -> Block 1 + +# 1787| Block 1 +# 1787| v1787_1(void) = NoOp : +# 1788| r1788_1(glval) = VariableAddress[x] : +# 1788| r1788_2(int) = Load[x] : &:r1788_1, m1785_6 +# 1788| r1788_3(glval) = VariableAddress[y] : +# 1788| r1788_4(int) = Load[y] : &:r1788_3, m1786_4 +# 1788| r1788_5(int) = Add : r1788_2, r1788_4 +# 1788| r1788_6(glval) = VariableAddress[x] : +# 1788| m1788_7(int) = Store[x] : &:r1788_6, r1788_5 +# 1791| r1791_1(glval) = VariableAddress[w] : +# 1791| m1791_2(int) = Uninitialized[w] : &:r1791_1 +# 1792| r1792_1(glval) = VariableAddress[x] : +# 1792| r1792_2(int) = Load[x] : &:r1792_1, m1788_7 +# 1792| r1792_3(glval) = VariableAddress[w] : +# 1792| m1792_4(int) = Store[w] : &:r1792_3, r1792_2 +# 1792| r1792_5(glval) = VariableAddress[x] : +# 1792| r1792_6(int) = Load[x] : &:r1792_5, m1788_7 +# 1792| r1792_7(int) = Constant[1] : +# 1792| r1792_8(int) = Add : r1792_6, r1792_7 +# 1792| v1792_9(void) = Switch : r1792_8 +#-----| Default -> Block 2 + +# 1793| Block 2 +# 1793| v1793_1(void) = NoOp : +# 1794| r1794_1(glval) = VariableAddress[x] : +# 1794| r1794_2(int) = Load[x] : &:r1794_1, m1788_7 +# 1794| r1794_3(glval) = VariableAddress[w] : +# 1794| r1794_4(int) = Load[w] : &:r1794_3, m1792_4 +# 1794| r1794_5(int) = Add : r1794_2, r1794_4 +# 1794| r1794_6(glval) = VariableAddress[x] : +# 1794| m1794_7(int) = Store[x] : &:r1794_6, r1794_5 +# 1797| r1797_1(glval) = VariableAddress[x] : +# 1797| r1797_2(int) = Load[x] : &:r1797_1, m1794_7 +# 1797| r1797_3(glval) = VariableAddress[w] : +# 1797| m1797_4(int) = Store[w] : &:r1797_3, r1797_2 +# 1797| r1797_5(glval) = VariableAddress[w2] : +# 1797| r1797_6(glval) = VariableAddress[w] : +# 1797| r1797_7(int) = Load[w] : &:r1797_6, m1797_4 +# 1797| m1797_8(int) = Store[w2] : &:r1797_5, r1797_7 +# 1797| r1797_9(glval) = VariableAddress[w2] : +# 1797| r1797_10(int) = Load[w2] : &:r1797_9, m1797_8 +# 1797| r1797_11(int) = CopyValue : r1797_10 +# 1797| v1797_12(void) = Switch : r1797_11 +#-----| Default -> Block 3 + +# 1798| Block 3 +# 1798| v1798_1(void) = NoOp : +# 1799| r1799_1(glval) = VariableAddress[x] : +# 1799| r1799_2(int) = Load[x] : &:r1799_1, m1794_7 +# 1799| r1799_3(glval) = VariableAddress[w] : +# 1799| r1799_4(int) = Load[w] : &:r1799_3, m1797_4 +# 1799| r1799_5(int) = Add : r1799_2, r1799_4 +# 1799| r1799_6(glval) = VariableAddress[x] : +# 1799| m1799_7(int) = Store[x] : &:r1799_6, r1799_5 +# 1802| r1802_1(glval) = VariableAddress[v] : +# 1802| r1802_2(glval) = VariableAddress[x] : +# 1802| r1802_3(int) = Load[x] : &:r1802_2, m1799_7 +# 1802| m1802_4(int) = Store[v] : &:r1802_1, r1802_3 +# 1802| r1802_5(glval) = VariableAddress[v2] : +# 1802| r1802_6(glval) = VariableAddress[v] : +# 1802| r1802_7(int) = Load[v] : &:r1802_6, m1802_4 +# 1802| m1802_8(int) = Store[v2] : &:r1802_5, r1802_7 +# 1802| r1802_9(glval) = VariableAddress[v2] : +# 1802| r1802_10(int) = Load[v2] : &:r1802_9, m1802_8 +# 1802| r1802_11(int) = CopyValue : r1802_10 +# 1802| v1802_12(void) = Switch : r1802_11 +#-----| Default -> Block 4 + +# 1803| Block 4 +# 1803| v1803_1(void) = NoOp : +# 1804| r1804_1(glval) = VariableAddress[x] : +# 1804| r1804_2(int) = Load[x] : &:r1804_1, m1799_7 +# 1804| r1804_3(glval) = VariableAddress[v] : +# 1804| r1804_4(int) = Load[v] : &:r1804_3, m1802_4 +# 1804| r1804_5(int) = Add : r1804_2, r1804_4 +# 1804| r1804_6(glval) = VariableAddress[x] : +# 1804| m1804_7(int) = Store[x] : &:r1804_6, r1804_5 +# 1807| r1807_1(glval) = VariableAddress[z] : +# 1807| r1807_2(glval) = VariableAddress[x] : +# 1807| r1807_3(int) = Load[x] : &:r1807_2, m1804_7 +# 1807| m1807_4(int) = Store[z] : &:r1807_1, r1807_3 +# 1808| r1808_1(glval) = VariableAddress[z] : +# 1808| r1808_2(int) = Load[z] : &:r1808_1, m1807_4 +# 1808| v1808_3(void) = Switch : r1808_2 +#-----| Default -> Block 5 + +# 1809| Block 5 +# 1809| v1809_1(void) = NoOp : +# 1810| r1810_1(glval) = VariableAddress[x] : +# 1810| r1810_2(int) = Load[x] : &:r1810_1, m1804_7 +# 1810| r1810_3(glval) = VariableAddress[z] : +# 1810| r1810_4(int) = Load[z] : &:r1810_3, m1807_4 +# 1810| r1810_5(int) = Add : r1810_2, r1810_4 +# 1810| r1810_6(glval) = VariableAddress[x] : +# 1810| m1810_7(int) = Store[x] : &:r1810_6, r1810_5 +# 1813| r1813_1(glval) = VariableAddress[z2] : +# 1813| r1813_2(glval) = VariableAddress[z] : +# 1813| r1813_3(int) = Load[z] : &:r1813_2, m1807_4 +# 1813| m1813_4(int) = Store[z2] : &:r1813_1, r1813_3 +# 1813| r1813_5(glval) = VariableAddress[z2] : +# 1813| r1813_6(int) = Load[z2] : &:r1813_5, m1813_4 +# 1813| r1813_7(int) = CopyValue : r1813_6 +# 1813| v1813_8(void) = Switch : r1813_7 +#-----| Default -> Block 6 + +# 1814| Block 6 +# 1814| v1814_1(void) = NoOp : +# 1815| r1815_1(glval) = VariableAddress[z2] : +# 1815| r1815_2(int) = Load[z2] : &:r1815_1, m1813_4 +# 1815| r1815_3(glval) = VariableAddress[x] : +# 1815| r1815_4(int) = Load[x] : &:r1815_3, m1810_7 +# 1815| r1815_5(int) = Add : r1815_4, r1815_2 +# 1815| m1815_6(int) = Store[x] : &:r1815_3, r1815_5 +# 1817| v1817_1(void) = NoOp : +# 1785| v1785_7(void) = ReturnVoid : +# 1785| v1785_8(void) = AliasedUse : m1785_3 +# 1785| v1785_9(void) = ExitFunction : + +# 1821| int global_2 +# 1821| Block 0 +# 1821| v1821_1(void) = EnterFunction : +# 1821| m1821_2(unknown) = AliasedDefinition : +# 1821| r1821_3(glval) = VariableAddress[global_2] : +# 1821| r1821_4(int) = Constant[1] : +# 1821| m1821_5(int) = Store[global_2] : &:r1821_3, r1821_4 +# 1821| m1821_6(unknown) = Chi : total:m1821_2, partial:m1821_5 +# 1821| v1821_7(void) = ReturnVoid : +# 1821| v1821_8(void) = AliasedUse : ~m1821_6 +# 1821| v1821_9(void) = ExitFunction : + +# 1825| constructor_only global_4 +# 1825| Block 0 +# 1825| v1825_1(void) = EnterFunction : +# 1825| m1825_2(unknown) = AliasedDefinition : +# 1825| r1825_3(glval) = VariableAddress[global_4] : +# 1825| r1825_4(glval) = FunctionAddress[constructor_only] : +# 1825| r1825_5(int) = Constant[1] : +# 1825| v1825_6(void) = Call[constructor_only] : func:r1825_4, this:r1825_3, 0:r1825_5 +# 1825| m1825_7(unknown) = ^CallSideEffect : ~m1825_2 +# 1825| m1825_8(unknown) = Chi : total:m1825_2, partial:m1825_7 +# 1825| m1825_9(constructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1825_3 +# 1825| m1825_10(unknown) = Chi : total:m1825_8, partial:m1825_9 +# 1825| v1825_11(void) = ReturnVoid : +# 1825| v1825_12(void) = AliasedUse : ~m1825_10 +# 1825| v1825_13(void) = ExitFunction : + +# 1827| constructor_only global_5 +# 1827| Block 0 +# 1827| v1827_1(void) = EnterFunction : +# 1827| m1827_2(unknown) = AliasedDefinition : +# 1827| r1827_3(glval) = VariableAddress[global_5] : +# 1827| r1827_4(glval) = FunctionAddress[constructor_only] : +# 1827| r1827_5(int) = Constant[2] : +# 1827| v1827_6(void) = Call[constructor_only] : func:r1827_4, this:r1827_3, 0:r1827_5 +# 1827| m1827_7(unknown) = ^CallSideEffect : ~m1827_2 +# 1827| m1827_8(unknown) = Chi : total:m1827_2, partial:m1827_7 +# 1827| m1827_9(constructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1827_3 +# 1827| m1827_10(unknown) = Chi : total:m1827_8, partial:m1827_9 +# 1827| v1827_11(void) = ReturnVoid : +# 1827| v1827_12(void) = AliasedUse : ~m1827_10 +# 1827| v1827_13(void) = ExitFunction : + +# 1829| char* global_string +# 1829| Block 0 +# 1829| v1829_1(void) = EnterFunction : +# 1829| m1829_2(unknown) = AliasedDefinition : +# 1829| r1829_3(glval) = VariableAddress[global_string] : +# 1829| r1829_4(glval) = StringConstant["global string"] : +# 1829| r1829_5(char *) = Convert : r1829_4 +# 1829| r1829_6(char *) = Convert : r1829_5 +# 1829| m1829_7(char *) = Store[global_string] : &:r1829_3, r1829_6 +# 1829| m1829_8(unknown) = Chi : total:m1829_2, partial:m1829_7 +# 1829| v1829_9(void) = ReturnVoid : +# 1829| v1829_10(void) = AliasedUse : ~m1829_8 +# 1829| v1829_11(void) = ExitFunction : + +# 1831| int global_6 +# 1831| Block 0 +# 1831| v1831_1(void) = EnterFunction : +# 1831| m1831_2(unknown) = AliasedDefinition : +# 1831| r1831_3(glval) = VariableAddress[global_6] : +# 1831| r1831_4(glval) = VariableAddress[global_2] : +# 1831| r1831_5(int) = Load[global_2] : &:r1831_4, ~m1831_2 +# 1831| m1831_6(int) = Store[global_6] : &:r1831_3, r1831_5 +# 1831| m1831_7(unknown) = Chi : total:m1831_2, partial:m1831_6 +# 1831| v1831_8(void) = ReturnVoid : +# 1831| v1831_9(void) = AliasedUse : ~m1831_7 +# 1831| v1831_10(void) = ExitFunction : + +# 1834| block_assignment::A& block_assignment::A::operator=(block_assignment::A&&) +# 1834| Block 0 +# 1834| v1834_1(void) = EnterFunction : +# 1834| m1834_2(unknown) = AliasedDefinition : +# 1834| m1834_3(unknown) = InitializeNonLocal : +# 1834| m1834_4(unknown) = Chi : total:m1834_2, partial:m1834_3 +# 1834| r1834_5(glval) = VariableAddress[#this] : +# 1834| m1834_6(glval) = InitializeParameter[#this] : &:r1834_5 +# 1834| r1834_7(glval) = Load[#this] : &:r1834_5, m1834_6 +# 1834| m1834_8(A) = InitializeIndirection[#this] : &:r1834_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(A &&) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(A &&) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +#-----| r0_5(glval) = VariableAddress[#this] : +#-----| r0_6(A *) = Load[#this] : &:r0_5, m1834_6 +#-----| r0_7(glval[1]>) = FieldAddress[e] : r0_6 +#-----| r0_8(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| r0_9(A &&) = Load[(unnamed parameter 0)] : &:r0_8, m0_2 +#-----| r0_10(glval) = CopyValue : r0_9 +#-----| r0_11(glval[1]>) = FieldAddress[e] : r0_10 +#-----| r0_12(enum [1]) = Load[?] : &:r0_11, ~m0_4 +#-----| m0_13(enum [1]) = Store[?] : &:r0_7, r0_12 +#-----| m0_14(unknown) = Chi : total:m1834_8, partial:m0_13 +#-----| r0_15(glval) = VariableAddress[#return] : +#-----| r0_16(glval) = VariableAddress[#this] : +#-----| r0_17(A *) = Load[#this] : &:r0_16, m1834_6 +#-----| r0_18(glval) = CopyValue : r0_17 +#-----| r0_19(A &) = CopyValue : r0_18 +#-----| m0_20(A &) = Store[#return] : &:r0_15, r0_19 +# 1834| v1834_9(void) = ReturnIndirection[#this] : &:r1834_7, m0_14 +#-----| v0_21(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 1834| r1834_10(glval) = VariableAddress[#return] : +# 1834| v1834_11(void) = ReturnValue : &:r1834_10, m0_20 +# 1834| v1834_12(void) = AliasedUse : m1834_3 +# 1834| v1834_13(void) = ExitFunction : + +# 1839| block_assignment::B& block_assignment::B::operator=(block_assignment::B&&) +# 1839| Block 0 +# 1839| v1839_1(void) = EnterFunction : +# 1839| m1839_2(unknown) = AliasedDefinition : +# 1839| m1839_3(unknown) = InitializeNonLocal : +# 1839| m1839_4(unknown) = Chi : total:m1839_2, partial:m1839_3 +# 1839| r1839_5(glval) = VariableAddress[#this] : +# 1839| m1839_6(glval) = InitializeParameter[#this] : &:r1839_5 +# 1839| r1839_7(glval) = Load[#this] : &:r1839_5, m1839_6 +# 1839| m1839_8(B) = InitializeIndirection[#this] : &:r1839_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(B &&) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(B &&) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 1839| r1839_9(glval) = VariableAddress[#this] : +# 1839| r1839_10(B *) = Load[#this] : &:r1839_9, m1839_6 +#-----| r0_5(A *) = ConvertToNonVirtualBase[B : A] : r1839_10 +# 1839| r1839_11(glval) = FunctionAddress[operator=] : +# 1839| r1839_12(glval) = VariableAddress[(unnamed parameter 0)] : +# 1839| r1839_13(B &&) = Load[(unnamed parameter 0)] : &:r1839_12, m0_2 +#-----| r0_6(glval) = CopyValue : r1839_13 +# 1839| r1839_14(B *) = CopyValue : r0_6 +#-----| r0_7(A *) = ConvertToNonVirtualBase[B : A] : r1839_14 +# 1839| r1839_15(glval) = CopyValue : r0_7 +#-----| r0_8(A &) = CopyValue : r1839_15 +# 1839| r1839_16(A &) = Call[operator=] : func:r1839_11, this:r0_5, 0:r0_8 +# 1839| m1839_17(unknown) = ^CallSideEffect : ~m1839_4 +# 1839| m1839_18(unknown) = Chi : total:m1839_4, partial:m1839_17 +#-----| v0_9(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m1839_8 +#-----| v0_10(void) = ^BufferReadSideEffect[0] : &:r0_8, ~m0_4 +#-----| m0_11(A) = ^IndirectMayWriteSideEffect[-1] : &:r0_5 +#-----| m0_12(unknown) = Chi : total:m1839_8, partial:m0_11 +#-----| m0_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_8 +#-----| m0_14(unknown) = Chi : total:m0_4, partial:m0_13 +#-----| r0_15(glval) = CopyValue : r1839_16 +#-----| r0_16(glval) = VariableAddress[#return] : +#-----| r0_17(glval) = VariableAddress[#this] : +#-----| r0_18(B *) = Load[#this] : &:r0_17, m1839_6 +#-----| r0_19(glval) = CopyValue : r0_18 +#-----| r0_20(B &) = CopyValue : r0_19 +#-----| m0_21(B &) = Store[#return] : &:r0_16, r0_20 +# 1839| v1839_19(void) = ReturnIndirection[#this] : &:r1839_7, m0_12 +#-----| v0_22(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_14 +# 1839| r1839_20(glval) = VariableAddress[#return] : +# 1839| v1839_21(void) = ReturnValue : &:r1839_20, m0_21 +# 1839| v1839_22(void) = AliasedUse : ~m1839_18 +# 1839| v1839_23(void) = ExitFunction : + +# 1843| void block_assignment::foo() +# 1843| Block 0 +# 1843| v1843_1(void) = EnterFunction : +# 1843| m1843_2(unknown) = AliasedDefinition : +# 1843| m1843_3(unknown) = InitializeNonLocal : +# 1843| m1843_4(unknown) = Chi : total:m1843_2, partial:m1843_3 +# 1844| r1844_1(glval) = VariableAddress[v] : +# 1844| m1844_2(B) = Uninitialized[v] : &:r1844_1 +# 1844| r1844_3(glval) = FunctionAddress[B] : +# 1844| r1844_4(A *) = Constant[0] : +# 1844| v1844_5(void) = Call[B] : func:r1844_3, this:r1844_1, 0:r1844_4 +# 1844| m1844_6(unknown) = ^CallSideEffect : ~m1843_4 +# 1844| m1844_7(unknown) = Chi : total:m1843_4, partial:m1844_6 +# 1844| v1844_8(void) = ^BufferReadSideEffect[0] : &:r1844_4, ~m1844_7 +# 1844| m1844_9(B) = ^IndirectMayWriteSideEffect[-1] : &:r1844_1 +# 1844| m1844_10(B) = Chi : total:m1844_2, partial:m1844_9 +# 1844| m1844_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1844_4 +# 1844| m1844_12(unknown) = Chi : total:m1844_7, partial:m1844_11 +# 1845| r1845_1(glval) = VariableAddress[v] : +# 1845| r1845_2(glval) = FunctionAddress[operator=] : +# 1845| r1845_3(glval) = VariableAddress[#temp1845:13] : +# 1845| m1845_4(B) = Uninitialized[#temp1845:13] : &:r1845_3 +# 1845| r1845_5(glval) = FunctionAddress[B] : +# 1845| r1845_6(A *) = Constant[0] : +# 1845| v1845_7(void) = Call[B] : func:r1845_5, this:r1845_3, 0:r1845_6 +# 1845| m1845_8(unknown) = ^CallSideEffect : ~m1844_12 +# 1845| m1845_9(unknown) = Chi : total:m1844_12, partial:m1845_8 +# 1845| v1845_10(void) = ^BufferReadSideEffect[0] : &:r1845_6, ~m1845_9 +# 1845| m1845_11(B) = ^IndirectMayWriteSideEffect[-1] : &:r1845_3 +# 1845| m1845_12(B) = Chi : total:m1845_4, partial:m1845_11 +# 1845| m1845_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r1845_6 +# 1845| m1845_14(unknown) = Chi : total:m1845_9, partial:m1845_13 +# 1845| r1845_15(B &) = CopyValue : r1845_3 +# 1845| r1845_16(B &) = Call[operator=] : func:r1845_2, this:r1845_1, 0:r1845_15 +# 1845| m1845_17(unknown) = ^CallSideEffect : ~m1845_14 +# 1845| m1845_18(unknown) = Chi : total:m1845_14, partial:m1845_17 +# 1845| v1845_19(void) = ^IndirectReadSideEffect[-1] : &:r1845_1, m1844_10 +# 1845| v1845_20(void) = ^BufferReadSideEffect[0] : &:r1845_15, ~m1845_12 +# 1845| m1845_21(B) = ^IndirectMayWriteSideEffect[-1] : &:r1845_1 +# 1845| m1845_22(B) = Chi : total:m1844_10, partial:m1845_21 +# 1845| m1845_23(unknown) = ^BufferMayWriteSideEffect[0] : &:r1845_15 +# 1845| m1845_24(B) = Chi : total:m1845_12, partial:m1845_23 +# 1845| r1845_25(glval) = CopyValue : r1845_16 +# 1846| v1846_1(void) = NoOp : +# 1843| v1843_5(void) = ReturnVoid : +# 1843| v1843_6(void) = AliasedUse : ~m1845_18 +# 1843| v1843_7(void) = ExitFunction : + +# 1849| void magicvars() +# 1849| Block 0 +# 1849| v1849_1(void) = EnterFunction : +# 1849| m1849_2(unknown) = AliasedDefinition : +# 1849| m1849_3(unknown) = InitializeNonLocal : +# 1849| m1849_4(unknown) = Chi : total:m1849_2, partial:m1849_3 +# 1850| r1850_1(glval) = VariableAddress[pf] : +# 1850| r1850_2(glval) = VariableAddress[__PRETTY_FUNCTION__] : +# 1850| r1850_3(char *) = Convert : r1850_2 +# 1850| m1850_4(char *) = Store[pf] : &:r1850_1, r1850_3 +# 1851| r1851_1(glval) = VariableAddress[strfunc] : +# 1851| r1851_2(glval) = VariableAddress[__func__] : +# 1851| r1851_3(char *) = Convert : r1851_2 +# 1851| m1851_4(char *) = Store[strfunc] : &:r1851_1, r1851_3 +# 1852| v1852_1(void) = NoOp : +# 1849| v1849_5(void) = ReturnVoid : +# 1849| v1849_6(void) = AliasedUse : m1849_3 +# 1849| v1849_7(void) = ExitFunction : + +# 1862| void* missing_declaration_entries::Bar1::missing_type_decl_entry(missing_declaration_entries::Bar1::pointer) +# 1862| Block 0 +# 1862| v1862_1(void) = EnterFunction : +# 1862| m1862_2(unknown) = AliasedDefinition : +# 1862| m1862_3(unknown) = InitializeNonLocal : +# 1862| m1862_4(unknown) = Chi : total:m1862_2, partial:m1862_3 +# 1862| r1862_5(glval) = VariableAddress[#this] : +# 1862| m1862_6(glval>) = InitializeParameter[#this] : &:r1862_5 +# 1862| r1862_7(glval>) = Load[#this] : &:r1862_5, m1862_6 +# 1862| m1862_8(Bar1) = InitializeIndirection[#this] : &:r1862_7 +# 1862| r1862_9(glval) = VariableAddress[p] : +# 1862| m1862_10(S *) = InitializeParameter[p] : &:r1862_9 +# 1862| r1862_11(S *) = Load[p] : &:r1862_9, m1862_10 +# 1862| m1862_12(unknown) = InitializeIndirection[p] : &:r1862_11 +# 1864| r1864_1(glval) = VariableAddress[#return] : +# 1864| r1864_2(glval) = VariableAddress[p] : +# 1864| r1864_3(S *) = Load[p] : &:r1864_2, m1862_10 +# 1864| r1864_4(void *) = Convert : r1864_3 +# 1864| m1864_5(void *) = Store[#return] : &:r1864_1, r1864_4 +# 1862| v1862_13(void) = ReturnIndirection[#this] : &:r1862_7, m1862_8 +# 1862| v1862_14(void) = ReturnIndirection[p] : &:r1862_11, m1862_12 +# 1862| r1862_15(glval) = VariableAddress[#return] : +# 1862| v1862_16(void) = ReturnValue : &:r1862_15, m1864_5 +# 1862| v1862_17(void) = AliasedUse : m1862_3 +# 1862| v1862_18(void) = ExitFunction : + +# 1868| void missing_declaration_entries::test1() +# 1868| Block 0 +# 1868| v1868_1(void) = EnterFunction : +# 1868| m1868_2(unknown) = AliasedDefinition : +# 1868| m1868_3(unknown) = InitializeNonLocal : +# 1868| m1868_4(unknown) = Chi : total:m1868_2, partial:m1868_3 +# 1869| r1869_1(glval>) = VariableAddress[b] : +# 1869| m1869_2(Bar1) = Uninitialized[b] : &:r1869_1 +# 1870| r1870_1(glval>) = VariableAddress[b] : +# 1870| r1870_2(glval) = FunctionAddress[missing_type_decl_entry] : +# 1870| r1870_3(S *) = Constant[0] : +# 1870| r1870_4(void *) = Call[missing_type_decl_entry] : func:r1870_2, this:r1870_1, 0:r1870_3 +# 1870| m1870_5(unknown) = ^CallSideEffect : ~m1868_4 +# 1870| m1870_6(unknown) = Chi : total:m1868_4, partial:m1870_5 +# 1870| v1870_7(void) = ^IndirectReadSideEffect[-1] : &:r1870_1, m1869_2 +# 1870| v1870_8(void) = ^BufferReadSideEffect[0] : &:r1870_3, ~m1870_6 +# 1870| m1870_9(Bar1) = ^IndirectMayWriteSideEffect[-1] : &:r1870_1 +# 1870| m1870_10(Bar1) = Chi : total:m1869_2, partial:m1870_9 +# 1870| m1870_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1870_3 +# 1870| m1870_12(unknown) = Chi : total:m1870_6, partial:m1870_11 +# 1871| v1871_1(void) = NoOp : +# 1868| v1868_5(void) = ReturnVoid : +# 1868| v1868_6(void) = AliasedUse : ~m1870_12 +# 1868| v1868_7(void) = ExitFunction : + +# 1875| int missing_declaration_entries::Bar2::two_missing_variable_declaration_entries() +# 1875| Block 0 +# 1875| v1875_1(void) = EnterFunction : +# 1875| m1875_2(unknown) = AliasedDefinition : +# 1875| m1875_3(unknown) = InitializeNonLocal : +# 1875| m1875_4(unknown) = Chi : total:m1875_2, partial:m1875_3 +# 1875| r1875_5(glval) = VariableAddress[#this] : +# 1875| m1875_6(glval>) = InitializeParameter[#this] : &:r1875_5 +# 1875| r1875_7(glval>) = Load[#this] : &:r1875_5, m1875_6 +# 1875| m1875_8(Bar2) = InitializeIndirection[#this] : &:r1875_7 +# 1876| r1876_1(glval) = VariableAddress[x] : +# 1876| m1876_2(int[10]) = Uninitialized[x] : &:r1876_1 +# 1876| r1876_3(glval) = VariableAddress[y] : +# 1876| m1876_4(int[10]) = Uninitialized[y] : &:r1876_3 +# 1877| r1877_1(int) = Constant[10] : +# 1877| r1877_2(glval) = VariableAddress[x] : +# 1877| r1877_3(int *) = Convert : r1877_2 +# 1877| r1877_4(glval) = CopyValue : r1877_3 +# 1877| m1877_5(int) = Store[?] : &:r1877_4, r1877_1 +# 1877| m1877_6(int[10]) = Chi : total:m1876_2, partial:m1877_5 +# 1878| r1878_1(int) = Constant[10] : +# 1878| r1878_2(glval) = VariableAddress[y] : +# 1878| r1878_3(int *) = Convert : r1878_2 +# 1878| r1878_4(glval) = CopyValue : r1878_3 +# 1878| m1878_5(int) = Store[?] : &:r1878_4, r1878_1 +# 1878| m1878_6(int[10]) = Chi : total:m1876_4, partial:m1878_5 +# 1879| r1879_1(glval) = VariableAddress[#return] : +# 1879| r1879_2(glval) = VariableAddress[x] : +# 1879| r1879_3(int *) = Convert : r1879_2 +# 1879| r1879_4(int) = Load[?] : &:r1879_3, m1877_5 +# 1879| r1879_5(glval) = VariableAddress[y] : +# 1879| r1879_6(int *) = Convert : r1879_5 +# 1879| r1879_7(int) = Load[?] : &:r1879_6, m1878_5 +# 1879| r1879_8(int) = Add : r1879_4, r1879_7 +# 1879| m1879_9(int) = Store[#return] : &:r1879_1, r1879_8 +# 1875| v1875_9(void) = ReturnIndirection[#this] : &:r1875_7, m1875_8 +# 1875| r1875_10(glval) = VariableAddress[#return] : +# 1875| v1875_11(void) = ReturnValue : &:r1875_10, m1879_9 +# 1875| v1875_12(void) = AliasedUse : m1875_3 +# 1875| v1875_13(void) = ExitFunction : + +# 1883| void missing_declaration_entries::test2() +# 1883| Block 0 +# 1883| v1883_1(void) = EnterFunction : +# 1883| m1883_2(unknown) = AliasedDefinition : +# 1883| m1883_3(unknown) = InitializeNonLocal : +# 1883| m1883_4(unknown) = Chi : total:m1883_2, partial:m1883_3 +# 1884| r1884_1(glval>) = VariableAddress[b] : +# 1884| m1884_2(Bar2) = Uninitialized[b] : &:r1884_1 +# 1885| r1885_1(glval>) = VariableAddress[b] : +# 1885| r1885_2(glval) = FunctionAddress[two_missing_variable_declaration_entries] : +# 1885| r1885_3(int) = Call[two_missing_variable_declaration_entries] : func:r1885_2, this:r1885_1 +# 1885| m1885_4(unknown) = ^CallSideEffect : ~m1883_4 +# 1885| m1885_5(unknown) = Chi : total:m1883_4, partial:m1885_4 +# 1885| v1885_6(void) = ^IndirectReadSideEffect[-1] : &:r1885_1, m1884_2 +# 1885| m1885_7(Bar2) = ^IndirectMayWriteSideEffect[-1] : &:r1885_1 +# 1885| m1885_8(Bar2) = Chi : total:m1884_2, partial:m1885_7 +# 1886| v1886_1(void) = NoOp : +# 1883| v1883_5(void) = ReturnVoid : +# 1883| v1883_6(void) = AliasedUse : ~m1885_5 +# 1883| v1883_7(void) = ExitFunction : + +# 1889| char global_template +# 1889| Block 0 +# 1889| v1889_1(void) = EnterFunction : +# 1889| m1889_2(unknown) = AliasedDefinition : +# 1889| r1889_3(glval) = VariableAddress[global_template] : +# 1889| r1889_4(char) = Constant[42] : +# 1889| m1889_5(char) = Store[global_template] : &:r1889_3, r1889_4 +# 1889| m1889_6(unknown) = Chi : total:m1889_2, partial:m1889_5 +# 1889| v1889_7(void) = ReturnVoid : +# 1889| v1889_8(void) = AliasedUse : ~m1889_6 +# 1889| v1889_9(void) = ExitFunction : + +# 1889| int global_template +# 1889| Block 0 +# 1889| v1889_1(void) = EnterFunction : +# 1889| m1889_2(unknown) = AliasedDefinition : +# 1889| r1889_3(glval) = VariableAddress[global_template] : +# 1889| r1889_4(int) = Constant[42] : +# 1889| m1889_5(int) = Store[global_template] : &:r1889_3, r1889_4 +# 1889| m1889_6(unknown) = Chi : total:m1889_2, partial:m1889_5 +# 1889| v1889_7(void) = ReturnVoid : +# 1889| v1889_8(void) = AliasedUse : ~m1889_6 +# 1889| v1889_9(void) = ExitFunction : + +# 1891| int test_global_template_int() +# 1891| Block 0 +# 1891| v1891_1(void) = EnterFunction : +# 1891| m1891_2(unknown) = AliasedDefinition : +# 1891| m1891_3(unknown) = InitializeNonLocal : +# 1891| m1891_4(unknown) = Chi : total:m1891_2, partial:m1891_3 +# 1892| r1892_1(glval) = VariableAddress[local_int] : +# 1892| r1892_2(glval) = VariableAddress[global_template] : +# 1892| r1892_3(int) = Load[global_template] : &:r1892_2, ~m1891_3 +# 1892| m1892_4(int) = Store[local_int] : &:r1892_1, r1892_3 +# 1893| r1893_1(glval) = VariableAddress[local_char] : +# 1893| r1893_2(glval) = VariableAddress[global_template] : +# 1893| r1893_3(char) = Load[global_template] : &:r1893_2, ~m1891_3 +# 1893| m1893_4(char) = Store[local_char] : &:r1893_1, r1893_3 +# 1894| r1894_1(glval) = VariableAddress[#return] : +# 1894| r1894_2(glval) = VariableAddress[local_int] : +# 1894| r1894_3(int) = Load[local_int] : &:r1894_2, m1892_4 +# 1894| r1894_4(glval) = VariableAddress[local_char] : +# 1894| r1894_5(char) = Load[local_char] : &:r1894_4, m1893_4 +# 1894| r1894_6(int) = Convert : r1894_5 +# 1894| r1894_7(int) = Add : r1894_3, r1894_6 +# 1894| m1894_8(int) = Store[#return] : &:r1894_1, r1894_7 +# 1891| r1891_5(glval) = VariableAddress[#return] : +# 1891| v1891_6(void) = ReturnValue : &:r1891_5, m1894_8 +# 1891| v1891_7(void) = AliasedUse : m1891_3 +# 1891| v1891_8(void) = ExitFunction : + +# 1899| int noreturnTest(int) +# 1899| Block 0 +# 1899| v1899_1(void) = EnterFunction : +# 1899| m1899_2(unknown) = AliasedDefinition : +# 1899| m1899_3(unknown) = InitializeNonLocal : +# 1899| m1899_4(unknown) = Chi : total:m1899_2, partial:m1899_3 +# 1899| r1899_5(glval) = VariableAddress[x] : +# 1899| m1899_6(int) = InitializeParameter[x] : &:r1899_5 +# 1900| r1900_1(glval) = VariableAddress[x] : +# 1900| r1900_2(int) = Load[x] : &:r1900_1, m1899_6 +# 1900| r1900_3(int) = Constant[10] : +# 1900| r1900_4(bool) = CompareLT : r1900_2, r1900_3 +# 1900| v1900_5(void) = ConditionalBranch : r1900_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 1901| Block 1 +# 1901| r1901_1(glval) = VariableAddress[#return] : +# 1901| r1901_2(glval) = VariableAddress[x] : +# 1901| r1901_3(int) = Load[x] : &:r1901_2, m1899_6 +# 1901| m1901_4(int) = Store[#return] : &:r1901_1, r1901_3 +# 1899| r1899_7(glval) = VariableAddress[#return] : +# 1899| v1899_8(void) = ReturnValue : &:r1899_7, m1901_4 +# 1899| v1899_9(void) = AliasedUse : m1899_3 +# 1899| v1899_10(void) = ExitFunction : + +# 1903| Block 2 +# 1903| r1903_1(glval) = FunctionAddress[noreturnFunc] : +# 1903| v1903_2(void) = Call[noreturnFunc] : func:r1903_1 +# 1903| m1903_3(unknown) = ^CallSideEffect : ~m1899_4 +# 1903| m1903_4(unknown) = Chi : total:m1899_4, partial:m1903_3 +# 1899| v1899_11(void) = Unreached : + +# 1907| int noreturnTest2(int) +# 1907| Block 0 +# 1907| v1907_1(void) = EnterFunction : +# 1907| m1907_2(unknown) = AliasedDefinition : +# 1907| m1907_3(unknown) = InitializeNonLocal : +# 1907| m1907_4(unknown) = Chi : total:m1907_2, partial:m1907_3 +# 1907| r1907_5(glval) = VariableAddress[x] : +# 1907| m1907_6(int) = InitializeParameter[x] : &:r1907_5 +# 1908| r1908_1(glval) = VariableAddress[x] : +# 1908| r1908_2(int) = Load[x] : &:r1908_1, m1907_6 +# 1908| r1908_3(int) = Constant[10] : +# 1908| r1908_4(bool) = CompareLT : r1908_2, r1908_3 +# 1908| v1908_5(void) = ConditionalBranch : r1908_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 1909| Block 1 +# 1909| r1909_1(glval) = FunctionAddress[noreturnFunc] : +# 1909| v1909_2(void) = Call[noreturnFunc] : func:r1909_1 +# 1909| m1909_3(unknown) = ^CallSideEffect : ~m1907_4 +# 1909| m1909_4(unknown) = Chi : total:m1907_4, partial:m1909_3 +# 1907| v1907_7(void) = Unreached : + +# 1911| Block 2 +# 1911| r1911_1(glval) = VariableAddress[#return] : +# 1911| r1911_2(glval) = VariableAddress[x] : +# 1911| r1911_3(int) = Load[x] : &:r1911_2, m1907_6 +# 1911| m1911_4(int) = Store[#return] : &:r1911_1, r1911_3 +# 1907| r1907_8(glval) = VariableAddress[#return] : +# 1907| v1907_9(void) = ReturnValue : &:r1907_8, m1911_4 +# 1907| v1907_10(void) = AliasedUse : m1907_3 +# 1907| v1907_11(void) = ExitFunction : + +# 1914| int static_function(int) +# 1914| Block 0 +# 1914| v1914_1(void) = EnterFunction : +# 1914| m1914_2(unknown) = AliasedDefinition : +# 1914| m1914_3(unknown) = InitializeNonLocal : +# 1914| m1914_4(unknown) = Chi : total:m1914_2, partial:m1914_3 +# 1914| r1914_5(glval) = VariableAddress[x] : +# 1914| m1914_6(int) = InitializeParameter[x] : &:r1914_5 +# 1915| r1915_1(glval) = VariableAddress[#return] : +# 1915| r1915_2(glval) = VariableAddress[x] : +# 1915| r1915_3(int) = Load[x] : &:r1915_2, m1914_6 +# 1915| m1915_4(int) = Store[#return] : &:r1915_1, r1915_3 +# 1914| r1914_7(glval) = VariableAddress[#return] : +# 1914| v1914_8(void) = ReturnValue : &:r1914_7, m1915_4 +# 1914| v1914_9(void) = AliasedUse : m1914_3 +# 1914| v1914_10(void) = ExitFunction : + +# 1918| void test_static_functions_with_assignments() +# 1918| Block 0 +# 1918| v1918_1(void) = EnterFunction : +# 1918| m1918_2(unknown) = AliasedDefinition : +# 1918| m1918_3(unknown) = InitializeNonLocal : +# 1918| m1918_4(unknown) = Chi : total:m1918_2, partial:m1918_3 +# 1919| r1919_1(glval) = VariableAddress[c] : +# 1919| m1919_2(C) = Uninitialized[c] : &:r1919_1 +# 1919| r1919_3(glval) = FunctionAddress[C] : +# 1919| v1919_4(void) = Call[C] : func:r1919_3, this:r1919_1 +# 1919| m1919_5(unknown) = ^CallSideEffect : ~m1918_4 +# 1919| m1919_6(unknown) = Chi : total:m1918_4, partial:m1919_5 +# 1919| m1919_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1919_1 +# 1919| m1919_8(C) = Chi : total:m1919_2, partial:m1919_7 +# 1920| r1920_1(glval) = VariableAddress[x] : +# 1920| m1920_2(int) = Uninitialized[x] : &:r1920_1 +# 1921| r1921_1(glval) = VariableAddress[c] : +# 1921| r1921_2(glval) = FunctionAddress[StaticMemberFunction] : +# 1921| r1921_3(int) = Constant[10] : +# 1921| r1921_4(int) = Call[StaticMemberFunction] : func:r1921_2, 0:r1921_3 +# 1921| m1921_5(unknown) = ^CallSideEffect : ~m1919_6 +# 1921| m1921_6(unknown) = Chi : total:m1919_6, partial:m1921_5 +# 1921| r1921_7(glval) = VariableAddress[x] : +# 1921| m1921_8(int) = Store[x] : &:r1921_7, r1921_4 +# 1922| r1922_1(glval) = VariableAddress[y] : +# 1922| m1922_2(int) = Uninitialized[y] : &:r1922_1 +# 1923| r1923_1(glval) = FunctionAddress[StaticMemberFunction] : +# 1923| r1923_2(int) = Constant[10] : +# 1923| r1923_3(int) = Call[StaticMemberFunction] : func:r1923_1, 0:r1923_2 +# 1923| m1923_4(unknown) = ^CallSideEffect : ~m1921_6 +# 1923| m1923_5(unknown) = Chi : total:m1921_6, partial:m1923_4 +# 1923| r1923_6(glval) = VariableAddress[y] : +# 1923| m1923_7(int) = Store[y] : &:r1923_6, r1923_3 +# 1924| r1924_1(glval) = VariableAddress[z] : +# 1924| m1924_2(int) = Uninitialized[z] : &:r1924_1 +# 1925| r1925_1(glval) = FunctionAddress[static_function] : +# 1925| r1925_2(int) = Constant[10] : +# 1925| r1925_3(int) = Call[static_function] : func:r1925_1, 0:r1925_2 +# 1925| m1925_4(unknown) = ^CallSideEffect : ~m1923_5 +# 1925| m1925_5(unknown) = Chi : total:m1923_5, partial:m1925_4 +# 1925| r1925_6(glval) = VariableAddress[z] : +# 1925| m1925_7(int) = Store[z] : &:r1925_6, r1925_3 +# 1926| v1926_1(void) = NoOp : +# 1918| v1918_5(void) = ReturnVoid : +# 1918| v1918_6(void) = AliasedUse : ~m1925_5 +# 1918| v1918_7(void) = ExitFunction : + +# 1928| void test_double_assign() +# 1928| Block 0 +# 1928| v1928_1(void) = EnterFunction : +# 1928| m1928_2(unknown) = AliasedDefinition : +# 1928| m1928_3(unknown) = InitializeNonLocal : +# 1928| m1928_4(unknown) = Chi : total:m1928_2, partial:m1928_3 +# 1929| r1929_1(glval) = VariableAddress[i] : +# 1929| m1929_2(int) = Uninitialized[i] : &:r1929_1 +# 1929| r1929_3(glval) = VariableAddress[j] : +# 1929| m1929_4(int) = Uninitialized[j] : &:r1929_3 +# 1930| r1930_1(int) = Constant[40] : +# 1930| r1930_2(glval) = VariableAddress[j] : +# 1930| m1930_3(int) = Store[j] : &:r1930_2, r1930_1 +# 1930| r1930_4(int) = CopyValue : r1930_1 +# 1930| r1930_5(glval) = VariableAddress[i] : +# 1930| m1930_6(int) = Store[i] : &:r1930_5, r1930_4 +# 1931| v1931_1(void) = NoOp : +# 1928| v1928_5(void) = ReturnVoid : +# 1928| v1928_6(void) = AliasedUse : m1928_3 +# 1928| v1928_7(void) = ExitFunction : + +# 1933| void test_assign_with_assign_operation() +# 1933| Block 0 +# 1933| v1933_1(void) = EnterFunction : +# 1933| m1933_2(unknown) = AliasedDefinition : +# 1933| m1933_3(unknown) = InitializeNonLocal : +# 1933| m1933_4(unknown) = Chi : total:m1933_2, partial:m1933_3 +# 1934| r1934_1(glval) = VariableAddress[i] : +# 1934| m1934_2(int) = Uninitialized[i] : &:r1934_1 +# 1934| r1934_3(glval) = VariableAddress[j] : +# 1934| r1934_4(int) = Constant[0] : +# 1934| m1934_5(int) = Store[j] : &:r1934_3, r1934_4 +# 1935| r1935_1(int) = Constant[40] : +# 1935| r1935_2(glval) = VariableAddress[j] : +# 1935| r1935_3(int) = Load[j] : &:r1935_2, m1934_5 +# 1935| r1935_4(int) = Add : r1935_3, r1935_1 +# 1935| m1935_5(int) = Store[j] : &:r1935_2, r1935_4 +# 1935| r1935_6(glval) = VariableAddress[i] : +# 1935| m1935_7(int) = Store[i] : &:r1935_6, r1935_4 +# 1936| v1936_1(void) = NoOp : +# 1933| v1933_5(void) = ReturnVoid : +# 1933| v1933_6(void) = AliasedUse : m1933_3 +# 1933| v1933_7(void) = ExitFunction : + +# 1942| D& D::ReferenceStaticMemberFunction() +# 1942| Block 0 +# 1942| v1942_1(void) = EnterFunction : +# 1942| m1942_2(unknown) = AliasedDefinition : +# 1942| m1942_3(unknown) = InitializeNonLocal : +# 1942| m1942_4(unknown) = Chi : total:m1942_2, partial:m1942_3 +# 1943| r1943_1(glval) = VariableAddress[#return] : +# 1943| r1943_2(glval) = VariableAddress[x] : +# 1943| r1943_3(D &) = CopyValue : r1943_2 +# 1943| m1943_4(D &) = Store[#return] : &:r1943_1, r1943_3 +# 1942| r1942_5(glval) = VariableAddress[#return] : +# 1942| v1942_6(void) = ReturnValue : &:r1942_5, m1943_4 +# 1942| v1942_7(void) = AliasedUse : m1942_3 +# 1942| v1942_8(void) = ExitFunction : + +# 1945| D D::ObjectStaticMemberFunction() +# 1945| Block 0 +# 1945| v1945_1(void) = EnterFunction : +# 1945| m1945_2(unknown) = AliasedDefinition : +# 1945| m1945_3(unknown) = InitializeNonLocal : +# 1945| m1945_4(unknown) = Chi : total:m1945_2, partial:m1945_3 +# 1946| r1946_1(glval) = VariableAddress[#return] : +# 1946| r1946_2(glval) = VariableAddress[x] : +# 1946| r1946_3(D) = Load[x] : &:r1946_2, ~m1945_3 +# 1946| m1946_4(D) = Store[#return] : &:r1946_1, r1946_3 +# 1945| r1945_5(glval) = VariableAddress[#return] : +# 1945| v1945_6(void) = ReturnValue : &:r1945_5, m1946_4 +# 1945| v1945_7(void) = AliasedUse : m1945_3 +# 1945| v1945_8(void) = ExitFunction : + +# 1950| void test_static_member_functions_with_reference_return() +# 1950| Block 0 +# 1950| v1950_1(void) = EnterFunction : +# 1950| m1950_2(unknown) = AliasedDefinition : +# 1950| m1950_3(unknown) = InitializeNonLocal : +# 1950| m1950_4(unknown) = Chi : total:m1950_2, partial:m1950_3 +# 1951| r1951_1(glval) = VariableAddress[d] : +# 1951| m1951_2(D) = Uninitialized[d] : &:r1951_1 +# 1953| r1953_1(glval) = VariableAddress[d] : +# 1953| r1953_2(glval) = FunctionAddress[ReferenceStaticMemberFunction] : +# 1953| r1953_3(D &) = Call[ReferenceStaticMemberFunction] : func:r1953_2 +# 1953| m1953_4(unknown) = ^CallSideEffect : ~m1950_4 +# 1953| m1953_5(unknown) = Chi : total:m1950_4, partial:m1953_4 +# 1953| r1953_6(glval) = CopyValue : r1953_3 +# 1954| r1954_1(glval) = FunctionAddress[ReferenceStaticMemberFunction] : +# 1954| r1954_2(D &) = Call[ReferenceStaticMemberFunction] : func:r1954_1 +# 1954| m1954_3(unknown) = ^CallSideEffect : ~m1953_5 +# 1954| m1954_4(unknown) = Chi : total:m1953_5, partial:m1954_3 +# 1954| r1954_5(glval) = CopyValue : r1954_2 +# 1955| r1955_1(glval) = VariableAddress[d] : +# 1955| r1955_2(glval) = FunctionAddress[ObjectStaticMemberFunction] : +# 1955| r1955_3(D) = Call[ObjectStaticMemberFunction] : func:r1955_2 +# 1955| m1955_4(unknown) = ^CallSideEffect : ~m1954_4 +# 1955| m1955_5(unknown) = Chi : total:m1954_4, partial:m1955_4 +# 1956| r1956_1(glval) = FunctionAddress[ObjectStaticMemberFunction] : +# 1956| r1956_2(D) = Call[ObjectStaticMemberFunction] : func:r1956_1 +# 1956| m1956_3(unknown) = ^CallSideEffect : ~m1955_5 +# 1956| m1956_4(unknown) = Chi : total:m1955_5, partial:m1956_3 +# 1958| r1958_1(glval) = VariableAddress[x] : +# 1958| m1958_2(D) = Uninitialized[x] : &:r1958_1 +# 1959| r1959_1(glval) = VariableAddress[d] : +# 1959| r1959_2(glval) = FunctionAddress[ReferenceStaticMemberFunction] : +# 1959| r1959_3(D &) = Call[ReferenceStaticMemberFunction] : func:r1959_2 +# 1959| m1959_4(unknown) = ^CallSideEffect : ~m1956_4 +# 1959| m1959_5(unknown) = Chi : total:m1956_4, partial:m1959_4 +# 1959| r1959_6(D) = Load[?] : &:r1959_3, ~m1959_5 +# 1959| r1959_7(glval) = VariableAddress[x] : +# 1959| m1959_8(D) = Store[x] : &:r1959_7, r1959_6 +# 1960| r1960_1(glval) = VariableAddress[y] : +# 1960| m1960_2(D) = Uninitialized[y] : &:r1960_1 +# 1961| r1961_1(glval) = FunctionAddress[ReferenceStaticMemberFunction] : +# 1961| r1961_2(D &) = Call[ReferenceStaticMemberFunction] : func:r1961_1 +# 1961| m1961_3(unknown) = ^CallSideEffect : ~m1959_5 +# 1961| m1961_4(unknown) = Chi : total:m1959_5, partial:m1961_3 +# 1961| r1961_5(D) = Load[?] : &:r1961_2, ~m1961_4 +# 1961| r1961_6(glval) = VariableAddress[y] : +# 1961| m1961_7(D) = Store[y] : &:r1961_6, r1961_5 +# 1962| r1962_1(glval) = VariableAddress[j] : +# 1962| m1962_2(D) = Uninitialized[j] : &:r1962_1 +# 1963| r1963_1(glval) = VariableAddress[d] : +# 1963| r1963_2(glval) = FunctionAddress[ObjectStaticMemberFunction] : +# 1963| r1963_3(D) = Call[ObjectStaticMemberFunction] : func:r1963_2 +# 1963| m1963_4(unknown) = ^CallSideEffect : ~m1961_4 +# 1963| m1963_5(unknown) = Chi : total:m1961_4, partial:m1963_4 +# 1963| r1963_6(glval) = VariableAddress[j] : +# 1963| m1963_7(D) = Store[j] : &:r1963_6, r1963_3 +# 1964| r1964_1(glval) = VariableAddress[k] : +# 1964| m1964_2(D) = Uninitialized[k] : &:r1964_1 +# 1965| r1965_1(glval) = FunctionAddress[ObjectStaticMemberFunction] : +# 1965| r1965_2(D) = Call[ObjectStaticMemberFunction] : func:r1965_1 +# 1965| m1965_3(unknown) = ^CallSideEffect : ~m1963_5 +# 1965| m1965_4(unknown) = Chi : total:m1963_5, partial:m1965_3 +# 1965| r1965_5(glval) = VariableAddress[k] : +# 1965| m1965_6(D) = Store[k] : &:r1965_5, r1965_2 +# 1966| v1966_1(void) = NoOp : +# 1950| v1950_5(void) = ReturnVoid : +# 1950| v1950_6(void) = AliasedUse : ~m1965_4 +# 1950| v1950_7(void) = ExitFunction : + +# 1968| void test_volatile() +# 1968| Block 0 +# 1968| v1968_1(void) = EnterFunction : +# 1968| m1968_2(unknown) = AliasedDefinition : +# 1968| m1968_3(unknown) = InitializeNonLocal : +# 1968| m1968_4(unknown) = Chi : total:m1968_2, partial:m1968_3 +# 1969| r1969_1(glval) = VariableAddress[x] : +# 1969| m1969_2(int) = Uninitialized[x] : &:r1969_1 +# 1970| r1970_1(glval) = VariableAddress[x] : +# 1970| r1970_2(int) = Load[x] : &:r1970_1, m1969_2 +# 1971| v1971_1(void) = NoOp : +# 1968| v1968_5(void) = ReturnVoid : +# 1968| v1968_6(void) = AliasedUse : m1968_3 +# 1968| v1968_7(void) = ExitFunction : + +# 1979| void value_category_test() +# 1979| Block 0 +# 1979| v1979_1(void) = EnterFunction : +# 1979| m1979_2(unknown) = AliasedDefinition : +# 1979| m1979_3(unknown) = InitializeNonLocal : +# 1979| m1979_4(unknown) = Chi : total:m1979_2, partial:m1979_3 +# 1980| r1980_1(glval) = VariableAddress[c] : +# 1980| m1980_2(ValCat) = Uninitialized[c] : &:r1980_1 +#-----| r0_1(glval) = VariableAddress[#temp0:0] : +#-----| m0_2(ValCat) = Uninitialized[#temp0:0] : &:r0_1 +#-----| r0_3(ValCat) = Load[#temp0:0] : &:r0_1, m0_2 +# 1982| r1982_1(glval) = VariableAddress[c] : +# 1982| r1982_2(glval) = FunctionAddress[lvalue] : +# 1982| r1982_3(ValCat &) = Call[lvalue] : func:r1982_2 +# 1982| m1982_4(unknown) = ^CallSideEffect : ~m1979_4 +# 1982| m1982_5(unknown) = Chi : total:m1979_4, partial:m1982_4 +# 1982| r1982_6(glval) = CopyValue : r1982_3 +# 1982| m1982_7(ValCat) = Store[?] : &:r1982_6, r0_3 +# 1982| m1982_8(unknown) = Chi : total:m1982_5, partial:m1982_7 +#-----| r0_4(glval) = VariableAddress[#temp0:0] : +#-----| m0_5(ValCat) = Uninitialized[#temp0:0] : &:r0_4 +#-----| r0_6(ValCat) = Load[#temp0:0] : &:r0_4, m0_5 +# 1983| r1983_1(glval) = VariableAddress[c] : +# 1983| r1983_2(glval) = FunctionAddress[xvalue] : +# 1983| r1983_3(ValCat &&) = Call[xvalue] : func:r1983_2 +# 1983| m1983_4(unknown) = ^CallSideEffect : ~m1982_8 +# 1983| m1983_5(unknown) = Chi : total:m1982_8, partial:m1983_4 +# 1983| r1983_6(glval) = CopyValue : r1983_3 +# 1983| m1983_7(ValCat) = Store[?] : &:r1983_6, r0_6 +# 1983| m1983_8(unknown) = Chi : total:m1983_5, partial:m1983_7 +#-----| r0_7(glval) = VariableAddress[#temp0:0] : +#-----| m0_8(ValCat) = Uninitialized[#temp0:0] : &:r0_7 +#-----| r0_9(ValCat) = Load[#temp0:0] : &:r0_7, m0_8 +# 1984| r1984_1(glval) = VariableAddress[#temp1984:5] : +# 1984| r1984_2(glval) = VariableAddress[c] : +# 1984| r1984_3(glval) = FunctionAddress[prvalue] : +# 1984| r1984_4(ValCat) = Call[prvalue] : func:r1984_3 +# 1984| m1984_5(unknown) = ^CallSideEffect : ~m1983_8 +# 1984| m1984_6(unknown) = Chi : total:m1983_8, partial:m1984_5 +# 1984| m1984_7(ValCat) = Store[#temp1984:5] : &:r1984_1, r1984_4 +# 1984| m1984_8(ValCat) = Store[#temp1984:5] : &:r1984_1, r0_9 +#-----| r0_10(glval) = VariableAddress[#temp0:0] : +#-----| m0_11(ValCat) = Uninitialized[#temp0:0] : &:r0_10 +#-----| r0_12(ValCat) = Load[#temp0:0] : &:r0_10, m0_11 +# 1985| r1985_1(glval) = FunctionAddress[lvalue] : +# 1985| r1985_2(ValCat &) = Call[lvalue] : func:r1985_1 +# 1985| m1985_3(unknown) = ^CallSideEffect : ~m1984_6 +# 1985| m1985_4(unknown) = Chi : total:m1984_6, partial:m1985_3 +# 1985| r1985_5(glval) = CopyValue : r1985_2 +# 1985| m1985_6(ValCat) = Store[?] : &:r1985_5, r0_12 +# 1985| m1985_7(unknown) = Chi : total:m1985_4, partial:m1985_6 +#-----| r0_13(glval) = VariableAddress[#temp0:0] : +#-----| m0_14(ValCat) = Uninitialized[#temp0:0] : &:r0_13 +#-----| r0_15(ValCat) = Load[#temp0:0] : &:r0_13, m0_14 +# 1986| r1986_1(glval) = FunctionAddress[xvalue] : +# 1986| r1986_2(ValCat &&) = Call[xvalue] : func:r1986_1 +# 1986| m1986_3(unknown) = ^CallSideEffect : ~m1985_7 +# 1986| m1986_4(unknown) = Chi : total:m1985_7, partial:m1986_3 +# 1986| r1986_5(glval) = CopyValue : r1986_2 +# 1986| m1986_6(ValCat) = Store[?] : &:r1986_5, r0_15 +# 1986| m1986_7(unknown) = Chi : total:m1986_4, partial:m1986_6 +#-----| r0_16(glval) = VariableAddress[#temp0:0] : +#-----| m0_17(ValCat) = Uninitialized[#temp0:0] : &:r0_16 +#-----| r0_18(ValCat) = Load[#temp0:0] : &:r0_16, m0_17 +# 1987| r1987_1(glval) = VariableAddress[#temp1987:5] : +# 1987| r1987_2(glval) = FunctionAddress[prvalue] : +# 1987| r1987_3(ValCat) = Call[prvalue] : func:r1987_2 +# 1987| m1987_4(unknown) = ^CallSideEffect : ~m1986_7 +# 1987| m1987_5(unknown) = Chi : total:m1986_7, partial:m1987_4 +# 1987| m1987_6(ValCat) = Store[#temp1987:5] : &:r1987_1, r1987_3 +# 1987| m1987_7(ValCat) = Store[#temp1987:5] : &:r1987_1, r0_18 +# 1988| v1988_1(void) = NoOp : +# 1979| v1979_5(void) = ReturnVoid : +# 1979| v1979_6(void) = AliasedUse : ~m1987_5 +# 1979| v1979_7(void) = ExitFunction : + +# 1990| void SetStaticFuncPtr() +# 1990| Block 0 +# 1990| v1990_1(void) = EnterFunction : +# 1990| m1990_2(unknown) = AliasedDefinition : +# 1990| m1990_3(unknown) = InitializeNonLocal : +# 1990| m1990_4(unknown) = Chi : total:m1990_2, partial:m1990_3 +# 1991| r1991_1(glval) = VariableAddress[c] : +# 1991| m1991_2(C) = Uninitialized[c] : &:r1991_1 +# 1991| r1991_3(glval) = FunctionAddress[C] : +# 1991| v1991_4(void) = Call[C] : func:r1991_3, this:r1991_1 +# 1991| m1991_5(unknown) = ^CallSideEffect : ~m1990_4 +# 1991| m1991_6(unknown) = Chi : total:m1990_4, partial:m1991_5 +# 1991| m1991_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1991_1 +# 1991| m1991_8(C) = Chi : total:m1991_2, partial:m1991_7 +# 1992| r1992_1(glval<..(*)(..)>) = VariableAddress[pfn] : +# 1992| r1992_2(..(*)(..)) = FunctionAddress[StaticMemberFunction] : +# 1992| m1992_3(..(*)(..)) = Store[pfn] : &:r1992_1, r1992_2 +# 1993| r1993_1(glval) = VariableAddress[c] : +# 1993| r1993_2(..(*)(..)) = FunctionAddress[StaticMemberFunction] : +# 1993| r1993_3(glval<..(*)(..)>) = VariableAddress[pfn] : +# 1993| m1993_4(..(*)(..)) = Store[pfn] : &:r1993_3, r1993_2 +# 1994| v1994_1(void) = NoOp : +# 1990| v1990_5(void) = ReturnVoid : +# 1990| v1990_6(void) = AliasedUse : ~m1991_6 +# 1990| v1990_7(void) = ExitFunction : + +# 1996| void TernaryTestInt(bool, int, int, int) +# 1996| Block 0 +# 1996| v1996_1(void) = EnterFunction : +# 1996| m1996_2(unknown) = AliasedDefinition : +# 1996| m1996_3(unknown) = InitializeNonLocal : +# 1996| m1996_4(unknown) = Chi : total:m1996_2, partial:m1996_3 +# 1996| r1996_5(glval) = VariableAddress[a] : +# 1996| m1996_6(bool) = InitializeParameter[a] : &:r1996_5 +# 1996| r1996_7(glval) = VariableAddress[x] : +# 1996| m1996_8(int) = InitializeParameter[x] : &:r1996_7 +# 1996| r1996_9(glval) = VariableAddress[y] : +# 1996| m1996_10(int) = InitializeParameter[y] : &:r1996_9 +# 1996| r1996_11(glval) = VariableAddress[z] : +# 1996| m1996_12(int) = InitializeParameter[z] : &:r1996_11 +# 1997| r1997_1(glval) = VariableAddress[a] : +# 1997| r1997_2(bool) = Load[a] : &:r1997_1, m1996_6 +# 1997| v1997_3(void) = ConditionalBranch : r1997_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 1997| Block 1 +# 1997| m1997_4(int) = Phi : from 2:m1997_12, from 3:m1997_16 +# 1997| r1997_5(glval) = VariableAddress[#temp1997:9] : +# 1997| r1997_6(int) = Load[#temp1997:9] : &:r1997_5, m1997_4 +# 1997| r1997_7(glval) = VariableAddress[z] : +# 1997| m1997_8(int) = Store[z] : &:r1997_7, r1997_6 +# 1998| r1998_1(glval) = VariableAddress[a] : +# 1998| r1998_2(bool) = Load[a] : &:r1998_1, m1996_6 +# 1998| v1998_3(void) = ConditionalBranch : r1998_2 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 1997| Block 2 +# 1997| r1997_9(glval) = VariableAddress[x] : +# 1997| r1997_10(int) = Load[x] : &:r1997_9, m1996_8 +# 1997| r1997_11(glval) = VariableAddress[#temp1997:9] : +# 1997| m1997_12(int) = Store[#temp1997:9] : &:r1997_11, r1997_10 +#-----| Goto -> Block 1 + +# 1997| Block 3 +# 1997| r1997_13(glval) = VariableAddress[y] : +# 1997| r1997_14(int) = Load[y] : &:r1997_13, m1996_10 +# 1997| r1997_15(glval) = VariableAddress[#temp1997:9] : +# 1997| m1997_16(int) = Store[#temp1997:9] : &:r1997_15, r1997_14 +#-----| Goto -> Block 1 + +# 1998| Block 4 +# 1998| m1998_4(int) = Phi : from 5:m1998_12, from 6:m1998_15 +# 1998| r1998_5(glval) = VariableAddress[#temp1998:9] : +# 1998| r1998_6(int) = Load[#temp1998:9] : &:r1998_5, m1998_4 +# 1998| r1998_7(glval) = VariableAddress[z] : +# 1998| m1998_8(int) = Store[z] : &:r1998_7, r1998_6 +# 1999| r1999_1(glval) = VariableAddress[a] : +# 1999| r1999_2(bool) = Load[a] : &:r1999_1, m1996_6 +# 1999| v1999_3(void) = ConditionalBranch : r1999_2 +#-----| False -> Block 9 +#-----| True -> Block 8 + +# 1998| Block 5 +# 1998| r1998_9(glval) = VariableAddress[x] : +# 1998| r1998_10(int) = Load[x] : &:r1998_9, m1996_8 +# 1998| r1998_11(glval) = VariableAddress[#temp1998:9] : +# 1998| m1998_12(int) = Store[#temp1998:9] : &:r1998_11, r1998_10 +#-----| Goto -> Block 4 + +# 1998| Block 6 +# 1998| r1998_13(int) = Constant[5] : +# 1998| r1998_14(glval) = VariableAddress[#temp1998:9] : +# 1998| m1998_15(int) = Store[#temp1998:9] : &:r1998_14, r1998_13 +#-----| Goto -> Block 4 + +# 1999| Block 7 +# 1999| m1999_4(int) = Phi : from 8:m1999_11, from 9:m1999_14 +# 1999| r1999_5(glval) = VariableAddress[#temp1999:9] : +# 1999| r1999_6(int) = Load[#temp1999:9] : &:r1999_5, m1999_4 +# 1999| r1999_7(glval) = VariableAddress[z] : +# 1999| m1999_8(int) = Store[z] : &:r1999_7, r1999_6 +# 2000| r2000_1(int) = Constant[7] : +# 2000| r2000_2(glval) = VariableAddress[a] : +# 2000| r2000_3(bool) = Load[a] : &:r2000_2, m1996_6 +# 2000| v2000_4(void) = ConditionalBranch : r2000_3 +#-----| False -> Block 12 +#-----| True -> Block 11 + +# 1999| Block 8 +# 1999| r1999_9(int) = Constant[3] : +# 1999| r1999_10(glval) = VariableAddress[#temp1999:9] : +# 1999| m1999_11(int) = Store[#temp1999:9] : &:r1999_10, r1999_9 +#-----| Goto -> Block 7 + +# 1999| Block 9 +# 1999| r1999_12(int) = Constant[5] : +# 1999| r1999_13(glval) = VariableAddress[#temp1999:9] : +# 1999| m1999_14(int) = Store[#temp1999:9] : &:r1999_13, r1999_12 +#-----| Goto -> Block 7 + +# 2000| Block 10 +# 2000| m2000_5(glval) = Phi : from 11:m2000_12, from 12:m2000_15 +# 2000| r2000_6(glval) = VariableAddress[#temp2000:6] : +# 2000| r2000_7(glval) = Load[#temp2000:6] : &:r2000_6, m2000_5 +# 2000| m2000_8(int) = Store[?] : &:r2000_7, r2000_1 +# 2000| m2000_9(unknown) = Chi : total:m1996_4, partial:m2000_8 +# 2001| v2001_1(void) = NoOp : +# 1996| v1996_13(void) = ReturnVoid : +# 1996| v1996_14(void) = AliasedUse : ~m2000_9 +# 1996| v1996_15(void) = ExitFunction : + +# 2000| Block 11 +# 2000| r2000_10(glval) = VariableAddress[x] : +# 2000| r2000_11(glval) = VariableAddress[#temp2000:6] : +# 2000| m2000_12(glval) = Store[#temp2000:6] : &:r2000_11, r2000_10 +#-----| Goto -> Block 10 + +# 2000| Block 12 +# 2000| r2000_13(glval) = VariableAddress[y] : +# 2000| r2000_14(glval) = VariableAddress[#temp2000:6] : +# 2000| m2000_15(glval) = Store[#temp2000:6] : &:r2000_14, r2000_13 +#-----| Goto -> Block 10 + +# 2006| void TernaryTestPodObj(bool, TernaryPodObj, TernaryPodObj, TernaryPodObj) +# 2006| Block 0 +# 2006| v2006_1(void) = EnterFunction : +# 2006| m2006_2(unknown) = AliasedDefinition : +# 2006| m2006_3(unknown) = InitializeNonLocal : +# 2006| m2006_4(unknown) = Chi : total:m2006_2, partial:m2006_3 +# 2006| r2006_5(glval) = VariableAddress[a] : +# 2006| m2006_6(bool) = InitializeParameter[a] : &:r2006_5 +# 2006| r2006_7(glval) = VariableAddress[x] : +# 2006| m2006_8(TernaryPodObj) = InitializeParameter[x] : &:r2006_7 +# 2006| r2006_9(glval) = VariableAddress[y] : +# 2006| m2006_10(TernaryPodObj) = InitializeParameter[y] : &:r2006_9 +# 2006| r2006_11(glval) = VariableAddress[z] : +# 2006| m2006_12(TernaryPodObj) = InitializeParameter[z] : &:r2006_11 +# 2007| r2007_1(glval) = VariableAddress[a] : +# 2007| r2007_2(bool) = Load[a] : &:r2007_1, m2006_6 +# 2007| v2007_3(void) = ConditionalBranch : r2007_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2007| Block 1 +# 2007| m2007_4(TernaryPodObj) = Phi : from 2:m2007_12, from 3:m2007_16 +# 2007| r2007_5(glval) = VariableAddress[#temp2007:9] : +# 2007| r2007_6(TernaryPodObj) = Load[#temp2007:9] : &:r2007_5, m2007_4 +# 2007| r2007_7(glval) = VariableAddress[z] : +# 2007| m2007_8(TernaryPodObj) = Store[z] : &:r2007_7, r2007_6 +# 2008| r2008_1(glval) = VariableAddress[#temp2008:9] : +# 2008| r2008_2(glval) = VariableAddress[a] : +# 2008| r2008_3(bool) = Load[a] : &:r2008_2, m2006_6 +# 2008| v2008_4(void) = ConditionalBranch : r2008_3 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2007| Block 2 +# 2007| r2007_9(glval) = VariableAddress[x] : +# 2007| r2007_10(TernaryPodObj) = Load[x] : &:r2007_9, m2006_8 +# 2007| r2007_11(glval) = VariableAddress[#temp2007:9] : +# 2007| m2007_12(TernaryPodObj) = Store[#temp2007:9] : &:r2007_11, r2007_10 +#-----| Goto -> Block 1 + +# 2007| Block 3 +# 2007| r2007_13(glval) = VariableAddress[y] : +# 2007| r2007_14(TernaryPodObj) = Load[y] : &:r2007_13, m2006_10 +# 2007| r2007_15(glval) = VariableAddress[#temp2007:9] : +# 2007| m2007_16(TernaryPodObj) = Store[#temp2007:9] : &:r2007_15, r2007_14 +#-----| Goto -> Block 1 + +# 2008| Block 4 +# 2008| m2008_5(TernaryPodObj) = Phi : from 5:m2008_18, from 6:m2008_24 +# 2008| r2008_6(glval) = VariableAddress[#temp2008:9] : +# 2008| r2008_7(TernaryPodObj) = Load[#temp2008:9] : &:r2008_6, m2008_5 +# 2008| m2008_8(TernaryPodObj) = Store[#temp2008:9] : &:r2008_1, r2008_7 +# 2008| r2008_9(TernaryPodObj) = Load[#temp2008:9] : &:r2008_1, m2008_8 +# 2008| r2008_10(glval) = VariableAddress[z] : +# 2008| m2008_11(TernaryPodObj) = Store[z] : &:r2008_10, r2008_9 +# 2009| r2009_1(glval) = VariableAddress[#temp2009:9] : +# 2009| r2009_2(glval) = VariableAddress[a] : +# 2009| r2009_3(bool) = Load[a] : &:r2009_2, m2006_6 +# 2009| v2009_4(void) = ConditionalBranch : r2009_3 +#-----| False -> Block 9 +#-----| True -> Block 8 + +# 2008| Block 5 +# 2008| r2008_12(glval) = VariableAddress[#temp2008:13] : +# 2008| r2008_13(glval) = VariableAddress[x] : +# 2008| r2008_14(TernaryPodObj) = Load[x] : &:r2008_13, m2006_8 +# 2008| m2008_15(TernaryPodObj) = Store[#temp2008:13] : &:r2008_12, r2008_14 +# 2008| r2008_16(TernaryPodObj) = Load[#temp2008:13] : &:r2008_12, m2008_15 +# 2008| r2008_17(glval) = VariableAddress[#temp2008:9] : +# 2008| m2008_18(TernaryPodObj) = Store[#temp2008:9] : &:r2008_17, r2008_16 +#-----| Goto -> Block 4 + +# 2008| Block 6 +# 2008| r2008_19(glval) = VariableAddress[#temp2008:17] : +# 2008| r2008_20(TernaryPodObj) = Constant[0] : +# 2008| m2008_21(TernaryPodObj) = Store[#temp2008:17] : &:r2008_19, r2008_20 +# 2008| r2008_22(TernaryPodObj) = Load[#temp2008:17] : &:r2008_19, m2008_21 +# 2008| r2008_23(glval) = VariableAddress[#temp2008:9] : +# 2008| m2008_24(TernaryPodObj) = Store[#temp2008:9] : &:r2008_23, r2008_22 +#-----| Goto -> Block 4 + +# 2009| Block 7 +# 2009| m2009_5(TernaryPodObj) = Phi : from 8:m2009_17, from 9:m2009_23 +# 2009| r2009_6(glval) = VariableAddress[#temp2009:9] : +# 2009| r2009_7(TernaryPodObj) = Load[#temp2009:9] : &:r2009_6, m2009_5 +# 2009| m2009_8(TernaryPodObj) = Store[#temp2009:9] : &:r2009_1, r2009_7 +# 2009| r2009_9(TernaryPodObj) = Load[#temp2009:9] : &:r2009_1, m2009_8 +# 2009| r2009_10(glval) = VariableAddress[z] : +# 2009| m2009_11(TernaryPodObj) = Store[z] : &:r2009_10, r2009_9 +# 2010| r2010_1(glval) = VariableAddress[#temp2010:23] : +# 2010| r2010_2(TernaryPodObj) = Constant[0] : +# 2010| m2010_3(TernaryPodObj) = Store[#temp2010:23] : &:r2010_1, r2010_2 +# 2010| r2010_4(TernaryPodObj) = Load[#temp2010:23] : &:r2010_1, m2010_3 +# 2010| r2010_5(glval) = VariableAddress[a] : +# 2010| r2010_6(bool) = Load[a] : &:r2010_5, m2006_6 +# 2010| v2010_7(void) = ConditionalBranch : r2010_6 +#-----| False -> Block 12 +#-----| True -> Block 11 + +# 2009| Block 8 +# 2009| r2009_12(glval) = VariableAddress[#temp2009:13] : +# 2009| r2009_13(TernaryPodObj) = Constant[0] : +# 2009| m2009_14(TernaryPodObj) = Store[#temp2009:13] : &:r2009_12, r2009_13 +# 2009| r2009_15(TernaryPodObj) = Load[#temp2009:13] : &:r2009_12, m2009_14 +# 2009| r2009_16(glval) = VariableAddress[#temp2009:9] : +# 2009| m2009_17(TernaryPodObj) = Store[#temp2009:9] : &:r2009_16, r2009_15 +#-----| Goto -> Block 7 + +# 2009| Block 9 +# 2009| r2009_18(glval) = VariableAddress[#temp2009:31] : +# 2009| r2009_19(TernaryPodObj) = Constant[0] : +# 2009| m2009_20(TernaryPodObj) = Store[#temp2009:31] : &:r2009_18, r2009_19 +# 2009| r2009_21(TernaryPodObj) = Load[#temp2009:31] : &:r2009_18, m2009_20 +# 2009| r2009_22(glval) = VariableAddress[#temp2009:9] : +# 2009| m2009_23(TernaryPodObj) = Store[#temp2009:9] : &:r2009_22, r2009_21 +#-----| Goto -> Block 7 + +# 2010| Block 10 +# 2010| m2010_8(TernaryPodObj) = Phi : from 11:m2010_18, from 12:m2010_22 +# 2010| r2010_9(glval) = VariableAddress[#temp2010:10] : +# 2010| r2010_10(TernaryPodObj) = Load[#temp2010:10] : &:r2010_9, m2010_8 +# 2010| r2010_11(glval) = VariableAddress[z] : +# 2010| m2010_12(TernaryPodObj) = Store[z] : &:r2010_11, r2010_10 +# 2010| r2010_13(glval) = CopyValue : r2010_11 +# 2010| m2010_14(TernaryPodObj) = Store[?] : &:r2010_13, r2010_4 +# 2011| v2011_1(void) = NoOp : +# 2006| v2006_13(void) = ReturnVoid : +# 2006| v2006_14(void) = AliasedUse : m2006_3 +# 2006| v2006_15(void) = ExitFunction : + +# 2010| Block 11 +# 2010| r2010_15(glval) = VariableAddress[x] : +# 2010| r2010_16(TernaryPodObj) = Load[x] : &:r2010_15, m2006_8 +# 2010| r2010_17(glval) = VariableAddress[#temp2010:10] : +# 2010| m2010_18(TernaryPodObj) = Store[#temp2010:10] : &:r2010_17, r2010_16 +#-----| Goto -> Block 10 + +# 2010| Block 12 +# 2010| r2010_19(glval) = VariableAddress[y] : +# 2010| r2010_20(TernaryPodObj) = Load[y] : &:r2010_19, m2006_10 +# 2010| r2010_21(glval) = VariableAddress[#temp2010:10] : +# 2010| m2010_22(TernaryPodObj) = Store[#temp2010:10] : &:r2010_21, r2010_20 +#-----| Goto -> Block 10 + +# 2013| TernaryNonPodObj& TernaryNonPodObj::operator=(TernaryNonPodObj const&) +# 2013| Block 0 +# 2013| v2013_1(void) = EnterFunction : +# 2013| m2013_2(unknown) = AliasedDefinition : +# 2013| m2013_3(unknown) = InitializeNonLocal : +# 2013| m2013_4(unknown) = Chi : total:m2013_2, partial:m2013_3 +# 2013| r2013_5(glval) = VariableAddress[#this] : +# 2013| m2013_6(glval) = InitializeParameter[#this] : &:r2013_5 +# 2013| r2013_7(glval) = Load[#this] : &:r2013_5, m2013_6 +# 2013| m2013_8(TernaryNonPodObj) = InitializeIndirection[#this] : &:r2013_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(TernaryNonPodObj &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(TernaryNonPodObj &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +#-----| r0_5(glval) = VariableAddress[#return] : +#-----| r0_6(glval) = VariableAddress[#this] : +#-----| r0_7(TernaryNonPodObj *) = Load[#this] : &:r0_6, m2013_6 +#-----| r0_8(glval) = CopyValue : r0_7 +#-----| r0_9(TernaryNonPodObj &) = CopyValue : r0_8 +#-----| m0_10(TernaryNonPodObj &) = Store[#return] : &:r0_5, r0_9 +# 2013| v2013_9(void) = ReturnIndirection[#this] : &:r2013_7, m2013_8 +#-----| v0_11(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 2013| r2013_10(glval) = VariableAddress[#return] : +# 2013| v2013_11(void) = ReturnValue : &:r2013_10, m0_10 +# 2013| v2013_12(void) = AliasedUse : m2013_3 +# 2013| v2013_13(void) = ExitFunction : + +# 2013| void TernaryNonPodObj::TernaryNonPodObj() +# 2013| Block 0 +# 2013| v2013_1(void) = EnterFunction : +# 2013| m2013_2(unknown) = AliasedDefinition : +# 2013| m2013_3(unknown) = InitializeNonLocal : +# 2013| m2013_4(unknown) = Chi : total:m2013_2, partial:m2013_3 +# 2013| r2013_5(glval) = VariableAddress[#this] : +# 2013| m2013_6(glval) = InitializeParameter[#this] : &:r2013_5 +# 2013| r2013_7(glval) = Load[#this] : &:r2013_5, m2013_6 +# 2013| m2013_8(TernaryNonPodObj) = InitializeIndirection[#this] : &:r2013_7 +# 2013| v2013_9(void) = NoOp : +# 2013| v2013_10(void) = ReturnIndirection[#this] : &:r2013_7, m2013_8 +# 2013| v2013_11(void) = ReturnVoid : +# 2013| v2013_12(void) = AliasedUse : m2013_3 +# 2013| v2013_13(void) = ExitFunction : + +# 2013| void TernaryNonPodObj::TernaryNonPodObj(TernaryNonPodObj const&) +# 2013| Block 0 +# 2013| v2013_1(void) = EnterFunction : +# 2013| m2013_2(unknown) = AliasedDefinition : +# 2013| m2013_3(unknown) = InitializeNonLocal : +# 2013| m2013_4(unknown) = Chi : total:m2013_2, partial:m2013_3 +# 2013| r2013_5(glval) = VariableAddress[#this] : +# 2013| m2013_6(glval) = InitializeParameter[#this] : &:r2013_5 +# 2013| r2013_7(glval) = Load[#this] : &:r2013_5, m2013_6 +# 2013| m2013_8(TernaryNonPodObj) = InitializeIndirection[#this] : &:r2013_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(TernaryNonPodObj &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(TernaryNonPodObj &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 2013| v2013_9(void) = NoOp : +# 2013| v2013_10(void) = ReturnIndirection[#this] : &:r2013_7, m2013_8 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 2013| v2013_11(void) = ReturnVoid : +# 2013| v2013_12(void) = AliasedUse : m2013_3 +# 2013| v2013_13(void) = ExitFunction : + +# 2014| void TernaryNonPodObj::~TernaryNonPodObj() +# 2014| Block 0 +# 2014| v2014_1(void) = EnterFunction : +# 2014| m2014_2(unknown) = AliasedDefinition : +# 2014| m2014_3(unknown) = InitializeNonLocal : +# 2014| m2014_4(unknown) = Chi : total:m2014_2, partial:m2014_3 +# 2014| r2014_5(glval) = VariableAddress[#this] : +# 2014| m2014_6(glval) = InitializeParameter[#this] : &:r2014_5 +# 2014| r2014_7(glval) = Load[#this] : &:r2014_5, m2014_6 +# 2014| m2014_8(TernaryNonPodObj) = InitializeIndirection[#this] : &:r2014_7 +# 2014| v2014_9(void) = NoOp : +# 2014| v2014_10(void) = ReturnIndirection[#this] : &:r2014_7, m2014_8 +# 2014| v2014_11(void) = ReturnVoid : +# 2014| v2014_12(void) = AliasedUse : m2014_3 +# 2014| v2014_13(void) = ExitFunction : + +# 2017| void TernaryTestNonPodObj(bool, TernaryNonPodObj, TernaryNonPodObj, TernaryNonPodObj) +# 2017| Block 0 +# 2017| v2017_1(void) = EnterFunction : +# 2017| m2017_2(unknown) = AliasedDefinition : +# 2017| m2017_3(unknown) = InitializeNonLocal : +# 2017| m2017_4(unknown) = Chi : total:m2017_2, partial:m2017_3 +# 2017| r2017_5(glval) = VariableAddress[a] : +# 2017| m2017_6(bool) = InitializeParameter[a] : &:r2017_5 +# 2017| r2017_7(glval) = VariableAddress[x] : +# 2017| m2017_8(TernaryNonPodObj) = InitializeParameter[x] : &:r2017_7 +# 2017| r2017_9(glval) = VariableAddress[y] : +# 2017| m2017_10(TernaryNonPodObj) = InitializeParameter[y] : &:r2017_9 +# 2017| r2017_11(glval) = VariableAddress[z] : +# 2017| m2017_12(TernaryNonPodObj) = InitializeParameter[z] : &:r2017_11 +# 2018| r2018_1(glval) = VariableAddress[z] : +# 2018| r2018_2(glval) = FunctionAddress[operator=] : +# 2018| r2018_3(glval) = VariableAddress[a] : +# 2018| r2018_4(bool) = Load[a] : &:r2018_3, m2017_6 +# 2018| v2018_5(void) = ConditionalBranch : r2018_4 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2018| Block 1 +# 2018| m2018_6(glval) = Phi : from 2:m2018_21, from 3:m2018_24 +# 2018| r2018_7(glval) = VariableAddress[#temp2018:9] : +# 2018| r2018_8(glval) = Load[#temp2018:9] : &:r2018_7, m2018_6 +# 2018| r2018_9(glval) = Convert : r2018_8 +# 2018| r2018_10(TernaryNonPodObj &) = CopyValue : r2018_9 +# 2018| r2018_11(TernaryNonPodObj &) = Call[operator=] : func:r2018_2, this:r2018_1, 0:r2018_10 +# 2018| m2018_12(unknown) = ^CallSideEffect : ~m2017_4 +# 2018| m2018_13(unknown) = Chi : total:m2017_4, partial:m2018_12 +# 2018| v2018_14(void) = ^IndirectReadSideEffect[-1] : &:r2018_1, m2017_12 +# 2018| v2018_15(void) = ^BufferReadSideEffect[0] : &:r2018_10, ~m2018_13 +# 2018| m2018_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2018_1 +# 2018| m2018_17(TernaryNonPodObj) = Chi : total:m2017_12, partial:m2018_16 +# 2018| r2018_18(glval) = CopyValue : r2018_11 +# 2019| r2019_1(glval) = VariableAddress[z] : +# 2019| r2019_2(glval) = FunctionAddress[operator=] : +# 2019| r2019_3(glval) = VariableAddress[#temp2019:9] : +# 2019| r2019_4(glval) = VariableAddress[a] : +# 2019| r2019_5(bool) = Load[a] : &:r2019_4, m2017_6 +# 2019| v2019_6(void) = ConditionalBranch : r2019_5 +#-----| False -> Block 6 +#-----| True -> Block 5 + +# 2018| Block 2 +# 2018| r2018_19(glval) = VariableAddress[x] : +# 2018| r2018_20(glval) = VariableAddress[#temp2018:9] : +# 2018| m2018_21(glval) = Store[#temp2018:9] : &:r2018_20, r2018_19 +#-----| Goto -> Block 1 + +# 2018| Block 3 +# 2018| r2018_22(glval) = VariableAddress[y] : +# 2018| r2018_23(glval) = VariableAddress[#temp2018:9] : +# 2018| m2018_24(glval) = Store[#temp2018:9] : &:r2018_23, r2018_22 +#-----| Goto -> Block 1 + +# 2019| Block 4 +# 2019| m2019_7(unknown) = Phi : from 5:~m2019_30, from 6:~m2019_42 +# 2019| m2019_8(TernaryNonPodObj) = Phi : from 5:m2019_36, from 6:m2019_47 +# 2019| r2019_9(glval) = VariableAddress[#temp2019:9] : +# 2019| r2019_10(TernaryNonPodObj) = Load[#temp2019:9] : &:r2019_9, m2019_8 +# 2019| m2019_11(TernaryNonPodObj) = Store[#temp2019:9] : &:r2019_3, r2019_10 +# 2019| r2019_12(glval) = Convert : r2019_3 +# 2019| r2019_13(TernaryNonPodObj &) = CopyValue : r2019_12 +# 2019| r2019_14(TernaryNonPodObj &) = Call[operator=] : func:r2019_2, this:r2019_1, 0:r2019_13 +# 2019| m2019_15(unknown) = ^CallSideEffect : ~m2019_7 +# 2019| m2019_16(unknown) = Chi : total:m2019_7, partial:m2019_15 +# 2019| v2019_17(void) = ^IndirectReadSideEffect[-1] : &:r2019_1, m2018_17 +# 2019| v2019_18(void) = ^BufferReadSideEffect[0] : &:r2019_13, ~m2019_11 +# 2019| m2019_19(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2019_1 +# 2019| m2019_20(TernaryNonPodObj) = Chi : total:m2018_17, partial:m2019_19 +# 2019| r2019_21(glval) = CopyValue : r2019_14 +# 2020| r2020_1(glval) = VariableAddress[z] : +# 2020| r2020_2(glval) = FunctionAddress[operator=] : +# 2020| r2020_3(glval) = VariableAddress[#temp2020:9] : +# 2020| r2020_4(glval) = VariableAddress[a] : +# 2020| r2020_5(bool) = Load[a] : &:r2020_4, m2017_6 +# 2020| v2020_6(void) = ConditionalBranch : r2020_5 +#-----| False -> Block 9 +#-----| True -> Block 8 + +# 2019| Block 5 +# 2019| r2019_22(glval) = VariableAddress[#temp2019:13] : +# 2019| m2019_23(TernaryNonPodObj) = Uninitialized[#temp2019:13] : &:r2019_22 +# 2019| r2019_24(glval) = FunctionAddress[TernaryNonPodObj] : +# 2019| r2019_25(glval) = VariableAddress[x] : +# 2019| r2019_26(glval) = Convert : r2019_25 +# 2019| r2019_27(TernaryNonPodObj &) = CopyValue : r2019_26 +# 2019| v2019_28(void) = Call[TernaryNonPodObj] : func:r2019_24, this:r2019_22, 0:r2019_27 +# 2019| m2019_29(unknown) = ^CallSideEffect : ~m2018_13 +# 2019| m2019_30(unknown) = Chi : total:m2018_13, partial:m2019_29 +# 2019| v2019_31(void) = ^BufferReadSideEffect[0] : &:r2019_27, ~m2017_8 +# 2019| m2019_32(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2019_22 +# 2019| m2019_33(TernaryNonPodObj) = Chi : total:m2019_23, partial:m2019_32 +# 2019| r2019_34(TernaryNonPodObj) = Load[#temp2019:13] : &:r2019_22, m2019_33 +# 2019| r2019_35(glval) = VariableAddress[#temp2019:9] : +# 2019| m2019_36(TernaryNonPodObj) = Store[#temp2019:9] : &:r2019_35, r2019_34 +#-----| Goto -> Block 4 + +# 2019| Block 6 +# 2019| r2019_37(glval) = VariableAddress[#temp2019:17] : +# 2019| m2019_38(TernaryNonPodObj) = Uninitialized[#temp2019:17] : &:r2019_37 +# 2019| r2019_39(glval) = FunctionAddress[TernaryNonPodObj] : +# 2019| v2019_40(void) = Call[TernaryNonPodObj] : func:r2019_39, this:r2019_37 +# 2019| m2019_41(unknown) = ^CallSideEffect : ~m2018_13 +# 2019| m2019_42(unknown) = Chi : total:m2018_13, partial:m2019_41 +# 2019| m2019_43(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2019_37 +# 2019| m2019_44(TernaryNonPodObj) = Chi : total:m2019_38, partial:m2019_43 +# 2019| r2019_45(TernaryNonPodObj) = Load[#temp2019:17] : &:r2019_37, m2019_44 +# 2019| r2019_46(glval) = VariableAddress[#temp2019:9] : +# 2019| m2019_47(TernaryNonPodObj) = Store[#temp2019:9] : &:r2019_46, r2019_45 +#-----| Goto -> Block 4 + +# 2020| Block 7 +# 2020| m2020_7(unknown) = Phi : from 8:~m2020_27, from 9:~m2020_38 +# 2020| m2020_8(TernaryNonPodObj) = Phi : from 8:m2020_32, from 9:m2020_43 +# 2020| r2020_9(glval) = VariableAddress[#temp2020:9] : +# 2020| r2020_10(TernaryNonPodObj) = Load[#temp2020:9] : &:r2020_9, m2020_8 +# 2020| m2020_11(TernaryNonPodObj) = Store[#temp2020:9] : &:r2020_3, r2020_10 +# 2020| r2020_12(glval) = Convert : r2020_3 +# 2020| r2020_13(TernaryNonPodObj &) = CopyValue : r2020_12 +# 2020| r2020_14(TernaryNonPodObj &) = Call[operator=] : func:r2020_2, this:r2020_1, 0:r2020_13 +# 2020| m2020_15(unknown) = ^CallSideEffect : ~m2020_7 +# 2020| m2020_16(unknown) = Chi : total:m2020_7, partial:m2020_15 +# 2020| v2020_17(void) = ^IndirectReadSideEffect[-1] : &:r2020_1, m2019_20 +# 2020| v2020_18(void) = ^BufferReadSideEffect[0] : &:r2020_13, ~m2020_11 +# 2020| m2020_19(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2020_1 +# 2020| m2020_20(TernaryNonPodObj) = Chi : total:m2019_20, partial:m2020_19 +# 2020| r2020_21(glval) = CopyValue : r2020_14 +# 2021| r2021_1(glval) = VariableAddress[z] : +# 2021| r2021_2(glval) = FunctionAddress[operator=] : +# 2021| r2021_3(glval) = VariableAddress[a] : +# 2021| r2021_4(bool) = Load[a] : &:r2021_3, m2017_6 +# 2021| v2021_5(void) = ConditionalBranch : r2021_4 +#-----| False -> Block 12 +#-----| True -> Block 11 + +# 2020| Block 8 +# 2020| r2020_22(glval) = VariableAddress[#temp2020:13] : +# 2020| m2020_23(TernaryNonPodObj) = Uninitialized[#temp2020:13] : &:r2020_22 +# 2020| r2020_24(glval) = FunctionAddress[TernaryNonPodObj] : +# 2020| v2020_25(void) = Call[TernaryNonPodObj] : func:r2020_24, this:r2020_22 +# 2020| m2020_26(unknown) = ^CallSideEffect : ~m2019_16 +# 2020| m2020_27(unknown) = Chi : total:m2019_16, partial:m2020_26 +# 2020| m2020_28(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2020_22 +# 2020| m2020_29(TernaryNonPodObj) = Chi : total:m2020_23, partial:m2020_28 +# 2020| r2020_30(TernaryNonPodObj) = Load[#temp2020:13] : &:r2020_22, m2020_29 +# 2020| r2020_31(glval) = VariableAddress[#temp2020:9] : +# 2020| m2020_32(TernaryNonPodObj) = Store[#temp2020:9] : &:r2020_31, r2020_30 +#-----| Goto -> Block 7 + +# 2020| Block 9 +# 2020| r2020_33(glval) = VariableAddress[#temp2020:34] : +# 2020| m2020_34(TernaryNonPodObj) = Uninitialized[#temp2020:34] : &:r2020_33 +# 2020| r2020_35(glval) = FunctionAddress[TernaryNonPodObj] : +# 2020| v2020_36(void) = Call[TernaryNonPodObj] : func:r2020_35, this:r2020_33 +# 2020| m2020_37(unknown) = ^CallSideEffect : ~m2019_16 +# 2020| m2020_38(unknown) = Chi : total:m2019_16, partial:m2020_37 +# 2020| m2020_39(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2020_33 +# 2020| m2020_40(TernaryNonPodObj) = Chi : total:m2020_34, partial:m2020_39 +# 2020| r2020_41(TernaryNonPodObj) = Load[#temp2020:34] : &:r2020_33, m2020_40 +# 2020| r2020_42(glval) = VariableAddress[#temp2020:9] : +# 2020| m2020_43(TernaryNonPodObj) = Store[#temp2020:9] : &:r2020_42, r2020_41 +#-----| Goto -> Block 7 + +# 2021| Block 10 +# 2021| m2021_6(glval) = Phi : from 11:m2021_40, from 12:m2021_43 +# 2021| r2021_7(glval) = VariableAddress[#temp2021:10] : +# 2021| r2021_8(glval) = Load[#temp2021:10] : &:r2021_7, m2021_6 +# 2021| r2021_9(glval) = Convert : r2021_8 +# 2021| r2021_10(TernaryNonPodObj &) = CopyValue : r2021_9 +# 2021| r2021_11(TernaryNonPodObj &) = Call[operator=] : func:r2021_2, this:r2021_1, 0:r2021_10 +# 2021| m2021_12(unknown) = ^CallSideEffect : ~m2020_16 +# 2021| m2021_13(unknown) = Chi : total:m2020_16, partial:m2021_12 +# 2021| v2021_14(void) = ^IndirectReadSideEffect[-1] : &:r2021_1, m2020_20 +# 2021| v2021_15(void) = ^BufferReadSideEffect[0] : &:r2021_10, ~m2021_13 +# 2021| m2021_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2021_1 +# 2021| m2021_17(TernaryNonPodObj) = Chi : total:m2020_20, partial:m2021_16 +# 2021| r2021_18(glval) = CopyValue : r2021_11 +# 2021| r2021_19(glval) = FunctionAddress[operator=] : +# 2021| r2021_20(glval) = VariableAddress[#temp2021:23] : +# 2021| m2021_21(TernaryNonPodObj) = Uninitialized[#temp2021:23] : &:r2021_20 +# 2021| r2021_22(glval) = FunctionAddress[TernaryNonPodObj] : +# 2021| v2021_23(void) = Call[TernaryNonPodObj] : func:r2021_22, this:r2021_20 +# 2021| m2021_24(unknown) = ^CallSideEffect : ~m2021_13 +# 2021| m2021_25(unknown) = Chi : total:m2021_13, partial:m2021_24 +# 2021| m2021_26(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2021_20 +# 2021| m2021_27(TernaryNonPodObj) = Chi : total:m2021_21, partial:m2021_26 +# 2021| r2021_28(glval) = Convert : r2021_20 +# 2021| r2021_29(TernaryNonPodObj &) = CopyValue : r2021_28 +# 2021| r2021_30(TernaryNonPodObj &) = Call[operator=] : func:r2021_19, this:r2021_18, 0:r2021_29 +# 2021| m2021_31(unknown) = ^CallSideEffect : ~m2021_25 +# 2021| m2021_32(unknown) = Chi : total:m2021_25, partial:m2021_31 +# 2021| v2021_33(void) = ^IndirectReadSideEffect[-1] : &:r2021_18, m2021_17 +# 2021| v2021_34(void) = ^BufferReadSideEffect[0] : &:r2021_29, ~m2021_27 +# 2021| m2021_35(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2021_18 +# 2021| m2021_36(TernaryNonPodObj) = Chi : total:m2021_17, partial:m2021_35 +# 2021| r2021_37(glval) = CopyValue : r2021_30 +# 2022| v2022_1(void) = NoOp : +# 2017| v2017_13(void) = ReturnVoid : +# 2017| v2017_14(void) = AliasedUse : ~m2021_32 +# 2017| v2017_15(void) = ExitFunction : + +# 2021| Block 11 +# 2021| r2021_38(glval) = VariableAddress[x] : +# 2021| r2021_39(glval) = VariableAddress[#temp2021:10] : +# 2021| m2021_40(glval) = Store[#temp2021:10] : &:r2021_39, r2021_38 +#-----| Goto -> Block 10 + +# 2021| Block 12 +# 2021| r2021_41(glval) = VariableAddress[y] : +# 2021| r2021_42(glval) = VariableAddress[#temp2021:10] : +# 2021| m2021_43(glval) = Store[#temp2021:10] : &:r2021_42, r2021_41 +#-----| Goto -> Block 10 + +# 2026| unsigned int CommaTest(unsigned int) +# 2026| Block 0 +# 2026| v2026_1(void) = EnterFunction : +# 2026| m2026_2(unknown) = AliasedDefinition : +# 2026| m2026_3(unknown) = InitializeNonLocal : +# 2026| m2026_4(unknown) = Chi : total:m2026_2, partial:m2026_3 +# 2026| r2026_5(glval) = VariableAddress[x] : +# 2026| m2026_6(unsigned int) = InitializeParameter[x] : &:r2026_5 +# 2027| r2027_1(glval) = VariableAddress[y] : +# 2027| m2027_2(unsigned int) = Uninitialized[y] : &:r2027_1 +# 2028| r2028_1(glval) = VariableAddress[x] : +# 2028| r2028_2(unsigned int) = Load[x] : &:r2028_1, m2026_6 +# 2028| r2028_3(unsigned int) = Constant[100] : +# 2028| r2028_4(bool) = CompareLT : r2028_2, r2028_3 +# 2028| v2028_5(void) = ConditionalBranch : r2028_4 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2028| Block 1 +# 2028| m2028_6(unknown) = Phi : from 2:~m2029_6, from 3:~m2030_6 +# 2028| m2028_7(unsigned int) = Phi : from 2:m2028_13, from 3:m2028_15 +# 2028| r2028_8(glval) = VariableAddress[#temp2028:7] : +# 2028| r2028_9(unsigned int) = Load[#temp2028:7] : &:r2028_8, m2028_7 +# 2028| r2028_10(glval) = VariableAddress[y] : +# 2028| m2028_11(unsigned int) = Store[y] : &:r2028_10, r2028_9 +# 2031| r2031_1(glval) = VariableAddress[#return] : +# 2031| m2031_2(unsigned int) = Uninitialized[#return] : &:r2031_1 +# 2026| r2026_7(glval) = VariableAddress[#return] : +# 2026| v2026_8(void) = ReturnValue : &:r2026_7, m2031_2 +# 2026| v2026_9(void) = AliasedUse : ~m2028_6 +# 2026| v2026_10(void) = ExitFunction : + +# 2029| Block 2 +# 2029| r2029_1(glval) = FunctionAddress[CommaTestHelper] : +# 2029| r2029_2(glval) = VariableAddress[x] : +# 2029| r2029_3(unsigned int) = Load[x] : &:r2029_2, m2026_6 +# 2029| v2029_4(void) = Call[CommaTestHelper] : func:r2029_1, 0:r2029_3 +# 2029| m2029_5(unknown) = ^CallSideEffect : ~m2026_4 +# 2029| m2029_6(unknown) = Chi : total:m2026_4, partial:m2029_5 +# 2029| r2029_7(glval) = VariableAddress[x] : +# 2029| r2029_8(unsigned int) = Load[x] : &:r2029_7, m2026_6 +# 2029| r2029_9(unsigned int) = CopyValue : r2029_8 +# 2028| r2028_12(glval) = VariableAddress[#temp2028:7] : +# 2028| m2028_13(unsigned int) = Store[#temp2028:7] : &:r2028_12, r2029_9 +#-----| Goto -> Block 1 + +# 2030| Block 3 +# 2030| r2030_1(glval) = FunctionAddress[CommaTestHelper] : +# 2030| r2030_2(glval) = VariableAddress[x] : +# 2030| r2030_3(unsigned int) = Load[x] : &:r2030_2, m2026_6 +# 2030| v2030_4(void) = Call[CommaTestHelper] : func:r2030_1, 0:r2030_3 +# 2030| m2030_5(unknown) = ^CallSideEffect : ~m2026_4 +# 2030| m2030_6(unknown) = Chi : total:m2026_4, partial:m2030_5 +# 2030| r2030_7(int) = Constant[10] : +# 2030| r2030_8(int) = CopyValue : r2030_7 +# 2030| r2030_9(unsigned int) = Convert : r2030_8 +# 2028| r2028_14(glval) = VariableAddress[#temp2028:7] : +# 2028| m2028_15(unsigned int) = Store[#temp2028:7] : &:r2028_14, r2030_9 +#-----| Goto -> Block 1 + +# 2033| void NewDeleteMem() +# 2033| Block 0 +# 2033| v2033_1(void) = EnterFunction : +# 2033| m2033_2(unknown) = AliasedDefinition : +# 2033| m2033_3(unknown) = InitializeNonLocal : +# 2033| m2033_4(unknown) = Chi : total:m2033_2, partial:m2033_3 +# 2034| r2034_1(glval) = VariableAddress[x] : +# 2034| r2034_2(glval) = FunctionAddress[operator new] : +# 2034| r2034_3(unsigned long) = Constant[4] : +# 2034| r2034_4(void *) = Call[operator new] : func:r2034_2, 0:r2034_3 +# 2034| m2034_5(unknown) = ^CallSideEffect : ~m2033_4 +# 2034| m2034_6(unknown) = Chi : total:m2033_4, partial:m2034_5 +# 2034| m2034_7(unknown) = ^InitializeDynamicAllocation : &:r2034_4 +# 2034| r2034_8(int *) = Convert : r2034_4 +# 2034| m2034_9(int *) = Store[x] : &:r2034_1, r2034_8 +# 2035| r2035_1(int) = Constant[6] : +# 2035| r2035_2(glval) = VariableAddress[x] : +# 2035| r2035_3(int *) = Load[x] : &:r2035_2, m2034_9 +# 2035| r2035_4(glval) = CopyValue : r2035_3 +# 2035| m2035_5(int) = Store[?] : &:r2035_4, r2035_1 +# 2035| m2035_6(unknown) = Chi : total:m2034_7, partial:m2035_5 +# 2036| r2036_1(glval) = FunctionAddress[operator delete] : +# 2036| r2036_2(glval) = VariableAddress[x] : +# 2036| r2036_3(int *) = Load[x] : &:r2036_2, m2034_9 +# 2036| v2036_4(void) = Call[operator delete] : func:r2036_1, 0:r2036_3 +# 2036| m2036_5(unknown) = ^CallSideEffect : ~m2034_6 +# 2036| m2036_6(unknown) = Chi : total:m2034_6, partial:m2036_5 +# 2037| v2037_1(void) = NoOp : +# 2033| v2033_5(void) = ReturnVoid : +# 2033| v2033_6(void) = AliasedUse : ~m2036_6 +# 2033| v2033_7(void) = ExitFunction : + +# 2039| void Base2::Base2() +# 2039| Block 0 +# 2039| v2039_1(void) = EnterFunction : +# 2039| m2039_2(unknown) = AliasedDefinition : +# 2039| m2039_3(unknown) = InitializeNonLocal : +# 2039| m2039_4(unknown) = Chi : total:m2039_2, partial:m2039_3 +# 2039| r2039_5(glval) = VariableAddress[#this] : +# 2039| m2039_6(glval) = InitializeParameter[#this] : &:r2039_5 +# 2039| r2039_7(glval) = Load[#this] : &:r2039_5, m2039_6 +# 2039| m2039_8(Base2) = InitializeIndirection[#this] : &:r2039_7 +# 2039| v2039_9(void) = NoOp : +# 2039| v2039_10(void) = ReturnIndirection[#this] : &:r2039_7, m2039_8 +# 2039| v2039_11(void) = ReturnVoid : +# 2039| v2039_12(void) = AliasedUse : m2039_3 +# 2039| v2039_13(void) = ExitFunction : + +# 2041| void Base2::operator delete(void*) +# 2041| Block 0 +# 2041| v2041_1(void) = EnterFunction : +# 2041| m2041_2(unknown) = AliasedDefinition : +# 2041| m2041_3(unknown) = InitializeNonLocal : +# 2041| m2041_4(unknown) = Chi : total:m2041_2, partial:m2041_3 +# 2041| r2041_5(glval) = VariableAddress[p] : +# 2041| m2041_6(void *) = InitializeParameter[p] : &:r2041_5 +# 2041| r2041_7(void *) = Load[p] : &:r2041_5, m2041_6 +# 2041| m2041_8(unknown) = InitializeIndirection[p] : &:r2041_7 +# 2042| v2042_1(void) = NoOp : +# 2041| v2041_9(void) = ReturnIndirection[p] : &:r2041_7, m2041_8 +# 2041| v2041_10(void) = ReturnVoid : +# 2041| v2041_11(void) = AliasedUse : m2041_3 +# 2041| v2041_12(void) = ExitFunction : + +# 2043| void Base2::~Base2() +# 2043| Block 0 +# 2043| v2043_1(void) = EnterFunction : +# 2043| m2043_2(unknown) = AliasedDefinition : +# 2043| m2043_3(unknown) = InitializeNonLocal : +# 2043| m2043_4(unknown) = Chi : total:m2043_2, partial:m2043_3 +# 2043| r2043_5(glval) = VariableAddress[#this] : +# 2043| m2043_6(glval) = InitializeParameter[#this] : &:r2043_5 +# 2043| r2043_7(glval) = Load[#this] : &:r2043_5, m2043_6 +# 2043| m2043_8(Base2) = InitializeIndirection[#this] : &:r2043_7 +# 2043| v2043_9(void) = NoOp : +# 2043| v2043_10(void) = ReturnIndirection[#this] : &:r2043_7, m2043_8 +# 2043| v2043_11(void) = ReturnVoid : +# 2043| v2043_12(void) = AliasedUse : m2043_3 +# 2043| v2043_13(void) = ExitFunction : + +# 2046| void Derived2::Derived2() +# 2046| Block 0 +# 2046| v2046_1(void) = EnterFunction : +# 2046| m2046_2(unknown) = AliasedDefinition : +# 2046| m2046_3(unknown) = InitializeNonLocal : +# 2046| m2046_4(unknown) = Chi : total:m2046_2, partial:m2046_3 +# 2046| r2046_5(glval) = VariableAddress[#this] : +# 2046| m2046_6(glval) = InitializeParameter[#this] : &:r2046_5 +# 2046| r2046_7(glval) = Load[#this] : &:r2046_5, m2046_6 +# 2046| m2046_8(Derived2) = InitializeIndirection[#this] : &:r2046_7 +# 2046| r2046_9(glval) = ConvertToNonVirtualBase[Derived2 : Base2] : m2046_6 +# 2046| r2046_10(glval) = FunctionAddress[Base2] : +# 2046| v2046_11(void) = Call[Base2] : func:r2046_10, this:r2046_9 +# 2046| m2046_12(unknown) = ^CallSideEffect : ~m2046_4 +# 2046| m2046_13(unknown) = Chi : total:m2046_4, partial:m2046_12 +# 2046| m2046_14(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2046_9 +# 2046| m2046_15(unknown) = Chi : total:m2046_8, partial:m2046_14 +# 2046| v2046_16(void) = NoOp : +# 2046| v2046_17(void) = ReturnIndirection[#this] : &:r2046_7, m2046_15 +# 2046| v2046_18(void) = ReturnVoid : +# 2046| v2046_19(void) = AliasedUse : ~m2046_13 +# 2046| v2046_20(void) = ExitFunction : + +# 2049| void Derived2::~Derived2() +# 2049| Block 0 +# 2049| v2049_1(void) = EnterFunction : +# 2049| m2049_2(unknown) = AliasedDefinition : +# 2049| m2049_3(unknown) = InitializeNonLocal : +# 2049| m2049_4(unknown) = Chi : total:m2049_2, partial:m2049_3 +# 2049| r2049_5(glval) = VariableAddress[#this] : +# 2049| m2049_6(glval) = InitializeParameter[#this] : &:r2049_5 +# 2049| r2049_7(glval) = Load[#this] : &:r2049_5, m2049_6 +# 2049| m2049_8(Derived2) = InitializeIndirection[#this] : &:r2049_7 +# 2049| v2049_9(void) = NoOp : +# 2049| r2049_10(glval) = ConvertToNonVirtualBase[Derived2 : Base2] : m2049_6 +# 2049| r2049_11(glval) = FunctionAddress[~Base2] : +# 2049| v2049_12(void) = Call[~Base2] : func:r2049_11, this:r2049_10 +# 2049| m2049_13(unknown) = ^CallSideEffect : ~m2049_4 +# 2049| m2049_14(unknown) = Chi : total:m2049_4, partial:m2049_13 +# 2049| v2049_15(void) = ReturnIndirection[#this] : &:r2049_7, m2049_8 +# 2049| v2049_16(void) = ReturnVoid : +# 2049| v2049_17(void) = AliasedUse : ~m2049_14 +# 2049| v2049_18(void) = ExitFunction : + +# 2051| void Derived2::operator delete(void*) +# 2051| Block 0 +# 2051| v2051_1(void) = EnterFunction : +# 2051| m2051_2(unknown) = AliasedDefinition : +# 2051| m2051_3(unknown) = InitializeNonLocal : +# 2051| m2051_4(unknown) = Chi : total:m2051_2, partial:m2051_3 +# 2051| r2051_5(glval) = VariableAddress[p] : +# 2051| m2051_6(void *) = InitializeParameter[p] : &:r2051_5 +# 2051| r2051_7(void *) = Load[p] : &:r2051_5, m2051_6 +# 2051| m2051_8(unknown) = InitializeIndirection[p] : &:r2051_7 +# 2052| v2052_1(void) = NoOp : +# 2051| v2051_9(void) = ReturnIndirection[p] : &:r2051_7, m2051_8 +# 2051| v2051_10(void) = ReturnVoid : +# 2051| v2051_11(void) = AliasedUse : m2051_3 +# 2051| v2051_12(void) = ExitFunction : + +# 2056| int virtual_delete() +# 2056| Block 0 +# 2056| v2056_1(void) = EnterFunction : +# 2056| m2056_2(unknown) = AliasedDefinition : +# 2056| m2056_3(unknown) = InitializeNonLocal : +# 2056| m2056_4(unknown) = Chi : total:m2056_2, partial:m2056_3 +# 2058| r2058_1(glval) = VariableAddress[b1] : +# 2058| r2058_2(glval) = FunctionAddress[operator new] : +# 2058| r2058_3(unsigned long) = Constant[8] : +# 2058| r2058_4(void *) = Call[operator new] : func:r2058_2, 0:r2058_3 +# 2058| m2058_5(unknown) = ^CallSideEffect : ~m2056_4 +# 2058| m2058_6(unknown) = Chi : total:m2056_4, partial:m2058_5 +# 2058| m2058_7(unknown) = ^InitializeDynamicAllocation : &:r2058_4 +# 2058| r2058_8(Base2 *) = Convert : r2058_4 +# 2058| r2058_9(glval) = FunctionAddress[Base2] : +# 2058| v2058_10(void) = Call[Base2] : func:r2058_9, this:r2058_8 +# 2058| m2058_11(unknown) = ^CallSideEffect : ~m2058_6 +# 2058| m2058_12(unknown) = Chi : total:m2058_6, partial:m2058_11 +# 2058| m2058_13(Base2) = ^IndirectMayWriteSideEffect[-1] : &:r2058_8 +# 2058| m2058_14(unknown) = Chi : total:m2058_7, partial:m2058_13 +# 2058| m2058_15(Base2 *) = Store[b1] : &:r2058_1, r2058_8 +# 2059| r2059_1(glval) = VirtualDeleteFunctionAddress : +# 2059| r2059_2(glval) = VariableAddress[b1] : +# 2059| r2059_3(Base2 *) = Load[b1] : &:r2059_2, m2058_15 +# 2059| v2059_4(void) = Call[?] : func:r2059_1, 0:r2059_3 +# 2059| m2059_5(unknown) = ^CallSideEffect : ~m2058_12 +# 2059| m2059_6(unknown) = Chi : total:m2058_12, partial:m2059_5 +# 2061| r2061_1(glval) = VariableAddress[b2] : +# 2061| r2061_2(glval) = FunctionAddress[operator new] : +# 2061| r2061_3(unsigned long) = Constant[16] : +# 2061| r2061_4(void *) = Call[operator new] : func:r2061_2, 0:r2061_3 +# 2061| m2061_5(unknown) = ^CallSideEffect : ~m2059_6 +# 2061| m2061_6(unknown) = Chi : total:m2059_6, partial:m2061_5 +# 2061| m2061_7(unknown) = ^InitializeDynamicAllocation : &:r2061_4 +# 2061| r2061_8(Derived2 *) = Convert : r2061_4 +# 2061| r2061_9(glval) = FunctionAddress[Derived2] : +# 2061| v2061_10(void) = Call[Derived2] : func:r2061_9, this:r2061_8 +# 2061| m2061_11(unknown) = ^CallSideEffect : ~m2061_6 +# 2061| m2061_12(unknown) = Chi : total:m2061_6, partial:m2061_11 +# 2061| m2061_13(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2061_8 +# 2061| m2061_14(unknown) = Chi : total:m2061_7, partial:m2061_13 +# 2061| r2061_15(Base2 *) = ConvertToNonVirtualBase[Derived2 : Base2] : r2061_8 +# 2061| m2061_16(Base2 *) = Store[b2] : &:r2061_1, r2061_15 +# 2062| r2062_1(glval) = VirtualDeleteFunctionAddress : +# 2062| r2062_2(glval) = VariableAddress[b2] : +# 2062| r2062_3(Base2 *) = Load[b2] : &:r2062_2, m2061_16 +# 2062| v2062_4(void) = Call[?] : func:r2062_1, 0:r2062_3 +# 2062| m2062_5(unknown) = ^CallSideEffect : ~m2061_12 +# 2062| m2062_6(unknown) = Chi : total:m2061_12, partial:m2062_5 +# 2064| r2064_1(glval) = VariableAddress[d] : +# 2064| r2064_2(glval) = FunctionAddress[operator new] : +# 2064| r2064_3(unsigned long) = Constant[16] : +# 2064| r2064_4(void *) = Call[operator new] : func:r2064_2, 0:r2064_3 +# 2064| m2064_5(unknown) = ^CallSideEffect : ~m2062_6 +# 2064| m2064_6(unknown) = Chi : total:m2062_6, partial:m2064_5 +# 2064| m2064_7(unknown) = ^InitializeDynamicAllocation : &:r2064_4 +# 2064| r2064_8(Derived2 *) = Convert : r2064_4 +# 2064| r2064_9(glval) = FunctionAddress[Derived2] : +# 2064| v2064_10(void) = Call[Derived2] : func:r2064_9, this:r2064_8 +# 2064| m2064_11(unknown) = ^CallSideEffect : ~m2064_6 +# 2064| m2064_12(unknown) = Chi : total:m2064_6, partial:m2064_11 +# 2064| m2064_13(Derived2) = ^IndirectMayWriteSideEffect[-1] : &:r2064_8 +# 2064| m2064_14(unknown) = Chi : total:m2064_7, partial:m2064_13 +# 2064| m2064_15(Derived2 *) = Store[d] : &:r2064_1, r2064_8 +# 2065| r2065_1(glval) = VirtualDeleteFunctionAddress : +# 2065| r2065_2(glval) = VariableAddress[d] : +# 2065| r2065_3(Derived2 *) = Load[d] : &:r2065_2, m2064_15 +# 2065| v2065_4(void) = Call[?] : func:r2065_1, 0:r2065_3 +# 2065| m2065_5(unknown) = ^CallSideEffect : ~m2064_12 +# 2065| m2065_6(unknown) = Chi : total:m2064_12, partial:m2065_5 +# 2066| r2066_1(glval) = VariableAddress[#return] : +# 2066| m2066_2(int) = Uninitialized[#return] : &:r2066_1 +# 2056| r2056_5(glval) = VariableAddress[#return] : +# 2056| v2056_6(void) = ReturnValue : &:r2056_5, m2066_2 +# 2056| v2056_7(void) = AliasedUse : ~m2065_6 +# 2056| v2056_8(void) = ExitFunction : + +# 2070| void test_constant_folding() +# 2070| Block 0 +# 2070| v2070_1(void) = EnterFunction : +# 2070| m2070_2(unknown) = AliasedDefinition : +# 2070| m2070_3(unknown) = InitializeNonLocal : +# 2070| m2070_4(unknown) = Chi : total:m2070_2, partial:m2070_3 +# 2071| r2071_1(glval) = VariableAddress[x] : +# 2071| r2071_2(int) = Constant[116] : +# 2071| m2071_3(int) = Store[x] : &:r2071_1, r2071_2 +# 2072| r2072_1(glval) = FunctionAddress[test_constant_folding_use] : +# 2072| r2072_2(int) = Constant[116] : +# 2072| v2072_3(void) = Call[test_constant_folding_use] : func:r2072_1, 0:r2072_2 +# 2072| m2072_4(unknown) = ^CallSideEffect : ~m2070_4 +# 2072| m2072_5(unknown) = Chi : total:m2070_4, partial:m2072_4 +# 2073| v2073_1(void) = NoOp : +# 2070| v2070_5(void) = ReturnVoid : +# 2070| v2070_6(void) = AliasedUse : ~m2072_5 +# 2070| v2070_7(void) = ExitFunction : + +# 2077| int NonExit() +# 2077| Block 0 +# 2077| v2077_1(void) = EnterFunction : +# 2077| m2077_2(unknown) = AliasedDefinition : +# 2077| m2077_3(unknown) = InitializeNonLocal : +# 2077| m2077_4(unknown) = Chi : total:m2077_2, partial:m2077_3 +# 2078| r2078_1(glval) = VariableAddress[x] : +# 2078| r2078_2(glval) = FunctionAddress[Add] : +# 2078| r2078_3(int) = Constant[3] : +# 2078| r2078_4(int) = Constant[4] : +# 2078| r2078_5(int) = Call[Add] : func:r2078_2, 0:r2078_3, 1:r2078_4 +# 2078| m2078_6(unknown) = ^CallSideEffect : ~m2077_4 +# 2078| m2078_7(unknown) = Chi : total:m2077_4, partial:m2078_6 +# 2078| m2078_8(int) = Store[x] : &:r2078_1, r2078_5 +# 2079| r2079_1(glval) = VariableAddress[x] : +# 2079| r2079_2(int) = Load[x] : &:r2079_1, m2078_8 +# 2079| r2079_3(int) = Constant[7] : +# 2079| r2079_4(bool) = CompareEQ : r2079_2, r2079_3 +# 2079| v2079_5(void) = ConditionalBranch : r2079_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2080| Block 1 +# 2080| r2080_1(glval) = FunctionAddress[exit] : +# 2080| r2080_2(int) = Constant[3] : +# 2080| v2080_3(void) = Call[exit] : func:r2080_1, 0:r2080_2 +# 2080| m2080_4(unknown) = ^CallSideEffect : ~m2078_7 +# 2080| m2080_5(unknown) = Chi : total:m2078_7, partial:m2080_4 +# 2077| v2077_5(void) = Unreached : + +# 2081| Block 2 +# 2081| r2081_1(glval) = FunctionAddress[VoidFunc] : +# 2081| v2081_2(void) = Call[VoidFunc] : func:r2081_1 +# 2081| m2081_3(unknown) = ^CallSideEffect : ~m2078_7 +# 2081| m2081_4(unknown) = Chi : total:m2078_7, partial:m2081_3 +# 2082| r2082_1(glval) = VariableAddress[#return] : +# 2082| r2082_2(glval) = VariableAddress[x] : +# 2082| r2082_3(int) = Load[x] : &:r2082_2, m2078_8 +# 2082| m2082_4(int) = Store[#return] : &:r2082_1, r2082_3 +# 2077| r2077_6(glval) = VariableAddress[#return] : +# 2077| v2077_7(void) = ReturnValue : &:r2077_6, m2082_4 +# 2077| v2077_8(void) = AliasedUse : ~m2081_4 +# 2077| v2077_9(void) = ExitFunction : + +# 2085| void CallsNonExit() +# 2085| Block 0 +# 2085| v2085_1(void) = EnterFunction : +# 2085| m2085_2(unknown) = AliasedDefinition : +# 2085| m2085_3(unknown) = InitializeNonLocal : +# 2085| m2085_4(unknown) = Chi : total:m2085_2, partial:m2085_3 +# 2086| r2086_1(glval) = FunctionAddress[VoidFunc] : +# 2086| v2086_2(void) = Call[VoidFunc] : func:r2086_1 +# 2086| m2086_3(unknown) = ^CallSideEffect : ~m2085_4 +# 2086| m2086_4(unknown) = Chi : total:m2085_4, partial:m2086_3 +# 2087| r2087_1(glval) = FunctionAddress[exit] : +# 2087| r2087_2(int) = Constant[3] : +# 2087| v2087_3(void) = Call[exit] : func:r2087_1, 0:r2087_2 +# 2087| m2087_4(unknown) = ^CallSideEffect : ~m2086_4 +# 2087| m2087_5(unknown) = Chi : total:m2086_4, partial:m2087_4 +# 2085| v2085_5(void) = Unreached : + +# 2090| int TransNonExit() +# 2090| Block 0 +# 2090| v2090_1(void) = EnterFunction : +# 2090| m2090_2(unknown) = AliasedDefinition : +# 2090| m2090_3(unknown) = InitializeNonLocal : +# 2090| m2090_4(unknown) = Chi : total:m2090_2, partial:m2090_3 +# 2091| r2091_1(glval) = VariableAddress[x] : +# 2091| r2091_2(glval) = FunctionAddress[Add] : +# 2091| r2091_3(int) = Constant[3] : +# 2091| r2091_4(int) = Constant[4] : +# 2091| r2091_5(int) = Call[Add] : func:r2091_2, 0:r2091_3, 1:r2091_4 +# 2091| m2091_6(unknown) = ^CallSideEffect : ~m2090_4 +# 2091| m2091_7(unknown) = Chi : total:m2090_4, partial:m2091_6 +# 2091| m2091_8(int) = Store[x] : &:r2091_1, r2091_5 +# 2092| r2092_1(glval) = VariableAddress[x] : +# 2092| r2092_2(int) = Load[x] : &:r2092_1, m2091_8 +# 2092| r2092_3(int) = Constant[7] : +# 2092| r2092_4(bool) = CompareEQ : r2092_2, r2092_3 +# 2092| v2092_5(void) = ConditionalBranch : r2092_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2093| Block 1 +# 2093| r2093_1(glval) = FunctionAddress[CallsNonExit] : +# 2093| v2093_2(void) = Call[CallsNonExit] : func:r2093_1 +# 2090| v2090_5(void) = Unreached : + +# 2094| Block 2 +# 2094| r2094_1(glval) = FunctionAddress[VoidFunc] : +# 2094| v2094_2(void) = Call[VoidFunc] : func:r2094_1 +# 2094| m2094_3(unknown) = ^CallSideEffect : ~m2091_7 +# 2094| m2094_4(unknown) = Chi : total:m2091_7, partial:m2094_3 +# 2095| r2095_1(glval) = VariableAddress[#return] : +# 2095| r2095_2(glval) = VariableAddress[x] : +# 2095| r2095_3(int) = Load[x] : &:r2095_2, m2091_8 +# 2095| m2095_4(int) = Store[#return] : &:r2095_1, r2095_3 +# 2090| r2090_6(glval) = VariableAddress[#return] : +# 2090| v2090_7(void) = ReturnValue : &:r2090_6, m2095_4 +# 2090| v2090_8(void) = AliasedUse : ~m2094_4 +# 2090| v2090_9(void) = ExitFunction : + +perf-regression.cpp: +# 6| void Big::Big() +# 6| Block 0 +# 6| v6_1(void) = EnterFunction : +# 6| m6_2(unknown) = AliasedDefinition : +# 6| m6_3(unknown) = InitializeNonLocal : +# 6| m6_4(unknown) = Chi : total:m6_2, partial:m6_3 +# 6| r6_5(glval) = VariableAddress[#this] : +# 6| m6_6(glval) = InitializeParameter[#this] : &:r6_5 +# 6| r6_7(glval) = Load[#this] : &:r6_5, m6_6 +# 6| m6_8(Big) = InitializeIndirection[#this] : &:r6_7 +# 6| r6_9(glval) = FieldAddress[buffer] : m6_6 +# 6| r6_10(int) = Constant[0] : +# 6| r6_11(glval) = PointerAdd[1] : r6_9, r6_10 +# 6| r6_12(unknown[1073741824]) = Constant[0] : +# 6| m6_13(unknown[1073741824]) = Store[?] : &:r6_11, r6_12 +# 6| m6_14(unknown) = Chi : total:m6_8, partial:m6_13 +# 6| v6_15(void) = NoOp : +# 6| v6_16(void) = ReturnIndirection[#this] : &:r6_7, m6_14 +# 6| v6_17(void) = ReturnVoid : +# 6| v6_18(void) = AliasedUse : m6_3 +# 6| v6_19(void) = ExitFunction : + +# 9| int main() +# 9| Block 0 +# 9| v9_1(void) = EnterFunction : +# 9| m9_2(unknown) = AliasedDefinition : +# 9| m9_3(unknown) = InitializeNonLocal : +# 9| m9_4(unknown) = Chi : total:m9_2, partial:m9_3 +# 10| r10_1(glval) = VariableAddress[big] : +# 10| r10_2(glval) = FunctionAddress[operator new] : +# 10| r10_3(unsigned long) = Constant[1073741824] : +# 10| r10_4(void *) = Call[operator new] : func:r10_2, 0:r10_3 +# 10| m10_5(unknown) = ^CallSideEffect : ~m9_4 +# 10| m10_6(unknown) = Chi : total:m9_4, partial:m10_5 +# 10| m10_7(unknown) = ^InitializeDynamicAllocation : &:r10_4 +# 10| r10_8(Big *) = Convert : r10_4 +# 10| r10_9(glval) = FunctionAddress[Big] : +# 10| v10_10(void) = Call[Big] : func:r10_9, this:r10_8 +# 10| m10_11(unknown) = ^CallSideEffect : ~m10_6 +# 10| m10_12(unknown) = Chi : total:m10_6, partial:m10_11 +# 10| m10_13(Big) = ^IndirectMayWriteSideEffect[-1] : &:r10_8 +# 10| m10_14(unknown) = Chi : total:m10_7, partial:m10_13 +# 10| m10_15(Big *) = Store[big] : &:r10_1, r10_8 +# 12| r12_1(glval) = VariableAddress[#return] : +# 12| r12_2(int) = Constant[0] : +# 12| m12_3(int) = Store[#return] : &:r12_1, r12_2 +# 9| r9_5(glval) = VariableAddress[#return] : +# 9| v9_6(void) = ReturnValue : &:r9_5, m12_3 +# 9| v9_7(void) = AliasedUse : ~m10_12 +# 9| v9_8(void) = ExitFunction : + +smart_ptr.cpp: +# 10| void call_unique_ptr_arg(int*) +# 10| Block 0 +# 10| v10_1(void) = EnterFunction : +# 10| m10_2(unknown) = AliasedDefinition : +# 10| m10_3(unknown) = InitializeNonLocal : +# 10| m10_4(unknown) = Chi : total:m10_2, partial:m10_3 +# 10| r10_5(glval) = VariableAddress[p] : +# 10| m10_6(int *) = InitializeParameter[p] : &:r10_5 +# 10| r10_7(int *) = Load[p] : &:r10_5, m10_6 +# 10| m10_8(unknown) = InitializeIndirection[p] : &:r10_7 +# 11| r11_1(glval>>) = VariableAddress[up] : +# 11| m11_2(unique_ptr>) = Uninitialized[up] : &:r11_1 +# 11| r11_3(glval) = FunctionAddress[unique_ptr] : +# 11| r11_4(glval) = VariableAddress[p] : +# 11| r11_5(int *) = Load[p] : &:r11_4, m10_6 +# 11| v11_6(void) = Call[unique_ptr] : func:r11_3, this:r11_1, 0:r11_5 +# 11| m11_7(unknown) = ^CallSideEffect : ~m10_4 +# 11| m11_8(unknown) = Chi : total:m10_4, partial:m11_7 +# 11| m11_9(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r11_1 +# 12| r12_1(glval) = FunctionAddress[unique_ptr_arg] : +# 12| r12_2(glval>>) = VariableAddress[#temp12:20] : +# 12| r12_3(glval) = FunctionAddress[move] : +# 12| r12_4(glval>>) = VariableAddress[up] : +# 12| r12_5(unique_ptr> &) = CopyValue : r12_4 +# 12| r12_6(unique_ptr> &&) = Call[move] : func:r12_3, 0:r12_5 +# 12| r12_7(unique_ptr>) = Load[?] : &:r12_6, m11_9 +# 12| m12_8(unique_ptr>) = Store[#temp12:20] : &:r12_2, r12_7 +# 12| r12_9(unique_ptr>) = Load[#temp12:20] : &:r12_2, m12_8 +# 12| v12_10(void) = Call[unique_ptr_arg] : func:r12_1, 0:r12_9 +# 12| m12_11(unknown) = ^CallSideEffect : ~m11_8 +# 12| m12_12(unknown) = Chi : total:m11_8, partial:m12_11 +# 12| v12_13(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m10_8 +# 12| m12_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 +# 12| m12_15(unknown) = Chi : total:m10_8, partial:m12_14 +# 13| v13_1(void) = NoOp : +# 10| v10_9(void) = ReturnIndirection[p] : &:r10_7, m12_15 +# 10| v10_10(void) = ReturnVoid : +# 10| v10_11(void) = AliasedUse : ~m12_12 +# 10| v10_12(void) = ExitFunction : + +# 17| void call_shared_ptr_arg(float*) +# 17| Block 0 +# 17| v17_1(void) = EnterFunction : +# 17| m17_2(unknown) = AliasedDefinition : +# 17| m17_3(unknown) = InitializeNonLocal : +# 17| m17_4(unknown) = Chi : total:m17_2, partial:m17_3 +# 17| r17_5(glval) = VariableAddress[p] : +# 17| m17_6(float *) = InitializeParameter[p] : &:r17_5 +# 17| r17_7(float *) = Load[p] : &:r17_5, m17_6 +# 17| m17_8(unknown) = InitializeIndirection[p] : &:r17_7 +# 18| r18_1(glval>) = VariableAddress[sp] : +# 18| m18_2(shared_ptr) = Uninitialized[sp] : &:r18_1 +# 18| r18_3(glval) = FunctionAddress[shared_ptr] : +# 18| r18_4(glval) = VariableAddress[p] : +# 18| r18_5(float *) = Load[p] : &:r18_4, m17_6 +# 18| v18_6(void) = Call[shared_ptr] : func:r18_3, this:r18_1, 0:r18_5 +# 18| m18_7(unknown) = ^CallSideEffect : ~m17_4 +# 18| m18_8(unknown) = Chi : total:m17_4, partial:m18_7 +# 18| m18_9(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r18_1 +# 19| r19_1(glval) = FunctionAddress[shared_ptr_arg] : +# 19| r19_2(glval>) = VariableAddress[#temp19:20] : +# 19| m19_3(shared_ptr) = Uninitialized[#temp19:20] : &:r19_2 +# 19| r19_4(glval) = FunctionAddress[shared_ptr] : +# 19| r19_5(glval>) = VariableAddress[sp] : +# 19| r19_6(glval>) = Convert : r19_5 +# 19| r19_7(shared_ptr &) = CopyValue : r19_6 +# 19| v19_8(void) = Call[shared_ptr] : func:r19_4, this:r19_2, 0:r19_7 +# 19| m19_9(unknown) = ^CallSideEffect : ~m18_8 +# 19| m19_10(unknown) = Chi : total:m18_8, partial:m19_9 +# 19| v19_11(void) = ^IndirectReadSideEffect[0] : &:r19_7, m18_9 +# 19| m19_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r19_2 +# 19| r19_13(shared_ptr) = Load[#temp19:20] : &:r19_2, m19_12 +# 19| v19_14(void) = Call[shared_ptr_arg] : func:r19_1, 0:r19_13 +# 19| m19_15(unknown) = ^CallSideEffect : ~m19_10 +# 19| m19_16(unknown) = Chi : total:m19_10, partial:m19_15 +# 19| v19_17(void) = ^BufferReadSideEffect[0] : &:r19_13, ~m17_8 +# 19| m19_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_13 +# 19| m19_19(unknown) = Chi : total:m17_8, partial:m19_18 +# 20| v20_1(void) = NoOp : +# 17| v17_9(void) = ReturnIndirection[p] : &:r17_7, m19_19 +# 17| v17_10(void) = ReturnVoid : +# 17| v17_11(void) = AliasedUse : ~m19_16 +# 17| v17_12(void) = ExitFunction : + +# 28| void call_shared_ptr_consts() +# 28| Block 0 +# 28| v28_1(void) = EnterFunction : +# 28| m28_2(unknown) = AliasedDefinition : +# 28| m28_3(unknown) = InitializeNonLocal : +# 28| m28_4(unknown) = Chi : total:m28_2, partial:m28_3 +# 29| r29_1(glval>) = VariableAddress[sp_const_int] : +# 29| m29_2(shared_ptr) = Uninitialized[sp_const_int] : &:r29_1 +# 31| r31_1(glval) = FunctionAddress[shared_ptr_const_int] : +# 31| r31_2(glval>) = VariableAddress[#temp31:26] : +# 31| m31_3(shared_ptr) = Uninitialized[#temp31:26] : &:r31_2 +# 31| r31_4(glval) = FunctionAddress[shared_ptr] : +# 31| r31_5(glval>) = VariableAddress[sp_const_int] : +# 31| r31_6(glval>) = Convert : r31_5 +# 31| r31_7(shared_ptr &) = CopyValue : r31_6 +# 31| v31_8(void) = Call[shared_ptr] : func:r31_4, this:r31_2, 0:r31_7 +# 31| m31_9(unknown) = ^CallSideEffect : ~m28_4 +# 31| m31_10(unknown) = Chi : total:m28_4, partial:m31_9 +# 31| v31_11(void) = ^IndirectReadSideEffect[0] : &:r31_7, m29_2 +# 31| m31_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r31_2 +# 31| r31_13(shared_ptr) = Load[#temp31:26] : &:r31_2, m31_12 +# 31| v31_14(void) = Call[shared_ptr_const_int] : func:r31_1, 0:r31_13 +# 31| m31_15(unknown) = ^CallSideEffect : ~m31_10 +# 31| m31_16(unknown) = Chi : total:m31_10, partial:m31_15 +# 31| v31_17(void) = ^BufferReadSideEffect[0] : &:r31_13, ~m31_16 +# 33| r33_1(glval>) = VariableAddress[sp_const_int_pointer] : +# 33| m33_2(shared_ptr) = Uninitialized[sp_const_int_pointer] : &:r33_1 +# 35| r35_1(glval) = FunctionAddress[shared_ptr_const_int_ptr] : +# 35| r35_2(glval>) = VariableAddress[#temp35:30] : +# 35| m35_3(shared_ptr) = Uninitialized[#temp35:30] : &:r35_2 +# 35| r35_4(glval) = FunctionAddress[shared_ptr] : +# 35| r35_5(glval>) = VariableAddress[sp_const_int_pointer] : +# 35| r35_6(glval>) = Convert : r35_5 +# 35| r35_7(shared_ptr &) = CopyValue : r35_6 +# 35| v35_8(void) = Call[shared_ptr] : func:r35_4, this:r35_2, 0:r35_7 +# 35| m35_9(unknown) = ^CallSideEffect : ~m31_16 +# 35| m35_10(unknown) = Chi : total:m31_16, partial:m35_9 +# 35| v35_11(void) = ^IndirectReadSideEffect[0] : &:r35_7, m33_2 +# 35| m35_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r35_2 +# 35| r35_13(shared_ptr) = Load[#temp35:30] : &:r35_2, m35_12 +# 35| v35_14(void) = Call[shared_ptr_const_int_ptr] : func:r35_1, 0:r35_13 +# 35| m35_15(unknown) = ^CallSideEffect : ~m35_10 +# 35| m35_16(unknown) = Chi : total:m35_10, partial:m35_15 +# 35| v35_17(void) = ^BufferReadSideEffect[0] : &:r35_13, ~m35_16 +# 35| m35_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r35_13 +# 35| m35_19(unknown) = Chi : total:m35_16, partial:m35_18 +# 37| r37_1(glval>>) = VariableAddress[sp_sp_const_int] : +# 37| m37_2(shared_ptr>) = Uninitialized[sp_sp_const_int] : &:r37_1 +# 39| r39_1(glval) = FunctionAddress[shared_ptr_shared_ptr_const_int] : +# 39| r39_2(glval>>) = VariableAddress[#temp39:37] : +# 39| m39_3(shared_ptr>) = Uninitialized[#temp39:37] : &:r39_2 +# 39| r39_4(glval) = FunctionAddress[shared_ptr] : +# 39| r39_5(glval>>) = VariableAddress[sp_sp_const_int] : +# 39| r39_6(glval>>) = Convert : r39_5 +# 39| r39_7(shared_ptr> &) = CopyValue : r39_6 +# 39| v39_8(void) = Call[shared_ptr] : func:r39_4, this:r39_2, 0:r39_7 +# 39| m39_9(unknown) = ^CallSideEffect : ~m35_19 +# 39| m39_10(unknown) = Chi : total:m35_19, partial:m39_9 +# 39| v39_11(void) = ^IndirectReadSideEffect[0] : &:r39_7, m37_2 +# 39| m39_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r39_2 +# 39| r39_13(shared_ptr>) = Load[#temp39:37] : &:r39_2, m39_12 +# 39| v39_14(void) = Call[shared_ptr_shared_ptr_const_int] : func:r39_1, 0:r39_13 +# 39| m39_15(unknown) = ^CallSideEffect : ~m39_10 +# 39| m39_16(unknown) = Chi : total:m39_10, partial:m39_15 +# 39| v39_17(void) = ^BufferReadSideEffect[0] : &:r39_13, ~m39_16 +# 39| m39_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r39_13 +# 39| m39_19(unknown) = Chi : total:m39_16, partial:m39_18 +# 41| r41_1(glval>>) = VariableAddress[sp_const_sp_int] : +# 41| m41_2(shared_ptr>) = Uninitialized[sp_const_sp_int] : &:r41_1 +# 43| r43_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_int] : +# 43| r43_2(glval>>) = VariableAddress[#temp43:37] : +# 43| m43_3(shared_ptr>) = Uninitialized[#temp43:37] : &:r43_2 +# 43| r43_4(glval) = FunctionAddress[shared_ptr] : +# 43| r43_5(glval>>) = VariableAddress[sp_const_sp_int] : +# 43| r43_6(glval>>) = Convert : r43_5 +# 43| r43_7(shared_ptr> &) = CopyValue : r43_6 +# 43| v43_8(void) = Call[shared_ptr] : func:r43_4, this:r43_2, 0:r43_7 +# 43| m43_9(unknown) = ^CallSideEffect : ~m39_19 +# 43| m43_10(unknown) = Chi : total:m39_19, partial:m43_9 +# 43| v43_11(void) = ^IndirectReadSideEffect[0] : &:r43_7, m41_2 +# 43| m43_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r43_2 +# 43| r43_13(shared_ptr>) = Load[#temp43:37] : &:r43_2, m43_12 +# 43| v43_14(void) = Call[shared_ptr_const_shared_ptr_int] : func:r43_1, 0:r43_13 +# 43| m43_15(unknown) = ^CallSideEffect : ~m43_10 +# 43| m43_16(unknown) = Chi : total:m43_10, partial:m43_15 +# 43| v43_17(void) = ^BufferReadSideEffect[0] : &:r43_13, ~m43_16 +# 43| m43_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r43_13 +# 43| m43_19(unknown) = Chi : total:m43_16, partial:m43_18 +# 45| r45_1(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 45| m45_2(shared_ptr>) = Uninitialized[sp_const_sp_const_int] : &:r45_1 +# 47| r47_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_const_int] : +# 47| r47_2(glval>>) = VariableAddress[#temp47:43] : +# 47| m47_3(shared_ptr>) = Uninitialized[#temp47:43] : &:r47_2 +# 47| r47_4(glval) = FunctionAddress[shared_ptr] : +# 47| r47_5(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 47| r47_6(glval>>) = Convert : r47_5 +# 47| r47_7(shared_ptr> &) = CopyValue : r47_6 +# 47| v47_8(void) = Call[shared_ptr] : func:r47_4, this:r47_2, 0:r47_7 +# 47| m47_9(unknown) = ^CallSideEffect : ~m43_19 +# 47| m47_10(unknown) = Chi : total:m43_19, partial:m47_9 +# 47| v47_11(void) = ^IndirectReadSideEffect[0] : &:r47_7, m45_2 +# 47| m47_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r47_2 +# 47| r47_13(shared_ptr>) = Load[#temp47:43] : &:r47_2, m47_12 +# 47| v47_14(void) = Call[shared_ptr_const_shared_ptr_const_int] : func:r47_1, 0:r47_13 +# 47| m47_15(unknown) = ^CallSideEffect : ~m47_10 +# 47| m47_16(unknown) = Chi : total:m47_10, partial:m47_15 +# 47| v47_17(void) = ^BufferReadSideEffect[0] : &:r47_13, ~m47_16 +# 48| v48_1(void) = NoOp : +# 28| v28_5(void) = ReturnVoid : +# 28| v28_6(void) = AliasedUse : ~m47_16 +# 28| v28_7(void) = ExitFunction : + +struct_init.cpp: +# 9| Info infos_in_file[] +# 9| Block 0 +# 9| v9_1(void) = EnterFunction : +# 9| m9_2(unknown) = AliasedDefinition : +# 9| r9_3(glval) = VariableAddress[infos_in_file] : +# 9| r9_4(int) = Constant[0] : +# 9| r9_5(glval) = PointerAdd[16] : r9_3, r9_4 +# 10| r10_1(glval) = FieldAddress[name] : r9_5 +# 10| r10_2(glval) = StringConstant["1"] : +# 10| r10_3(char *) = Convert : r10_2 +# 10| m10_4(char *) = Store[?] : &:r10_1, r10_3 +# 10| m10_5(unknown) = Chi : total:m9_2, partial:m10_4 +# 10| r10_6(glval<..(*)(..)>) = FieldAddress[handler] : r9_5 +# 10| r10_7(..(*)(..)) = FunctionAddress[handler1] : +# 10| m10_8(..(*)(..)) = Store[?] : &:r10_6, r10_7 +# 10| m10_9(unknown) = Chi : total:m10_5, partial:m10_8 +# 9| r9_6(int) = Constant[1] : +# 9| r9_7(glval) = PointerAdd[16] : r9_3, r9_6 +# 11| r11_1(glval) = FieldAddress[name] : r9_7 +# 11| r11_2(glval) = StringConstant["3"] : +# 11| r11_3(char *) = Convert : r11_2 +# 11| m11_4(char *) = Store[?] : &:r11_1, r11_3 +# 11| m11_5(unknown) = Chi : total:m10_9, partial:m11_4 +# 11| r11_6(glval<..(*)(..)>) = FieldAddress[handler] : r9_7 +# 11| r11_7(glval<..()(..)>) = FunctionAddress[handler2] : +# 11| r11_8(..(*)(..)) = CopyValue : r11_7 +# 11| m11_9(..(*)(..)) = Store[?] : &:r11_6, r11_8 +# 11| m11_10(unknown) = Chi : total:m11_5, partial:m11_9 +# 9| v9_8(void) = ReturnVoid : +# 9| v9_9(void) = AliasedUse : ~m11_10 +# 9| v9_10(void) = ExitFunction : + +# 16| void let_info_escape(Info*) +# 16| Block 0 +# 16| v16_1(void) = EnterFunction : +# 16| m16_2(unknown) = AliasedDefinition : +# 16| m16_3(unknown) = InitializeNonLocal : +# 16| m16_4(unknown) = Chi : total:m16_2, partial:m16_3 +# 16| r16_5(glval) = VariableAddress[info] : +# 16| m16_6(Info *) = InitializeParameter[info] : &:r16_5 +# 16| r16_7(Info *) = Load[info] : &:r16_5, m16_6 +# 16| m16_8(unknown) = InitializeIndirection[info] : &:r16_7 +# 17| r17_1(glval) = VariableAddress[info] : +# 17| r17_2(Info *) = Load[info] : &:r17_1, m16_6 +# 17| r17_3(glval) = VariableAddress[global_pointer] : +# 17| m17_4(Info *) = Store[global_pointer] : &:r17_3, r17_2 +# 17| m17_5(unknown) = Chi : total:m16_4, partial:m17_4 +# 18| v18_1(void) = NoOp : +# 16| v16_9(void) = ReturnIndirection[info] : &:r16_7, m16_8 +# 16| v16_10(void) = ReturnVoid : +# 16| v16_11(void) = AliasedUse : ~m17_5 +# 16| v16_12(void) = ExitFunction : + +# 20| void declare_static_infos() +# 20| Block 0 +# 20| v20_1(void) = EnterFunction : +# 20| m20_2(unknown) = AliasedDefinition : +# 20| m20_3(unknown) = InitializeNonLocal : +# 20| m20_4(unknown) = Chi : total:m20_2, partial:m20_3 +# 25| r25_1(glval) = FunctionAddress[let_info_escape] : +# 25| r25_2(glval) = VariableAddress[static_infos] : +# 25| r25_3(Info *) = Convert : r25_2 +# 25| v25_4(void) = Call[let_info_escape] : func:r25_1, 0:r25_3 +# 25| m25_5(unknown) = ^CallSideEffect : ~m20_4 +# 25| m25_6(unknown) = Chi : total:m20_4, partial:m25_5 +# 25| v25_7(void) = ^BufferReadSideEffect[0] : &:r25_3, ~m25_6 +# 25| m25_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r25_3 +# 25| m25_9(unknown) = Chi : total:m25_6, partial:m25_8 +# 26| v26_1(void) = NoOp : +# 20| v20_5(void) = ReturnVoid : +# 20| v20_6(void) = AliasedUse : ~m25_9 +# 20| v20_7(void) = ExitFunction : + +# 21| Info[] static_infos +# 21| Block 0 +# 21| v21_1(void) = EnterFunction : +# 21| m21_2(unknown) = AliasedDefinition : +# 21| r21_3(glval) = VariableAddress[static_infos] : +# 21| r21_4(int) = Constant[0] : +# 21| r21_5(glval) = PointerAdd[16] : r21_3, r21_4 +# 22| r22_1(glval) = FieldAddress[name] : r21_5 +# 22| r22_2(glval) = StringConstant["1"] : +# 22| r22_3(char *) = Convert : r22_2 +# 22| m22_4(char *) = Store[?] : &:r22_1, r22_3 +# 22| m22_5(unknown) = Chi : total:m21_2, partial:m22_4 +# 22| r22_6(glval<..(*)(..)>) = FieldAddress[handler] : r21_5 +# 22| r22_7(..(*)(..)) = FunctionAddress[handler1] : +# 22| m22_8(..(*)(..)) = Store[?] : &:r22_6, r22_7 +# 22| m22_9(unknown) = Chi : total:m22_5, partial:m22_8 +# 21| r21_6(int) = Constant[1] : +# 21| r21_7(glval) = PointerAdd[16] : r21_3, r21_6 +# 23| r23_1(glval) = FieldAddress[name] : r21_7 +# 23| r23_2(glval) = StringConstant["2"] : +# 23| r23_3(char *) = Convert : r23_2 +# 23| m23_4(char *) = Store[?] : &:r23_1, r23_3 +# 23| m23_5(unknown) = Chi : total:m22_9, partial:m23_4 +# 23| r23_6(glval<..(*)(..)>) = FieldAddress[handler] : r21_7 +# 23| r23_7(glval<..()(..)>) = FunctionAddress[handler2] : +# 23| r23_8(..(*)(..)) = CopyValue : r23_7 +# 23| m23_9(..(*)(..)) = Store[?] : &:r23_6, r23_8 +# 23| m23_10(unknown) = Chi : total:m23_5, partial:m23_9 +# 21| v21_8(void) = ReturnVoid : +# 21| v21_9(void) = AliasedUse : ~m23_10 +# 21| v21_10(void) = ExitFunction : + +# 28| void declare_local_infos() +# 28| Block 0 +# 28| v28_1(void) = EnterFunction : +# 28| m28_2(unknown) = AliasedDefinition : +# 28| m28_3(unknown) = InitializeNonLocal : +# 28| m28_4(unknown) = Chi : total:m28_2, partial:m28_3 +# 29| r29_1(glval) = VariableAddress[local_infos] : +# 29| m29_2(Info[2]) = Uninitialized[local_infos] : &:r29_1 +# 29| r29_3(int) = Constant[0] : +# 29| r29_4(glval) = PointerAdd[16] : r29_1, r29_3 +# 30| r30_1(glval) = FieldAddress[name] : r29_4 +# 30| r30_2(glval) = StringConstant["1"] : +# 30| r30_3(char *) = Convert : r30_2 +# 30| m30_4(char *) = Store[?] : &:r30_1, r30_3 +# 30| m30_5(Info[2]) = Chi : total:m29_2, partial:m30_4 +# 30| r30_6(glval<..(*)(..)>) = FieldAddress[handler] : r29_4 +# 30| r30_7(..(*)(..)) = FunctionAddress[handler1] : +# 30| m30_8(..(*)(..)) = Store[?] : &:r30_6, r30_7 +# 30| m30_9(Info[2]) = Chi : total:m30_5, partial:m30_8 +# 29| r29_5(int) = Constant[1] : +# 29| r29_6(glval) = PointerAdd[16] : r29_1, r29_5 +# 31| r31_1(glval) = FieldAddress[name] : r29_6 +# 31| r31_2(glval) = StringConstant["2"] : +# 31| r31_3(char *) = Convert : r31_2 +# 31| m31_4(char *) = Store[?] : &:r31_1, r31_3 +# 31| m31_5(Info[2]) = Chi : total:m30_9, partial:m31_4 +# 31| r31_6(glval<..(*)(..)>) = FieldAddress[handler] : r29_6 +# 31| r31_7(glval<..()(..)>) = FunctionAddress[handler2] : +# 31| r31_8(..(*)(..)) = CopyValue : r31_7 +# 31| m31_9(..(*)(..)) = Store[?] : &:r31_6, r31_8 +# 31| m31_10(Info[2]) = Chi : total:m31_5, partial:m31_9 +# 33| r33_1(glval) = FunctionAddress[let_info_escape] : +# 33| r33_2(glval) = VariableAddress[local_infos] : +# 33| r33_3(Info *) = Convert : r33_2 +# 33| v33_4(void) = Call[let_info_escape] : func:r33_1, 0:r33_3 +# 33| m33_5(unknown) = ^CallSideEffect : ~m28_4 +# 33| m33_6(unknown) = Chi : total:m28_4, partial:m33_5 +# 33| v33_7(void) = ^BufferReadSideEffect[0] : &:r33_3, ~m31_10 +# 33| m33_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r33_3 +# 33| m33_9(Info[2]) = Chi : total:m31_10, partial:m33_8 +# 34| v34_1(void) = NoOp : +# 28| v28_5(void) = ReturnVoid : +# 28| v28_6(void) = AliasedUse : ~m33_6 +# 28| v28_7(void) = ExitFunction : + +# 36| void declare_static_runtime_infos(char const*) +# 36| Block 0 +# 36| v36_1(void) = EnterFunction : +# 36| m36_2(unknown) = AliasedDefinition : +# 36| m36_3(unknown) = InitializeNonLocal : +# 36| m36_4(unknown) = Chi : total:m36_2, partial:m36_3 +# 36| r36_5(glval) = VariableAddress[name1] : +# 36| m36_6(char *) = InitializeParameter[name1] : &:r36_5 +# 36| r36_7(char *) = Load[name1] : &:r36_5, m36_6 +# 36| m36_8(unknown) = InitializeIndirection[name1] : &:r36_7 +# 37| r37_1(glval) = VariableAddress[static_infos#init] : +# 37| r37_2(bool) = Load[static_infos#init] : &:r37_1, ~m36_3 +# 37| v37_3(void) = ConditionalBranch : r37_2 +#-----| False -> Block 1 +#-----| True -> Block 2 + +# 37| Block 1 +# 37| r37_4(glval) = VariableAddress[static_infos] : +# 37| r37_5(int) = Constant[0] : +# 37| r37_6(glval) = PointerAdd[16] : r37_4, r37_5 +# 38| r38_1(glval) = FieldAddress[name] : r37_6 +# 38| r38_2(glval) = VariableAddress[name1] : +# 38| r38_3(char *) = Load[name1] : &:r38_2, m36_6 +# 38| m38_4(char *) = Store[?] : &:r38_1, r38_3 +# 38| m38_5(unknown) = Chi : total:m36_4, partial:m38_4 +# 38| r38_6(glval<..(*)(..)>) = FieldAddress[handler] : r37_6 +# 38| r38_7(..(*)(..)) = FunctionAddress[handler1] : +# 38| m38_8(..(*)(..)) = Store[?] : &:r38_6, r38_7 +# 38| m38_9(unknown) = Chi : total:m38_5, partial:m38_8 +# 37| r37_7(int) = Constant[1] : +# 37| r37_8(glval) = PointerAdd[16] : r37_4, r37_7 +# 39| r39_1(glval) = FieldAddress[name] : r37_8 +# 39| r39_2(glval) = StringConstant["2"] : +# 39| r39_3(char *) = Convert : r39_2 +# 39| m39_4(char *) = Store[?] : &:r39_1, r39_3 +# 39| m39_5(unknown) = Chi : total:m38_9, partial:m39_4 +# 39| r39_6(glval<..(*)(..)>) = FieldAddress[handler] : r37_8 +# 39| r39_7(glval<..()(..)>) = FunctionAddress[handler2] : +# 39| r39_8(..(*)(..)) = CopyValue : r39_7 +# 39| m39_9(..(*)(..)) = Store[?] : &:r39_6, r39_8 +# 39| m39_10(unknown) = Chi : total:m39_5, partial:m39_9 +# 37| r37_9(bool) = Constant[1] : +# 37| m37_10(bool) = Store[static_infos#init] : &:r37_1, r37_9 +# 37| m37_11(unknown) = Chi : total:m39_10, partial:m37_10 +#-----| Goto -> Block 2 + +# 41| Block 2 +# 41| m41_1(unknown) = Phi : from 0:~m36_4, from 1:~m37_11 +# 41| r41_2(glval) = FunctionAddress[let_info_escape] : +# 41| r41_3(glval) = VariableAddress[static_infos] : +# 41| r41_4(Info *) = Convert : r41_3 +# 41| v41_5(void) = Call[let_info_escape] : func:r41_2, 0:r41_4 +# 41| m41_6(unknown) = ^CallSideEffect : ~m41_1 +# 41| m41_7(unknown) = Chi : total:m41_1, partial:m41_6 +# 41| v41_8(void) = ^BufferReadSideEffect[0] : &:r41_4, ~m41_7 +# 41| m41_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r41_4 +# 41| m41_10(unknown) = Chi : total:m41_7, partial:m41_9 +# 42| v42_1(void) = NoOp : +# 36| v36_9(void) = ReturnIndirection[name1] : &:r36_7, m36_8 +# 36| v36_10(void) = ReturnVoid : +# 36| v36_11(void) = AliasedUse : ~m41_10 +# 36| v36_12(void) = ExitFunction : + +try_except.c: +# 6| void f() +# 6| Block 0 +# 6| v6_1(void) = EnterFunction : +# 6| m6_2(unknown) = AliasedDefinition : +# 6| m6_3(unknown) = InitializeNonLocal : +# 6| m6_4(unknown) = Chi : total:m6_2, partial:m6_3 +# 7| r7_1(glval) = VariableAddress[x] : +# 7| m7_2(int) = Uninitialized[x] : &:r7_1 +# 7| r7_3(glval) = VariableAddress[y] : +# 7| r7_4(int) = Constant[0] : +# 7| m7_5(int) = Store[y] : &:r7_3, r7_4 +# 9| r9_1(glval) = FunctionAddress[ProbeFunction] : +# 9| r9_2(int) = Constant[0] : +# 9| v9_3(void) = Call[ProbeFunction] : func:r9_1, 0:r9_2 +# 9| m9_4(unknown) = ^CallSideEffect : ~m6_4 +# 9| m9_5(unknown) = Chi : total:m6_4, partial:m9_4 +# 10| r10_1(glval) = VariableAddress[y] : +# 10| r10_2(int) = Load[y] : &:r10_1, m7_5 +# 10| r10_3(glval) = VariableAddress[x] : +# 10| m10_4(int) = Store[x] : &:r10_3, r10_2 +# 11| r11_1(glval) = FunctionAddress[ProbeFunction] : +# 11| r11_2(int) = Constant[0] : +# 11| v11_3(void) = Call[ProbeFunction] : func:r11_1, 0:r11_2 +# 11| m11_4(unknown) = ^CallSideEffect : ~m9_5 +# 11| m11_5(unknown) = Chi : total:m9_5, partial:m11_4 +# 16| v16_1(void) = NoOp : +# 6| v6_5(void) = ReturnVoid : +# 6| v6_6(void) = AliasedUse : ~m11_5 +# 6| v6_7(void) = ExitFunction : + +# 6| Block 1 +# 6| v6_8(void) = Unreached : + +# 18| void g() +# 18| Block 0 +# 18| v18_1(void) = EnterFunction : +# 18| m18_2(unknown) = AliasedDefinition : +# 18| m18_3(unknown) = InitializeNonLocal : +# 18| m18_4(unknown) = Chi : total:m18_2, partial:m18_3 +# 19| r19_1(glval) = VariableAddress[x] : +# 19| m19_2(int) = Uninitialized[x] : &:r19_1 +# 19| r19_3(glval) = VariableAddress[y] : +# 19| r19_4(int) = Constant[0] : +# 19| m19_5(int) = Store[y] : &:r19_3, r19_4 +# 21| r21_1(glval) = FunctionAddress[ProbeFunction] : +# 21| r21_2(int) = Constant[0] : +# 21| v21_3(void) = Call[ProbeFunction] : func:r21_1, 0:r21_2 +# 21| m21_4(unknown) = ^CallSideEffect : ~m18_4 +# 21| m21_5(unknown) = Chi : total:m18_4, partial:m21_4 +# 22| r22_1(glval) = VariableAddress[y] : +# 22| r22_2(int) = Load[y] : &:r22_1, m19_5 +# 22| r22_3(glval) = VariableAddress[x] : +# 22| m22_4(int) = Store[x] : &:r22_3, r22_2 +# 23| r23_1(glval) = FunctionAddress[ProbeFunction] : +# 23| r23_2(int) = Constant[0] : +# 23| v23_3(void) = Call[ProbeFunction] : func:r23_1, 0:r23_2 +# 23| m23_4(unknown) = ^CallSideEffect : ~m21_5 +# 23| m23_5(unknown) = Chi : total:m21_5, partial:m23_4 +# 26| r26_1(glval) = FunctionAddress[sink] : +# 26| r26_2(glval) = VariableAddress[x] : +# 26| r26_3(int) = Load[x] : &:r26_2, m22_4 +# 26| v26_4(void) = Call[sink] : func:r26_1, 0:r26_3 +# 26| m26_5(unknown) = ^CallSideEffect : ~m23_5 +# 26| m26_6(unknown) = Chi : total:m23_5, partial:m26_5 +# 28| v28_1(void) = NoOp : +# 18| v18_5(void) = ReturnVoid : +# 18| v18_6(void) = AliasedUse : ~m26_6 +# 18| v18_7(void) = ExitFunction : + +# 32| void h(int) +# 32| Block 0 +# 32| v32_1(void) = EnterFunction : +# 32| m32_2(unknown) = AliasedDefinition : +# 32| m32_3(unknown) = InitializeNonLocal : +# 32| m32_4(unknown) = Chi : total:m32_2, partial:m32_3 +# 32| r32_5(glval) = VariableAddress[b] : +# 32| m32_6(int) = InitializeParameter[b] : &:r32_5 +# 33| r33_1(glval) = VariableAddress[x] : +# 33| r33_2(int) = Constant[0] : +# 33| m33_3(int) = Store[x] : &:r33_1, r33_2 +# 35| r35_1(glval) = VariableAddress[b] : +# 35| r35_2(int) = Load[b] : &:r35_1, m32_6 +# 35| v35_3(void) = ConditionalBranch : r35_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 36| Block 1 +# 36| r36_1(glval) = FunctionAddress[AfxThrowMemoryException] : +# 36| v36_2(void) = Call[AfxThrowMemoryException] : func:r36_1 +# 36| m36_3(unknown) = ^CallSideEffect : ~m32_4 +# 36| m36_4(unknown) = Chi : total:m32_4, partial:m36_3 +#-----| Goto -> Block 2 + +# 42| Block 2 +# 42| m42_1(unknown) = Phi : from 0:~m32_4, from 1:~m36_4 +# 42| v42_2(void) = NoOp : +# 32| v32_7(void) = ReturnVoid : +# 32| v32_8(void) = AliasedUse : ~m42_1 +# 32| v32_9(void) = ExitFunction : + +# 32| Block 3 +# 32| v32_10(void) = Unreached : + +try_except.cpp: +# 6| void f_cpp() +# 6| Block 0 +# 6| v6_1(void) = EnterFunction : +# 6| m6_2(unknown) = AliasedDefinition : +# 6| m6_3(unknown) = InitializeNonLocal : +# 6| m6_4(unknown) = Chi : total:m6_2, partial:m6_3 +# 7| r7_1(glval) = VariableAddress[x] : +# 7| m7_2(int) = Uninitialized[x] : &:r7_1 +# 7| r7_3(glval) = VariableAddress[y] : +# 7| r7_4(int) = Constant[0] : +# 7| m7_5(int) = Store[y] : &:r7_3, r7_4 +# 9| r9_1(glval) = FunctionAddress[ProbeFunction] : +# 9| r9_2(int) = Constant[0] : +# 9| v9_3(void) = Call[ProbeFunction] : func:r9_1, 0:r9_2 +# 9| m9_4(unknown) = ^CallSideEffect : ~m6_4 +# 9| m9_5(unknown) = Chi : total:m6_4, partial:m9_4 +# 10| r10_1(glval) = VariableAddress[y] : +# 10| r10_2(int) = Load[y] : &:r10_1, m7_5 +# 10| r10_3(glval) = VariableAddress[x] : +# 10| m10_4(int) = Store[x] : &:r10_3, r10_2 +# 11| r11_1(glval) = FunctionAddress[ProbeFunction] : +# 11| r11_2(int) = Constant[0] : +# 11| v11_3(void) = Call[ProbeFunction] : func:r11_1, 0:r11_2 +# 11| m11_4(unknown) = ^CallSideEffect : ~m9_5 +# 11| m11_5(unknown) = Chi : total:m9_5, partial:m11_4 +# 16| v16_1(void) = NoOp : +# 6| v6_5(void) = ReturnVoid : +# 6| v6_6(void) = AliasedUse : ~m11_5 +# 6| v6_7(void) = ExitFunction : + +# 6| Block 1 +# 6| v6_8(void) = Unreached : + +# 18| void g_cpp() +# 18| Block 0 +# 18| v18_1(void) = EnterFunction : +# 18| m18_2(unknown) = AliasedDefinition : +# 18| m18_3(unknown) = InitializeNonLocal : +# 18| m18_4(unknown) = Chi : total:m18_2, partial:m18_3 +# 19| r19_1(glval) = VariableAddress[x] : +# 19| m19_2(int) = Uninitialized[x] : &:r19_1 +# 19| r19_3(glval) = VariableAddress[y] : +# 19| r19_4(int) = Constant[0] : +# 19| m19_5(int) = Store[y] : &:r19_3, r19_4 +# 21| r21_1(glval) = FunctionAddress[ProbeFunction] : +# 21| r21_2(int) = Constant[0] : +# 21| v21_3(void) = Call[ProbeFunction] : func:r21_1, 0:r21_2 +# 21| m21_4(unknown) = ^CallSideEffect : ~m18_4 +# 21| m21_5(unknown) = Chi : total:m18_4, partial:m21_4 +# 22| r22_1(glval) = VariableAddress[y] : +# 22| r22_2(int) = Load[y] : &:r22_1, m19_5 +# 22| r22_3(glval) = VariableAddress[x] : +# 22| m22_4(int) = Store[x] : &:r22_3, r22_2 +# 23| r23_1(glval) = FunctionAddress[ProbeFunction] : +# 23| r23_2(int) = Constant[0] : +# 23| v23_3(void) = Call[ProbeFunction] : func:r23_1, 0:r23_2 +# 23| m23_4(unknown) = ^CallSideEffect : ~m21_5 +# 23| m23_5(unknown) = Chi : total:m21_5, partial:m23_4 +# 26| r26_1(glval) = FunctionAddress[sink] : +# 26| r26_2(glval) = VariableAddress[x] : +# 26| r26_3(int) = Load[x] : &:r26_2, m22_4 +# 26| v26_4(void) = Call[sink] : func:r26_1, 0:r26_3 +# 26| m26_5(unknown) = ^CallSideEffect : ~m23_5 +# 26| m26_6(unknown) = Chi : total:m23_5, partial:m26_5 +# 28| v28_1(void) = NoOp : +# 18| v18_5(void) = ReturnVoid : +# 18| v18_6(void) = AliasedUse : ~m26_6 +# 18| v18_7(void) = ExitFunction : + +# 32| void h_cpp(int) +# 32| Block 0 +# 32| v32_1(void) = EnterFunction : +# 32| m32_2(unknown) = AliasedDefinition : +# 32| m32_3(unknown) = InitializeNonLocal : +# 32| m32_4(unknown) = Chi : total:m32_2, partial:m32_3 +# 32| r32_5(glval) = VariableAddress[b] : +# 32| m32_6(int) = InitializeParameter[b] : &:r32_5 +# 33| r33_1(glval) = VariableAddress[x] : +# 33| r33_2(int) = Constant[0] : +# 33| m33_3(int) = Store[x] : &:r33_1, r33_2 +# 35| r35_1(glval) = VariableAddress[b] : +# 35| r35_2(int) = Load[b] : &:r35_1, m32_6 +# 35| r35_3(int) = Constant[0] : +# 35| r35_4(bool) = CompareNE : r35_2, r35_3 +# 35| v35_5(void) = ConditionalBranch : r35_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 36| Block 1 +# 36| r36_1(glval) = FunctionAddress[AfxThrowMemoryException] : +# 36| v36_2(void) = Call[AfxThrowMemoryException] : func:r36_1 +# 36| m36_3(unknown) = ^CallSideEffect : ~m32_4 +# 36| m36_4(unknown) = Chi : total:m32_4, partial:m36_3 +#-----| Goto -> Block 2 + +# 42| Block 2 +# 42| m42_1(unknown) = Phi : from 0:~m32_4, from 1:~m36_4 +# 42| v42_2(void) = NoOp : +# 32| v32_7(void) = ReturnVoid : +# 32| v32_8(void) = AliasedUse : ~m42_1 +# 32| v32_9(void) = ExitFunction : + +# 32| Block 3 +# 32| v32_10(void) = Unreached : + +# 44| void throw_cpp(int) +# 44| Block 0 +# 44| v44_1(void) = EnterFunction : +# 44| m44_2(unknown) = AliasedDefinition : +# 44| m44_3(unknown) = InitializeNonLocal : +# 44| m44_4(unknown) = Chi : total:m44_2, partial:m44_3 +# 44| r44_5(glval) = VariableAddress[b] : +# 44| m44_6(int) = InitializeParameter[b] : &:r44_5 +# 45| r45_1(glval) = VariableAddress[x] : +# 45| r45_2(int) = Constant[0] : +# 45| m45_3(int) = Store[x] : &:r45_1, r45_2 +# 47| r47_1(glval) = VariableAddress[b] : +# 47| r47_2(int) = Load[b] : &:r47_1, m44_6 +# 47| r47_3(int) = Constant[0] : +# 47| r47_4(bool) = CompareNE : r47_2, r47_3 +# 47| v47_5(void) = ConditionalBranch : r47_4 +#-----| False -> Block 6 +#-----| True -> Block 1 + +# 48| Block 1 +# 48| r48_1(glval) = VariableAddress[#throw48:13] : +# 48| r48_2(int) = Constant[1] : +# 48| m48_3(int) = Store[#throw48:13] : &:r48_1, r48_2 +# 48| v48_4(void) = ThrowValue : &:r48_1, m48_3 +#-----| Exception -> Block 4 + +# 51| Block 2 +# 51| r51_1(int) = Constant[0] : +# 51| r51_2(bool) = CompareEQ : r51_7, r51_1 +# 51| v51_3(void) = ConditionalBranch : r51_2 +#-----| False -> Block 3 +#-----| True -> Block 7 + +# 51| Block 3 +# 51| r51_4(int) = Constant[1] : +# 51| r51_5(bool) = CompareEQ : r51_7, r51_4 +# 51| v51_6(void) = ConditionalBranch : r51_5 +#-----| False -> Block 7 +#-----| True -> Block 5 + +# 51| Block 4 +# 51| r51_7(int) = Constant[1] : +# 51| r51_8(int) = Constant[-1] : +# 51| r51_9(bool) = CompareEQ : r51_7, r51_8 +# 51| v51_10(void) = ConditionalBranch : r51_9 +#-----| False -> Block 2 +#-----| True -> Block 7 + +# 52| Block 5 +# 52| r52_1(glval) = FunctionAddress[sink] : +# 52| r52_2(glval) = VariableAddress[x] : +# 52| r52_3(int) = Load[x] : &:r52_2, m45_3 +# 52| v52_4(void) = Call[sink] : func:r52_1, 0:r52_3 +# 52| m52_5(unknown) = ^CallSideEffect : ~m44_4 +# 52| m52_6(unknown) = Chi : total:m44_4, partial:m52_5 +#-----| Goto -> Block 6 + +# 54| Block 6 +# 54| m54_1(unknown) = Phi : from 0:~m44_4, from 5:~m52_6 +# 54| v54_2(void) = NoOp : +# 44| v44_7(void) = ReturnVoid : +# 44| v44_8(void) = AliasedUse : ~m54_1 +# 44| v44_9(void) = ExitFunction : + +# 44| Block 7 +# 44| v44_10(void) = Unreached : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.ql b/cpp/ql/test/library-tests/ir/ir/aliased_ir.ql new file mode 100644 index 0000000000000..0488fd09dbed9 --- /dev/null +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.ql @@ -0,0 +1,11 @@ +/** + * @kind graph + */ + +private import cpp +private import semmle.code.cpp.ir.implementation.aliased_ssa.PrintIR +private import PrintConfig + +private class PrintConfig extends PrintIRConfiguration { + override predicate shouldPrintDeclaration(Declaration decl) { shouldDumpDeclaration(decl) } +} diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index e3de79193751c..9ad813d02b027 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2072,4 +2072,27 @@ void test_constant_folding() { test_constant_folding_use(x); } +void exit(int code); + +int NonExit() { + int x = Add(3,4); + if (x == 7) + exit(3); + VoidFunc(); + return x; +} + +void CallsNonExit() { + VoidFunc(); + exit(3); +} + +int TransNonExit() { + int x = Add(3,4); + if (x == 7) + CallsNonExit(); + VoidFunc(); + return x; +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index e8a8d7e06b7f8..4fa5ceca8a34a 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -6207,10 +6207,12 @@ | ir.cpp:1286:25:1286:49 | ChiPartial | partial:m1286_7 | | ir.cpp:1286:25:1286:49 | ChiTotal | total:m1286_4 | | ir.cpp:1286:25:1286:49 | SideEffect | ~m1286_4 | -| ir.cpp:1289:5:1289:22 | Address | &:r1289_9 | +| ir.cpp:1289:5:1289:22 | Address | &:r1289_10 | | ir.cpp:1289:5:1289:22 | ChiPartial | partial:m1289_3 | | ir.cpp:1289:5:1289:22 | ChiTotal | total:m1289_2 | -| ir.cpp:1289:5:1289:22 | Load | m1291_4 | +| ir.cpp:1289:5:1289:22 | Load | m1289_9 | +| ir.cpp:1289:5:1289:22 | Phi | from 2:m1291_4 | +| ir.cpp:1289:5:1289:22 | Phi | from 3:m1293_2 | | ir.cpp:1289:5:1289:22 | SideEffect | m1289_3 | | ir.cpp:1289:29:1289:29 | Address | &:r1289_5 | | ir.cpp:1289:36:1289:36 | Address | &:r1289_7 | @@ -6221,6 +6223,7 @@ | ir.cpp:1291:16:1291:16 | Address | &:r1291_2 | | ir.cpp:1291:16:1291:16 | Load | m1289_8 | | ir.cpp:1291:16:1291:16 | StoreValue | r1291_3 | +| ir.cpp:1293:1:1293:1 | Address | &:r1293_1 | | ir.cpp:1295:6:1295:15 | ChiPartial | partial:m1295_3 | | ir.cpp:1295:6:1295:15 | ChiTotal | total:m1295_2 | | ir.cpp:1295:6:1295:15 | SideEffect | ~m1296_8 | @@ -8393,16 +8396,23 @@ | ir.cpp:1747:39:1747:39 | ChiTotal | total:m1747_20 | | ir.cpp:1747:39:1747:39 | SideEffect | ~m1747_4 | | ir.cpp:1747:39:1747:39 | SideEffect | ~m1747_15 | +| ir.cpp:1750:5:1750:34 | Address | &:r1750_5 | | ir.cpp:1750:5:1750:34 | ChiPartial | partial:m1750_3 | | ir.cpp:1750:5:1750:34 | ChiTotal | total:m1750_2 | +| ir.cpp:1750:5:1750:34 | Load | m1755_2 | +| ir.cpp:1750:5:1750:34 | SideEffect | ~m1754_10 | | ir.cpp:1751:51:1751:51 | Address | &:r1751_1 | | ir.cpp:1751:51:1751:51 | Address | &:r1751_1 | | ir.cpp:1751:51:1751:51 | Address | &:r1751_3 | +| ir.cpp:1751:51:1751:51 | Address | &:r1751_3 | | ir.cpp:1751:51:1751:51 | Load | m1751_2 | +| ir.cpp:1751:51:1751:51 | SideEffect | m1751_4 | | ir.cpp:1752:48:1752:48 | Address | &:r1752_1 | | ir.cpp:1752:48:1752:48 | Address | &:r1752_1 | | ir.cpp:1752:48:1752:48 | Address | &:r1752_3 | +| ir.cpp:1752:48:1752:48 | Address | &:r1752_3 | | ir.cpp:1752:48:1752:48 | Load | m1752_2 | +| ir.cpp:1752:48:1752:48 | SideEffect | m1752_4 | | ir.cpp:1753:40:1753:41 | Address | &:r1753_1 | | ir.cpp:1753:40:1753:41 | Address | &:r1753_1 | | ir.cpp:1753:40:1753:41 | Arg(this) | this:r1753_1 | @@ -8435,6 +8445,7 @@ | ir.cpp:1754:42:1754:42 | SideEffect | ~m1752_4 | | ir.cpp:1754:42:1754:42 | Unary | r1754_5 | | ir.cpp:1754:42:1754:42 | Unary | r1754_6 | +| ir.cpp:1755:1:1755:1 | Address | &:r1755_1 | | ir.cpp:1757:6:1757:22 | ChiPartial | partial:m1757_3 | | ir.cpp:1757:6:1757:22 | ChiTotal | total:m1757_2 | | ir.cpp:1757:6:1757:22 | SideEffect | m1757_3 | @@ -9588,22 +9599,27 @@ | ir.cpp:2021:23:2021:40 | SideEffect | ~m2021_27 | | ir.cpp:2021:23:2021:40 | Unary | r2021_20 | | ir.cpp:2021:23:2021:40 | Unary | r2021_28 | +| ir.cpp:2026:14:2026:22 | Address | &:r2026_7 | | ir.cpp:2026:14:2026:22 | ChiPartial | partial:m2026_3 | | ir.cpp:2026:14:2026:22 | ChiTotal | total:m2026_2 | +| ir.cpp:2026:14:2026:22 | Load | m2031_2 | +| ir.cpp:2026:14:2026:22 | SideEffect | ~m2028_6 | | ir.cpp:2026:37:2026:37 | Address | &:r2026_5 | | ir.cpp:2027:16:2027:16 | Address | &:r2027_1 | -| ir.cpp:2028:3:2028:3 | Address | &:r2028_9 | +| ir.cpp:2028:3:2028:3 | Address | &:r2028_10 | | ir.cpp:2028:7:2028:7 | Address | &:r2028_1 | | ir.cpp:2028:7:2028:7 | Left | r2028_2 | | ir.cpp:2028:7:2028:7 | Load | m2026_6 | | ir.cpp:2028:7:2028:13 | Condition | r2028_4 | -| ir.cpp:2028:7:2030:28 | Address | &:r2028_7 | -| ir.cpp:2028:7:2030:28 | Address | &:r2028_11 | -| ir.cpp:2028:7:2030:28 | Address | &:r2028_13 | -| ir.cpp:2028:7:2030:28 | Load | m2028_6 | -| ir.cpp:2028:7:2030:28 | Phi | from 2:m2028_12 | -| ir.cpp:2028:7:2030:28 | Phi | from 3:m2028_14 | -| ir.cpp:2028:7:2030:28 | StoreValue | r2028_8 | +| ir.cpp:2028:7:2030:28 | Address | &:r2028_8 | +| ir.cpp:2028:7:2030:28 | Address | &:r2028_12 | +| ir.cpp:2028:7:2030:28 | Address | &:r2028_14 | +| ir.cpp:2028:7:2030:28 | Load | m2028_7 | +| ir.cpp:2028:7:2030:28 | Phi | from 2:m2028_13 | +| ir.cpp:2028:7:2030:28 | Phi | from 2:~m2029_6 | +| ir.cpp:2028:7:2030:28 | Phi | from 3:m2028_15 | +| ir.cpp:2028:7:2030:28 | Phi | from 3:~m2030_6 | +| ir.cpp:2028:7:2030:28 | StoreValue | r2028_9 | | ir.cpp:2028:11:2028:13 | Right | r2028_3 | | ir.cpp:2029:6:2029:20 | CallTarget | func:r2029_1 | | ir.cpp:2029:6:2029:20 | ChiPartial | partial:m2029_5 | @@ -9626,6 +9642,7 @@ | ir.cpp:2030:22:2030:22 | Arg(0) | 0:r2030_3 | | ir.cpp:2030:22:2030:22 | Load | m2026_6 | | ir.cpp:2030:26:2030:27 | Unary | r2030_7 | +| ir.cpp:2031:1:2031:1 | Address | &:r2031_1 | | ir.cpp:2033:6:2033:17 | ChiPartial | partial:m2033_3 | | ir.cpp:2033:6:2033:17 | ChiTotal | total:m2033_2 | | ir.cpp:2033:6:2033:17 | SideEffect | ~m2036_6 | @@ -9721,8 +9738,11 @@ | ir.cpp:2051:32:2051:32 | Address | &:r2051_7 | | ir.cpp:2051:32:2051:32 | Load | m2051_6 | | ir.cpp:2051:32:2051:32 | SideEffect | m2051_8 | +| ir.cpp:2056:5:2056:18 | Address | &:r2056_5 | | ir.cpp:2056:5:2056:18 | ChiPartial | partial:m2056_3 | | ir.cpp:2056:5:2056:18 | ChiTotal | total:m2056_2 | +| ir.cpp:2056:5:2056:18 | Load | m2066_2 | +| ir.cpp:2056:5:2056:18 | SideEffect | ~m2065_6 | | ir.cpp:2058:12:2058:13 | Address | &:r2058_1 | | ir.cpp:2058:17:2058:27 | Address | &:r2058_4 | | ir.cpp:2058:17:2058:27 | Address | &:r2058_8 | @@ -9796,6 +9816,7 @@ | ir.cpp:2065:12:2065:12 | Address | &:r2065_2 | | ir.cpp:2065:12:2065:12 | Arg(0) | 0:r2065_3 | | ir.cpp:2065:12:2065:12 | Load | m2064_15 | +| ir.cpp:2066:1:2066:1 | Address | &:r2066_1 | | ir.cpp:2070:6:2070:26 | ChiPartial | partial:m2070_3 | | ir.cpp:2070:6:2070:26 | ChiTotal | total:m2070_2 | | ir.cpp:2070:6:2070:26 | SideEffect | ~m2072_5 | @@ -9806,6 +9827,75 @@ | ir.cpp:2072:3:2072:27 | ChiTotal | total:m2070_4 | | ir.cpp:2072:3:2072:27 | SideEffect | ~m2070_4 | | ir.cpp:2072:29:2072:29 | Arg(0) | 0:r2072_2 | +| ir.cpp:2077:5:2077:11 | Address | &:r2077_6 | +| ir.cpp:2077:5:2077:11 | ChiPartial | partial:m2077_3 | +| ir.cpp:2077:5:2077:11 | ChiTotal | total:m2077_2 | +| ir.cpp:2077:5:2077:11 | Load | m2082_4 | +| ir.cpp:2077:5:2077:11 | SideEffect | ~m2081_4 | +| ir.cpp:2078:9:2078:9 | Address | &:r2078_1 | +| ir.cpp:2078:13:2078:15 | CallTarget | func:r2078_2 | +| ir.cpp:2078:13:2078:15 | ChiPartial | partial:m2078_6 | +| ir.cpp:2078:13:2078:15 | ChiTotal | total:m2077_4 | +| ir.cpp:2078:13:2078:15 | SideEffect | ~m2077_4 | +| ir.cpp:2078:13:2078:15 | StoreValue | r2078_5 | +| ir.cpp:2078:17:2078:17 | Arg(0) | 0:r2078_3 | +| ir.cpp:2078:19:2078:19 | Arg(1) | 1:r2078_4 | +| ir.cpp:2079:9:2079:9 | Address | &:r2079_1 | +| ir.cpp:2079:9:2079:9 | Left | r2079_2 | +| ir.cpp:2079:9:2079:9 | Load | m2078_8 | +| ir.cpp:2079:9:2079:14 | Condition | r2079_4 | +| ir.cpp:2079:14:2079:14 | Right | r2079_3 | +| ir.cpp:2080:9:2080:12 | CallTarget | func:r2080_1 | +| ir.cpp:2080:9:2080:12 | ChiPartial | partial:m2080_4 | +| ir.cpp:2080:9:2080:12 | ChiTotal | total:m2078_7 | +| ir.cpp:2080:9:2080:12 | SideEffect | ~m2078_7 | +| ir.cpp:2080:14:2080:14 | Arg(0) | 0:r2080_2 | +| ir.cpp:2081:5:2081:12 | CallTarget | func:r2081_1 | +| ir.cpp:2081:5:2081:12 | ChiPartial | partial:m2081_3 | +| ir.cpp:2081:5:2081:12 | ChiTotal | total:m2078_7 | +| ir.cpp:2081:5:2081:12 | SideEffect | ~m2078_7 | +| ir.cpp:2082:5:2082:13 | Address | &:r2082_1 | +| ir.cpp:2082:12:2082:12 | Address | &:r2082_2 | +| ir.cpp:2082:12:2082:12 | Load | m2078_8 | +| ir.cpp:2082:12:2082:12 | StoreValue | r2082_3 | +| ir.cpp:2085:6:2085:17 | ChiPartial | partial:m2085_3 | +| ir.cpp:2085:6:2085:17 | ChiTotal | total:m2085_2 | +| ir.cpp:2086:5:2086:12 | CallTarget | func:r2086_1 | +| ir.cpp:2086:5:2086:12 | ChiPartial | partial:m2086_3 | +| ir.cpp:2086:5:2086:12 | ChiTotal | total:m2085_4 | +| ir.cpp:2086:5:2086:12 | SideEffect | ~m2085_4 | +| ir.cpp:2087:5:2087:8 | CallTarget | func:r2087_1 | +| ir.cpp:2087:5:2087:8 | ChiPartial | partial:m2087_4 | +| ir.cpp:2087:5:2087:8 | ChiTotal | total:m2086_4 | +| ir.cpp:2087:5:2087:8 | SideEffect | ~m2086_4 | +| ir.cpp:2087:10:2087:10 | Arg(0) | 0:r2087_2 | +| ir.cpp:2090:5:2090:16 | Address | &:r2090_6 | +| ir.cpp:2090:5:2090:16 | ChiPartial | partial:m2090_3 | +| ir.cpp:2090:5:2090:16 | ChiTotal | total:m2090_2 | +| ir.cpp:2090:5:2090:16 | Load | m2095_4 | +| ir.cpp:2090:5:2090:16 | SideEffect | ~m2094_4 | +| ir.cpp:2091:9:2091:9 | Address | &:r2091_1 | +| ir.cpp:2091:13:2091:15 | CallTarget | func:r2091_2 | +| ir.cpp:2091:13:2091:15 | ChiPartial | partial:m2091_6 | +| ir.cpp:2091:13:2091:15 | ChiTotal | total:m2090_4 | +| ir.cpp:2091:13:2091:15 | SideEffect | ~m2090_4 | +| ir.cpp:2091:13:2091:15 | StoreValue | r2091_5 | +| ir.cpp:2091:17:2091:17 | Arg(0) | 0:r2091_3 | +| ir.cpp:2091:19:2091:19 | Arg(1) | 1:r2091_4 | +| ir.cpp:2092:9:2092:9 | Address | &:r2092_1 | +| ir.cpp:2092:9:2092:9 | Left | r2092_2 | +| ir.cpp:2092:9:2092:9 | Load | m2091_8 | +| ir.cpp:2092:9:2092:14 | Condition | r2092_4 | +| ir.cpp:2092:14:2092:14 | Right | r2092_3 | +| ir.cpp:2093:9:2093:20 | CallTarget | func:r2093_1 | +| ir.cpp:2094:5:2094:12 | CallTarget | func:r2094_1 | +| ir.cpp:2094:5:2094:12 | ChiPartial | partial:m2094_3 | +| ir.cpp:2094:5:2094:12 | ChiTotal | total:m2091_7 | +| ir.cpp:2094:5:2094:12 | SideEffect | ~m2091_7 | +| ir.cpp:2095:5:2095:13 | Address | &:r2095_1 | +| ir.cpp:2095:12:2095:12 | Address | &:r2095_2 | +| ir.cpp:2095:12:2095:12 | Load | m2091_8 | +| ir.cpp:2095:12:2095:12 | StoreValue | r2095_3 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 4f3f9315c0149..d2a11541fd129 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -12,13 +12,15 @@ unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1486:8:1486:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1486:8:1486:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:1751:51:1751:51 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1750:5:1750:34 | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | -| ir.cpp:1752:48:1752:48 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1750:5:1750:34 | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | int implicit_copy_constructor_test(CopyConstructorTestNonVirtualClass const&, CopyConstructorTestVirtualClass const&) | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | @@ -35,8 +37,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 8bb7c6dde6acd..0c4521f5e6add 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7201,21 +7201,26 @@ ir.cpp: # 1290| r1290_1(glval) = VariableAddress[b] : # 1290| r1290_2(bool) = Load[b] : &:r1290_1, ~m? # 1290| v1290_3(void) = ConditionalBranch : r1290_2 -#-----| False -> Block 2 -#-----| True -> Block 1 +#-----| False -> Block 3 +#-----| True -> Block 2 -# 1291| Block 1 -# 1291| r1291_1(glval) = VariableAddress[#return] : -# 1291| r1291_2(glval) = VariableAddress[x] : -# 1291| r1291_3(int) = Load[x] : &:r1291_2, ~m? -# 1291| mu1291_4(int) = Store[#return] : &:r1291_1, r1291_3 +# 1289| Block 1 # 1289| r1289_8(glval) = VariableAddress[#return] : # 1289| v1289_9(void) = ReturnValue : &:r1289_8, ~m? # 1289| v1289_10(void) = AliasedUse : ~m? # 1289| v1289_11(void) = ExitFunction : -# 1293| Block 2 -# 1293| v1293_1(void) = Unreached : +# 1291| Block 2 +# 1291| r1291_1(glval) = VariableAddress[#return] : +# 1291| r1291_2(glval) = VariableAddress[x] : +# 1291| r1291_3(int) = Load[x] : &:r1291_2, ~m? +# 1291| mu1291_4(int) = Store[#return] : &:r1291_1, r1291_3 +#-----| Goto -> Block 1 + +# 1293| Block 3 +# 1293| r1293_1(glval) = VariableAddress[#return] : +# 1293| mu1293_2(int) = Uninitialized[#return] : &:r1293_1 +#-----| Goto -> Block 1 # 1295| void returnVoid(int, int) # 1295| Block 0 @@ -9526,15 +9531,14 @@ ir.cpp: # 1754| mu1754_9(unknown) = ^CallSideEffect : ~m? # 1754| v1754_10(void) = ^BufferReadSideEffect[0] : &:r1754_7, ~m? # 1754| mu1754_11(CopyConstructorTestVirtualClass) = ^IndirectMayWriteSideEffect[-1] : &:r1754_1 -# 1755| v1755_1(void) = Unreached : - -# 1751| Block 1 -# 1751| v1751_5(void) = ReturnIndirection[x] : &:r1751_3, ~m? -# 1752| v1752_5(void) = ReturnIndirection[y] : &:r1752_3, ~m? -# 1750| r1750_4(glval) = VariableAddress[#return] : -# 1750| v1750_5(void) = ReturnValue : &:r1750_4, ~m? -# 1750| v1750_6(void) = AliasedUse : ~m? -# 1750| v1750_7(void) = ExitFunction : +# 1755| r1755_1(glval) = VariableAddress[#return] : +# 1755| mu1755_2(int) = Uninitialized[#return] : &:r1755_1 +# 1751| v1751_5(void) = ReturnIndirection[x] : &:r1751_3, ~m? +# 1752| v1752_5(void) = ReturnIndirection[y] : &:r1752_3, ~m? +# 1750| r1750_4(glval) = VariableAddress[#return] : +# 1750| v1750_5(void) = ReturnValue : &:r1750_4, ~m? +# 1750| v1750_6(void) = AliasedUse : ~m? +# 1750| v1750_7(void) = ExitFunction : # 1757| void if_initialization(int) # 1757| Block 0 @@ -10199,24 +10203,32 @@ ir.cpp: # 1900| r1900_3(int) = Constant[10] : # 1900| r1900_4(bool) = CompareLT : r1900_2, r1900_3 # 1900| v1900_5(void) = ConditionalBranch : r1900_4 -#-----| False -> Block 2 -#-----| True -> Block 1 +#-----| False -> Block 3 +#-----| True -> Block 2 -# 1901| Block 1 -# 1901| r1901_1(glval) = VariableAddress[#return] : -# 1901| r1901_2(glval) = VariableAddress[x] : -# 1901| r1901_3(int) = Load[x] : &:r1901_2, ~m? -# 1901| mu1901_4(int) = Store[#return] : &:r1901_1, r1901_3 +# 1899| Block 1 # 1899| r1899_6(glval) = VariableAddress[#return] : # 1899| v1899_7(void) = ReturnValue : &:r1899_6, ~m? # 1899| v1899_8(void) = AliasedUse : ~m? # 1899| v1899_9(void) = ExitFunction : -# 1903| Block 2 +# 1901| Block 2 +# 1901| r1901_1(glval) = VariableAddress[#return] : +# 1901| r1901_2(glval) = VariableAddress[x] : +# 1901| r1901_3(int) = Load[x] : &:r1901_2, ~m? +# 1901| mu1901_4(int) = Store[#return] : &:r1901_1, r1901_3 +#-----| Goto -> Block 1 + +# 1903| Block 3 # 1903| r1903_1(glval) = FunctionAddress[noreturnFunc] : # 1903| v1903_2(void) = Call[noreturnFunc] : func:r1903_1 # 1903| mu1903_3(unknown) = ^CallSideEffect : ~m? -# 1905| v1905_1(void) = Unreached : +# 1899| v1899_10(void) = Unreached : + +# 1905| Block 4 +# 1905| r1905_1(glval) = VariableAddress[#return] : +# 1905| mu1905_2(int) = Uninitialized[#return] : &:r1905_1 +#-----| Goto -> Block 1 # 1907| int noreturnTest2(int) # 1907| Block 0 @@ -11069,23 +11081,22 @@ ir.cpp: # 2028| r2028_3(unsigned int) = Constant[100] : # 2028| r2028_4(bool) = CompareLT : r2028_2, r2028_3 # 2028| v2028_5(void) = ConditionalBranch : r2028_4 -#-----| False -> Block 4 -#-----| True -> Block 3 - -# 2026| Block 1 -# 2026| r2026_6(glval) = VariableAddress[#return] : -# 2026| v2026_7(void) = ReturnValue : &:r2026_6, ~m? -# 2026| v2026_8(void) = AliasedUse : ~m? -# 2026| v2026_9(void) = ExitFunction : +#-----| False -> Block 3 +#-----| True -> Block 2 -# 2028| Block 2 +# 2028| Block 1 # 2028| r2028_6(glval) = VariableAddress[#temp2028:7] : # 2028| r2028_7(unsigned int) = Load[#temp2028:7] : &:r2028_6, ~m? # 2028| r2028_8(glval) = VariableAddress[y] : # 2028| mu2028_9(unsigned int) = Store[y] : &:r2028_8, r2028_7 -# 2031| v2031_1(void) = Unreached : - -# 2029| Block 3 +# 2031| r2031_1(glval) = VariableAddress[#return] : +# 2031| mu2031_2(unsigned int) = Uninitialized[#return] : &:r2031_1 +# 2026| r2026_6(glval) = VariableAddress[#return] : +# 2026| v2026_7(void) = ReturnValue : &:r2026_6, ~m? +# 2026| v2026_8(void) = AliasedUse : ~m? +# 2026| v2026_9(void) = ExitFunction : + +# 2029| Block 2 # 2029| r2029_1(glval) = FunctionAddress[CommaTestHelper] : # 2029| r2029_2(glval) = VariableAddress[x] : # 2029| r2029_3(unsigned int) = Load[x] : &:r2029_2, ~m? @@ -11096,9 +11107,9 @@ ir.cpp: # 2029| r2029_8(unsigned int) = CopyValue : r2029_7 # 2028| r2028_10(glval) = VariableAddress[#temp2028:7] : # 2028| mu2028_11(unsigned int) = Store[#temp2028:7] : &:r2028_10, r2029_8 -#-----| Goto -> Block 2 +#-----| Goto -> Block 1 -# 2030| Block 4 +# 2030| Block 3 # 2030| r2030_1(glval) = FunctionAddress[CommaTestHelper] : # 2030| r2030_2(glval) = VariableAddress[x] : # 2030| r2030_3(unsigned int) = Load[x] : &:r2030_2, ~m? @@ -11109,7 +11120,7 @@ ir.cpp: # 2030| r2030_8(unsigned int) = Convert : r2030_7 # 2028| r2028_12(glval) = VariableAddress[#temp2028:7] : # 2028| mu2028_13(unsigned int) = Store[#temp2028:7] : &:r2028_12, r2030_8 -#-----| Goto -> Block 2 +#-----| Goto -> Block 1 # 2033| void NewDeleteMem() # 2033| Block 0 @@ -11295,13 +11306,12 @@ ir.cpp: # 2065| r2065_3(Derived2 *) = Load[d] : &:r2065_2, ~m? # 2065| v2065_4(void) = Call[?] : func:r2065_1, 0:r2065_3 # 2065| mu2065_5(unknown) = ^CallSideEffect : ~m? -# 2066| v2066_1(void) = Unreached : - -# 2056| Block 1 -# 2056| r2056_4(glval) = VariableAddress[#return] : -# 2056| v2056_5(void) = ReturnValue : &:r2056_4, ~m? -# 2056| v2056_6(void) = AliasedUse : ~m? -# 2056| v2056_7(void) = ExitFunction : +# 2066| r2066_1(glval) = VariableAddress[#return] : +# 2066| mu2066_2(int) = Uninitialized[#return] : &:r2066_1 +# 2056| r2056_4(glval) = VariableAddress[#return] : +# 2056| v2056_5(void) = ReturnValue : &:r2056_4, ~m? +# 2056| v2056_6(void) = AliasedUse : ~m? +# 2056| v2056_7(void) = ExitFunction : # 2070| void test_constant_folding() # 2070| Block 0 @@ -11320,6 +11330,105 @@ ir.cpp: # 2070| v2070_5(void) = AliasedUse : ~m? # 2070| v2070_6(void) = ExitFunction : +# 2077| int NonExit() +# 2077| Block 0 +# 2077| v2077_1(void) = EnterFunction : +# 2077| mu2077_2(unknown) = AliasedDefinition : +# 2077| mu2077_3(unknown) = InitializeNonLocal : +# 2078| r2078_1(glval) = VariableAddress[x] : +# 2078| r2078_2(glval) = FunctionAddress[Add] : +# 2078| r2078_3(int) = Constant[3] : +# 2078| r2078_4(int) = Constant[4] : +# 2078| r2078_5(int) = Call[Add] : func:r2078_2, 0:r2078_3, 1:r2078_4 +# 2078| mu2078_6(unknown) = ^CallSideEffect : ~m? +# 2078| mu2078_7(int) = Store[x] : &:r2078_1, r2078_5 +# 2079| r2079_1(glval) = VariableAddress[x] : +# 2079| r2079_2(int) = Load[x] : &:r2079_1, ~m? +# 2079| r2079_3(int) = Constant[7] : +# 2079| r2079_4(bool) = CompareEQ : r2079_2, r2079_3 +# 2079| v2079_5(void) = ConditionalBranch : r2079_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2080| Block 1 +# 2080| r2080_1(glval) = FunctionAddress[exit] : +# 2080| r2080_2(int) = Constant[3] : +# 2080| v2080_3(void) = Call[exit] : func:r2080_1, 0:r2080_2 +# 2080| mu2080_4(unknown) = ^CallSideEffect : ~m? +# 2077| v2077_4(void) = Unreached : + +# 2081| Block 2 +# 2081| r2081_1(glval) = FunctionAddress[VoidFunc] : +# 2081| v2081_2(void) = Call[VoidFunc] : func:r2081_1 +# 2081| mu2081_3(unknown) = ^CallSideEffect : ~m? +# 2082| r2082_1(glval) = VariableAddress[#return] : +# 2082| r2082_2(glval) = VariableAddress[x] : +# 2082| r2082_3(int) = Load[x] : &:r2082_2, ~m? +# 2082| mu2082_4(int) = Store[#return] : &:r2082_1, r2082_3 +# 2077| r2077_5(glval) = VariableAddress[#return] : +# 2077| v2077_6(void) = ReturnValue : &:r2077_5, ~m? +# 2077| v2077_7(void) = AliasedUse : ~m? +# 2077| v2077_8(void) = ExitFunction : + +# 2085| void CallsNonExit() +# 2085| Block 0 +# 2085| v2085_1(void) = EnterFunction : +# 2085| mu2085_2(unknown) = AliasedDefinition : +# 2085| mu2085_3(unknown) = InitializeNonLocal : +# 2086| r2086_1(glval) = FunctionAddress[VoidFunc] : +# 2086| v2086_2(void) = Call[VoidFunc] : func:r2086_1 +# 2086| mu2086_3(unknown) = ^CallSideEffect : ~m? +# 2087| r2087_1(glval) = FunctionAddress[exit] : +# 2087| r2087_2(int) = Constant[3] : +# 2087| v2087_3(void) = Call[exit] : func:r2087_1, 0:r2087_2 +# 2087| mu2087_4(unknown) = ^CallSideEffect : ~m? +# 2085| v2085_4(void) = Unreached : + +# 2088| Block 1 +# 2088| v2088_1(void) = NoOp : +# 2085| v2085_5(void) = ReturnVoid : +# 2085| v2085_6(void) = AliasedUse : ~m? +# 2085| v2085_7(void) = ExitFunction : + +# 2090| int TransNonExit() +# 2090| Block 0 +# 2090| v2090_1(void) = EnterFunction : +# 2090| mu2090_2(unknown) = AliasedDefinition : +# 2090| mu2090_3(unknown) = InitializeNonLocal : +# 2091| r2091_1(glval) = VariableAddress[x] : +# 2091| r2091_2(glval) = FunctionAddress[Add] : +# 2091| r2091_3(int) = Constant[3] : +# 2091| r2091_4(int) = Constant[4] : +# 2091| r2091_5(int) = Call[Add] : func:r2091_2, 0:r2091_3, 1:r2091_4 +# 2091| mu2091_6(unknown) = ^CallSideEffect : ~m? +# 2091| mu2091_7(int) = Store[x] : &:r2091_1, r2091_5 +# 2092| r2092_1(glval) = VariableAddress[x] : +# 2092| r2092_2(int) = Load[x] : &:r2092_1, ~m? +# 2092| r2092_3(int) = Constant[7] : +# 2092| r2092_4(bool) = CompareEQ : r2092_2, r2092_3 +# 2092| v2092_5(void) = ConditionalBranch : r2092_4 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2093| Block 1 +# 2093| r2093_1(glval) = FunctionAddress[CallsNonExit] : +# 2093| v2093_2(void) = Call[CallsNonExit] : func:r2093_1 +# 2093| mu2093_3(unknown) = ^CallSideEffect : ~m? +#-----| Goto -> Block 2 + +# 2094| Block 2 +# 2094| r2094_1(glval) = FunctionAddress[VoidFunc] : +# 2094| v2094_2(void) = Call[VoidFunc] : func:r2094_1 +# 2094| mu2094_3(unknown) = ^CallSideEffect : ~m? +# 2095| r2095_1(glval) = VariableAddress[#return] : +# 2095| r2095_2(glval) = VariableAddress[x] : +# 2095| r2095_3(int) = Load[x] : &:r2095_2, ~m? +# 2095| mu2095_4(int) = Store[#return] : &:r2095_1, r2095_3 +# 2090| r2090_4(glval) = VariableAddress[#return] : +# 2090| v2090_5(void) = ReturnValue : &:r2090_4, ~m? +# 2090| v2090_6(void) = AliasedUse : ~m? +# 2090| v2090_7(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index 6fa6c863aeb3a..bee483d992b22 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -34,13 +34,15 @@ unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition | VacuousDestructorCall.cpp:2:29:2:29 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor(int, int*) | void CallDestructor(int, int*) | -| misc.c:219:47:219:48 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| ms_assume.cpp:11:30:11:33 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ms_assume.cpp:11:12:11:12 | int f(int, char*[]) | int f(int, char*[]) | | ms_try_except.cpp:9:19:9:19 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:9:19:9:19 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:19:17:19:21 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | @@ -58,8 +60,4 @@ thisArgumentIsNonPointer | pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index 5282982cef7fc..ae141f0631e35 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -1,12 +1,21 @@ edges | test.c:14:27:14:30 | argv indirection | test.c:21:18:21:23 | query1 indirection | +| test.c:14:27:14:30 | argv indirection | test.c:35:16:35:23 | userName indirection | +| test.c:35:16:35:23 | userName indirection | test.c:40:25:40:32 | username indirection | +| test.c:38:7:38:20 | globalUsername indirection | test.c:51:18:51:23 | query1 indirection | +| test.c:40:25:40:32 | username indirection | test.c:38:7:38:20 | globalUsername indirection | | test.cpp:39:27:39:30 | argv indirection | test.cpp:43:27:43:33 | access to array indirection | nodes | test.c:14:27:14:30 | argv indirection | semmle.label | argv indirection | | test.c:21:18:21:23 | query1 indirection | semmle.label | query1 indirection | +| test.c:35:16:35:23 | userName indirection | semmle.label | userName indirection | +| test.c:38:7:38:20 | globalUsername indirection | semmle.label | globalUsername indirection | +| test.c:40:25:40:32 | username indirection | semmle.label | username indirection | +| test.c:51:18:51:23 | query1 indirection | semmle.label | query1 indirection | | test.cpp:39:27:39:30 | argv indirection | semmle.label | argv indirection | | test.cpp:43:27:43:33 | access to array indirection | semmle.label | access to array indirection | subpaths #select | test.c:21:18:21:23 | query1 | test.c:14:27:14:30 | argv indirection | test.c:21:18:21:23 | query1 indirection | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | argv indirection | user input (a command-line argument) | +| test.c:51:18:51:23 | query1 | test.c:14:27:14:30 | argv indirection | test.c:51:18:51:23 | query1 indirection | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | argv indirection | user input (a command-line argument) | | test.cpp:43:27:43:33 | access to array | test.cpp:39:27:39:30 | argv indirection | test.cpp:43:27:43:33 | access to array indirection | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | argv indirection | user input (a command-line argument) | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test.c b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test.c index 45304f138720f..780a34ca1dc85 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test.c +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test.c @@ -8,7 +8,7 @@ int snprintf(char *s, size_t n, const char *format, ...); void sanitizeString(char *stringOut, size_t len, const char *strIn); int mysql_query(int arg1, const char *sqlArg); int atoi(const char *nptr); - +void exit(int i); ///// Test code ///// int main(int argc, char** argv) { @@ -31,4 +31,22 @@ int main(int argc, char** argv) { char query3[1000] = {0}; snprintf(query3, 1000, "SELECT UID FROM USERS where number = \"%i\"", userNumber); mysql_query(0, query3); // GOOD + + nonReturning(userName); +} + +char* globalUsername; + +void nonReturning(char* username) { + globalUsername = username; + badFunc(); + // This function does not return, so we used to lose the global flow here. + exit(0); +} + +void badFunc() { + char *userName = globalUsername; + char query1[1000] = {0}; + snprintf(query1, 1000, "SELECT UID FROM USERS where name = \"%s\"", userName); + mysql_query(0, query1); // BAD } diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected index 200db03712996..5fd06b5f95105 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-416/semmle/tests/UseAfterFree.expected @@ -9,8 +9,6 @@ edges | test.cpp:116:7:116:10 | data | test.cpp:119:6:119:9 | data | | test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | | test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | -| test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | -| test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | | test.cpp:164:9:164:9 | c | test.cpp:165:2:165:2 | c | | test.cpp:164:9:164:9 | c | test.cpp:166:3:166:4 | * ... | | test.cpp:164:9:164:9 | c | test.cpp:166:4:166:4 | c | @@ -39,9 +37,6 @@ nodes | test.cpp:127:7:127:10 | data | semmle.label | data | | test.cpp:127:7:127:10 | data | semmle.label | data | | test.cpp:130:6:130:9 | data | semmle.label | data | -| test.cpp:138:7:138:10 | data | semmle.label | data | -| test.cpp:138:7:138:10 | data | semmle.label | data | -| test.cpp:141:6:141:9 | data | semmle.label | data | | test.cpp:164:9:164:9 | c | semmle.label | c | | test.cpp:165:2:165:2 | c | semmle.label | c | | test.cpp:166:3:166:4 | * ... | semmle.label | * ... | @@ -72,8 +67,6 @@ subpaths | test.cpp:119:6:119:9 | data | test.cpp:116:7:116:10 | data | test.cpp:119:6:119:9 | data | Memory may have been previously freed by $@. | test.cpp:116:2:116:5 | call to free | call to free | | test.cpp:130:6:130:9 | data | test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | Memory may have been previously freed by $@. | test.cpp:127:2:127:5 | call to free | call to free | | test.cpp:130:6:130:9 | data | test.cpp:127:7:127:10 | data | test.cpp:130:6:130:9 | data | Memory may have been previously freed by $@. | test.cpp:127:2:127:5 | call to free | call to free | -| test.cpp:141:6:141:9 | data | test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | Memory may have been previously freed by $@. | test.cpp:138:2:138:5 | call to free | call to free | -| test.cpp:141:6:141:9 | data | test.cpp:138:7:138:10 | data | test.cpp:141:6:141:9 | data | Memory may have been previously freed by $@. | test.cpp:138:2:138:5 | call to free | call to free | | test.cpp:165:2:165:2 | c | test.cpp:164:9:164:9 | c | test.cpp:165:2:165:2 | c | Memory may have been previously freed by $@. | test.cpp:164:2:164:10 | delete | delete | | test.cpp:166:3:166:4 | * ... | test.cpp:164:9:164:9 | c | test.cpp:166:3:166:4 | * ... | Memory may have been previously freed by $@. | test.cpp:164:2:164:10 | delete | delete | | test.cpp:166:4:166:4 | c | test.cpp:164:9:164:9 | c | test.cpp:166:4:166:4 | c | Memory may have been previously freed by $@. | test.cpp:164:2:164:10 | delete | delete | diff --git a/csharp/.vscode/extensions.json b/csharp/.vscode/extensions.json index f3f5506ca7190..ac1e764ade71a 100644 --- a/csharp/.vscode/extensions.json +++ b/csharp/.vscode/extensions.json @@ -1,9 +1,7 @@ { "recommendations": [ - "formulahendry.dotnet-test-explorer", "gaoshan0621.csharp-format-usings", "github.vscode-codeql", - "hbenl.vscode-test-explorer", "ms-dotnettools.csharp", "ms-dotnettools.csdevkit" ], diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index d2644d326a4e0..eea83feb4913a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -557,7 +557,7 @@ public void TestVcVarsAllBatFiles() [Fact] public void TestLinuxBuildlessExtractionSuccess() { - actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone --references:."] = 0; + actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; @@ -571,7 +571,7 @@ public void TestLinuxBuildlessExtractionSuccess() [Fact] public void TestLinuxBuildlessExtractionFailed() { - actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone --references:."] = 10; + actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone"] = 10; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; @@ -585,7 +585,7 @@ public void TestLinuxBuildlessExtractionFailed() [Fact] public void TestLinuxBuildlessExtractionSolution() { - actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone foo.sln --references:."] = 0; + actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone foo.sln"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; @@ -873,7 +873,7 @@ public void TestSkipNugetMsBuild() [Fact] public void TestSkipNugetBuildless() { - actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone foo.sln --references:. --skip-nuget"] = 0; + actions.RunProcess[@"C:\codeql\csharp/tools/linux64/Semmle.Extraction.CSharp.Standalone foo.sln --skip-nuget"] = 0; actions.FileExists["csharp.log"] = true; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = ""; actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = ""; diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/Semmle.Autobuild.CSharp.Tests.csproj b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/Semmle.Autobuild.CSharp.Tests.csproj index ecc67fa569547..590c03738b00f 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/Semmle.Autobuild.CSharp.Tests.csproj +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/Semmle.Autobuild.CSharp.Tests.csproj @@ -8,12 +8,12 @@ - - + + all runtime; build; native; contentfiles; analyzers - + diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs index ed368d006bc39..8f576e7104d38 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/CSharpAutobuilder.cs @@ -48,8 +48,11 @@ public override BuildScript GetBuildScript() attempt = new BuildCommandRule(DotNetRule.WithDotNet).Analyse(this, false) & CheckExtractorRun(true); break; case CSharpBuildStrategy.Buildless: - // No need to check that the extractor has been executed in buildless mode - attempt = new StandaloneBuildRule().Analyse(this, false); + attempt = DotNetRule.WithDotNet(this, (dotNetPath, env) => + { + // No need to check that the extractor has been executed in buildless mode + return new StandaloneBuildRule(dotNetPath).Analyse(this, false); + }); break; case CSharpBuildStrategy.MSBuild: attempt = new MsBuildRule().Analyse(this, false) & CheckExtractorRun(true); diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs index 9a161414a03a8..f7112ada31ece 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs @@ -70,7 +70,16 @@ public BuildScript Analyse(IAutobuilder builder, bool au }); } - private static BuildScript WithDotNet(IAutobuilder builder, Func?, BuildScript> f) + /// + /// Returns a script that attempts to download relevant version(s) of the + /// .NET Core SDK, followed by running the script generated by . + /// + /// The arguments to are the path to the directory in which the + /// .NET Core SDK(s) were installed and any additional required environment + /// variables needed by the installed .NET Core (null when no variables + /// are needed). + /// + public static BuildScript WithDotNet(IAutobuilder builder, Func?, BuildScript> f) { var installDir = builder.Actions.PathCombine(builder.Options.RootDirectory, ".dotnet"); var installScript = DownloadDotNet(builder, installDir); diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj b/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj index 6edc9fdcd97df..1083564dd2623 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/Semmle.Autobuild.CSharp.csproj @@ -3,9 +3,9 @@ net7.0 Semmle.Autobuild.CSharp Semmle.Autobuild.CSharp - + Exe - + false win-x64;linux-x64;osx-x64 enable @@ -14,8 +14,8 @@ - - + + diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs index 207ecd70f0ab3..80931d67d7ca4 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp/StandaloneBuildRule.cs @@ -8,6 +8,13 @@ namespace Semmle.Autobuild.CSharp /// internal class StandaloneBuildRule : IBuildRule { + private readonly string? dotNetPath; + + internal StandaloneBuildRule(string? dotNetPath) + { + this.dotNetPath = dotNetPath; + } + public BuildScript Analyse(IAutobuilder builder, bool auto) { BuildScript GetCommand(string? solution) @@ -28,13 +35,17 @@ BuildScript GetCommand(string? solution) if (solution is not null) cmd.QuoteArgument(solution); - cmd.Argument("--references:."); - if (!builder.Options.NugetRestore) { cmd.Argument("--skip-nuget"); } + if (!string.IsNullOrEmpty(this.dotNetPath)) + { + cmd.Argument("--dotnet"); + cmd.QuoteArgument(this.dotNetPath); + } + return cmd.Script; } diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Semmle.Autobuild.Shared.csproj b/csharp/autobuilder/Semmle.Autobuild.Shared/Semmle.Autobuild.Shared.csproj index 83c53552cc0ad..7a1f537fe757a 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Semmle.Autobuild.Shared.csproj +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Semmle.Autobuild.Shared.csproj @@ -11,7 +11,7 @@ - + diff --git a/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/old.dbscheme b/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/old.dbscheme new file mode 100644 index 0000000000000..585d6402ff8ba --- /dev/null +++ b/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/old.dbscheme @@ -0,0 +1,2078 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @utf16_string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr | @urshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_field | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/semmlecode.csharp.dbscheme b/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/semmlecode.csharp.dbscheme new file mode 100644 index 0000000000000..cd877b8cc2fb8 --- /dev/null +++ b/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/semmlecode.csharp.dbscheme @@ -0,0 +1,2078 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @utf16_string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr | @urshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_field | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/upgrade.properties b/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/upgrade.properties new file mode 100644 index 0000000000000..f0f46f876de7d --- /dev/null +++ b/csharp/downgrades/585d6402ff8ba3d15114a869d205bdf6d4e0aa3f/upgrade.properties @@ -0,0 +1,2 @@ +description: Update the schemas for some tables to disallow assembly locations. +compatibility: full diff --git a/csharp/extractor/Semmle.Extraction.CIL/Semmle.Extraction.CIL.csproj b/csharp/extractor/Semmle.Extraction.CIL/Semmle.Extraction.CIL.csproj index c37242cd890e3..5bf70a9346b17 100644 --- a/csharp/extractor/Semmle.Extraction.CIL/Semmle.Extraction.CIL.csproj +++ b/csharp/extractor/Semmle.Extraction.CIL/Semmle.Extraction.CIL.csproj @@ -24,7 +24,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/AssemblyCache.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/AssemblyCache.cs index ce64445d40fa6..75bfbc0e7787b 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/AssemblyCache.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/AssemblyCache.cs @@ -15,14 +15,24 @@ internal class AssemblyCache /// /// Locate all reference files and index them. /// - /// Directories to search. + /// + /// Paths to search. Directories are searched recursively. Files are added directly to the + /// assembly cache. + /// /// Callback for progress. - public AssemblyCache(IEnumerable dirs, ProgressMonitor progressMonitor) + public AssemblyCache(IEnumerable paths, ProgressMonitor progressMonitor) { - foreach (var dir in dirs) + foreach (var path in paths) { - progressMonitor.FindingFiles(dir); - AddReferenceDirectory(dir); + if (File.Exists(path)) + { + pendingDllsToIndex.Enqueue(path); + } + else + { + progressMonitor.FindingFiles(path); + AddReferenceDirectory(path); + } } IndexReferences(); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index f7b4ec3263bbe..6644e003872c2 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; @@ -31,6 +31,7 @@ public sealed class DependencyManager : IDisposable private readonly FileContent fileContent; private readonly TemporaryDirectory packageDirectory; private TemporaryDirectory? razorWorkingDirectory; + private readonly Git git; /// @@ -48,7 +49,7 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg try { - this.dotnet = new DotNet(progressMonitor); + this.dotnet = new DotNet(options, progressMonitor); } catch { @@ -68,7 +69,11 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg ? new[] { options.SolutionFile } : allFiles.SelectFileNamesByExtension(".sln"); - var dllDirNames = options.DllDirs.Select(Path.GetFullPath).ToList(); + // If DLL reference paths are specified on the command-line, use those to discover + // assemblies. Otherwise (the default), query the git CLI to determine which DLL files + // are tracked as part of the repository. + this.git = new Git(this.progressMonitor); + var dllDirNames = options.DllDirs.Count == 0 ? this.git.ListFiles("*.dll") : options.DllDirs.Select(Path.GetFullPath).ToList(); // Find DLLs in the .Net / Asp.Net Framework if (options.ScanNetFrameworkDlls) @@ -98,13 +103,9 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg progressMonitor.MissingNuGet(); } - // TODO: remove the below when the required SDK is installed - using (new FileRenamer(sourceDir.GetFiles("global.json", SearchOption.AllDirectories))) - { - Restore(solutions); - Restore(allProjects); - DownloadMissingPackages(allFiles); - } + Restore(solutions); + Restore(allProjects); + DownloadMissingPackages(allFiles); } assemblyCache = new AssemblyCache(dllDirNames, progressMonitor); @@ -157,7 +158,6 @@ private void GenerateSourceFilesFromWebViews(List allFiles) { progressMonitor.LogInfo($"Found {views.Length} cshtml and razor files."); - // TODO: use SDK specified in global.json var sdk = new Sdk(dotnet).GetNewestSdk(); if (sdk != null) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyOptions.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyOptions.cs index c669e649aeee4..7cb2cf7ffa6d6 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyOptions.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyOptions.cs @@ -51,6 +51,11 @@ public interface IDependencyOptions /// The number of threads to use. /// int Threads { get; } + + /// + /// The path to the local ".dotnet" directory, if any. + /// + string? DotNetPath { get; } } public class DependencyOptions : IDependencyOptions @@ -73,5 +78,7 @@ public bool ExcludesFile(string path) => Excludes.Any(path.Contains); public int Threads { get; set; } = EnvironmentVariables.GetDefaultNumberOfThreads(); + + public string? DotNetPath { get; set; } = null; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index 9094a2d1ebb23..35c541a195f23 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using Semmle.Util; namespace Semmle.Extraction.CSharp.DependencyFetching @@ -10,12 +11,13 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// internal class DotNet : IDotNet { - private const string dotnet = "dotnet"; private readonly ProgressMonitor progressMonitor; + private readonly string dotnet; - public DotNet(ProgressMonitor progressMonitor) + public DotNet(IDependencyOptions options, ProgressMonitor progressMonitor) { this.progressMonitor = progressMonitor; + this.dotnet = Path.Combine(options.DotNetPath ?? string.Empty, "dotnet"); Info(); } @@ -29,7 +31,7 @@ private void Info() } } - private static ProcessStartInfo MakeDotnetStartInfo(string args, bool redirectStandardOutput) => + private ProcessStartInfo MakeDotnetStartInfo(string args, bool redirectStandardOutput) => new ProcessStartInfo(dotnet, args) { UseShellExecute = false, @@ -39,7 +41,7 @@ private static ProcessStartInfo MakeDotnetStartInfo(string args, bool redirectSt private bool RunCommand(string args) { progressMonitor.RunningProcess($"{dotnet} {args}"); - using var proc = Process.Start(MakeDotnetStartInfo(args, redirectStandardOutput: false)); + using var proc = Process.Start(this.MakeDotnetStartInfo(args, redirectStandardOutput: false)); proc?.WaitForExit(); var exitCode = proc?.ExitCode ?? -1; if (exitCode != 0) @@ -77,7 +79,7 @@ public bool AddPackage(string folder, string package) private IList GetListed(string args, string artifact) { progressMonitor.RunningProcess($"{dotnet} {args}"); - var pi = MakeDotnetStartInfo(args, redirectStandardOutput: true); + var pi = this.MakeDotnetStartInfo(args, redirectStandardOutput: true); var exitCode = pi.ReadOutput(out var artifacts); if (exitCode != 0) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Git.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Git.cs new file mode 100644 index 0000000000000..d8baf49483b6f --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Git.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + /// + /// Utilities for querying information from the git CLI. + /// + internal class Git + { + private readonly ProgressMonitor progressMonitor; + private const string git = "git"; + + public Git(ProgressMonitor progressMonitor) + { + this.progressMonitor = progressMonitor; + } + + /// + /// Lists all files matching which are tracked in the + /// current git repository. + /// + /// The file pattern. + /// A list of all tracked files which match . + /// + public List ListFiles(string pattern) + { + var results = new List(); + var args = string.Join(' ', "ls-files", $"\"{pattern}\""); + + progressMonitor.RunningProcess($"{git} {args}"); + var pi = new ProcessStartInfo(git, args) + { + UseShellExecute = false, + RedirectStandardOutput = true + }; + + using var p = new Process() { StartInfo = pi }; + p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + { + if (!string.IsNullOrWhiteSpace(e.Data)) + { + results.Add(e.Data); + } + }); + p.Start(); + p.BeginOutputReadLine(); + p.WaitForExit(); + + if (p.ExitCode != 0) + { + progressMonitor.CommandFailed(git, args, p.ExitCode); + throw new Exception($"{git} {args} failed"); + } + + return results; + } + + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs index 1965296681a8f..07c45e375dec8 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs @@ -50,6 +50,9 @@ public override bool HandleOption(string key, string value) case "references": dependencies.DllDirs.Add(value); return true; + case "dotnet": + dependencies.DotNetPath = value; + return true; default: return base.HandleOption(key, value); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Semmle.Extraction.CSharp.Standalone.csproj b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Semmle.Extraction.CSharp.Standalone.csproj index 38ba70ce28536..525b1081bff49 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Semmle.Extraction.CSharp.Standalone.csproj +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Semmle.Extraction.CSharp.Standalone.csproj @@ -6,7 +6,7 @@ Semmle.Extraction.CSharp.Standalone false false - + win-x64;linux-x64;osx-x64 enable @@ -19,7 +19,7 @@ - + diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs index 59bb0bee4dd8d..8c93d630d1556 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; +using Semmle.Util; namespace Semmle.Extraction.CSharp.Entities { @@ -82,8 +84,15 @@ protected void PopulateType(TextWriter trapFile, bool constructUnderlyingTupleTy var baseTypes = GetBaseTypeDeclarations(); + var hasExpandingCycle = GenericsRecursionGraph.HasExpandingCycle(Symbol); + if (hasExpandingCycle) + { + Context.ExtractionError("Found recursive generic inheritance hierarchy. Base class of type is not extracted", Symbol.ToDisplayString(), Context.CreateLocation(ReportingLocation), severity: Util.Logging.Severity.Warning); + } + // Visit base types - if (Symbol.GetNonObjectBaseType(Context) is INamedTypeSymbol @base) + if (!hasExpandingCycle + && Symbol.GetNonObjectBaseType(Context) is INamedTypeSymbol @base) { var bts = GetBaseTypeDeclarations(baseTypes, @base); @@ -241,41 +250,44 @@ public void ExtractRecursive() /// public void PopulateGenerics() { - if (Symbol is null || !NeedsPopulation || !Context.ExtractGenerics(this)) - return; + Context.PopulateLater(() => + { + if (Symbol is null || !NeedsPopulation || !Context.ExtractGenerics(this)) + return; - var members = new List(); + var members = new List(); - foreach (var member in Symbol.GetMembers()) - members.Add(member); - foreach (var member in Symbol.GetTypeMembers()) - members.Add(member); + foreach (var member in Symbol.GetMembers()) + members.Add(member); + foreach (var member in Symbol.GetTypeMembers()) + members.Add(member); - // Mono extractor puts all BASE interface members as members of the current interface. + // Mono extractor puts all BASE interface members as members of the current interface. - if (Symbol.TypeKind == TypeKind.Interface) - { - foreach (var baseInterface in Symbol.Interfaces) + if (Symbol.TypeKind == TypeKind.Interface) { - foreach (var member in baseInterface.GetMembers()) - members.Add(member); - foreach (var member in baseInterface.GetTypeMembers()) - members.Add(member); + foreach (var baseInterface in Symbol.Interfaces) + { + foreach (var member in baseInterface.GetMembers()) + members.Add(member); + foreach (var member in baseInterface.GetTypeMembers()) + members.Add(member); + } } - } - foreach (var member in members) - { - Context.CreateEntity(member); - } + foreach (var member in members) + { + Context.CreateEntity(member); + } - if (Symbol.BaseType is not null) - Create(Context, Symbol.BaseType).PopulateGenerics(); + if (Symbol.BaseType is not null) + Create(Context, Symbol.BaseType).PopulateGenerics(); - foreach (var i in Symbol.Interfaces) - { - Create(Context, i).PopulateGenerics(); - } + foreach (var i in Symbol.Interfaces) + { + Create(Context, i).PopulateGenerics(); + } + }, preserveDuplicationKey: false); } public void ExtractRecursive(TextWriter trapFile, IEntity parent) @@ -347,6 +359,197 @@ public override bool Equals(object? obj) } public override int GetHashCode() => SymbolEqualityComparer.Default.GetHashCode(Symbol); + + /// + /// Class to detect recursive generic inheritance hierarchies. + /// + /// Details can be found in https://www.ecma-international.org/wp-content/uploads/ECMA-335_6th_edition_june_2012.pdf Chapter II.9.2 Generics and recursive inheritance graphs + /// The dotnet runtime already implements this check as a runtime validation: https://github.com/dotnet/runtime/blob/e48e88d0fe9c2e494c0e6fd0c7c1fb54e7ddbdb1/src/coreclr/vm/generics.cpp#L748 + /// + private class GenericsRecursionGraph + { + private static readonly ConcurrentDictionary resultCache = new(SymbolEqualityComparer.Default); + + /// + /// Checks whether the given type has a recursive generic inheritance hierarchy. The result is cached. + /// + public static bool HasExpandingCycle(ITypeSymbol start) + { + if (start.OriginalDefinition is not INamedTypeSymbol namedTypeDefinition || + !namedTypeDefinition.IsGenericType) + { + return false; + } + + return resultCache.GetOrAdd(namedTypeDefinition, nt => new GenericsRecursionGraph(nt).HasExpandingCycle()); + } + + private readonly INamedTypeSymbol startSymbol; + private readonly HashSet instantiationClosure = new(SymbolEqualityComparer.Default); + private readonly Dictionary> edges = new(SymbolEqualityComparer.Default); + + private GenericsRecursionGraph(INamedTypeSymbol startSymbol) + { + this.startSymbol = startSymbol; + + ComputeInstantiationClosure(); + ComputeGraphEdges(); + } + + private void ComputeGraphEdges() + { + foreach (var reference in instantiationClosure) + { + var definition = reference.OriginalDefinition; + if (SymbolEqualityComparer.Default.Equals(reference, definition)) + { + // It's a definition, so no edges + continue; + } + + for (var i = 0; i < reference.TypeArguments.Length; i++) + { + var target = definition.TypeParameters[i]; + if (reference.TypeArguments[i] is ITypeParameterSymbol source) + { + // non-expanding + edges.AddAnother(source, (target, false)); + } + else if (reference.TypeArguments[i] is INamedTypeSymbol namedType) + { + // expanding + var sources = GetAllNestedTypeParameters(namedType); + foreach (var s in sources) + { + edges.AddAnother(s, (target, true)); + } + } + } + } + } + + private static List GetAllNestedTypeParameters(INamedTypeSymbol symbol) + { + var res = new List(); + + void AddTypeParameters(INamedTypeSymbol symbol) + { + foreach (var typeArgument in symbol.TypeArguments) + { + if (typeArgument is ITypeParameterSymbol typeParameter) + { + res.Add(typeParameter); + } + else if (typeArgument is INamedTypeSymbol namedType) + { + AddTypeParameters(namedType); + } + } + } + + AddTypeParameters(symbol); + + return res; + } + + private void ComputeInstantiationClosure() + { + var workQueue = new Queue(); + workQueue.Enqueue(startSymbol); + + while (workQueue.Count > 0) + { + var current = workQueue.Dequeue(); + if (instantiationClosure.Contains(current) || + !current.IsGenericType) + { + continue; + } + + instantiationClosure.Add(current); + + if (SymbolEqualityComparer.Default.Equals(current, current.OriginalDefinition)) + { + // Definition, so enqueue all base types and interfaces + if (current.BaseType != null) + { + workQueue.Enqueue(current.BaseType); + } + + foreach (var i in current.Interfaces) + { + workQueue.Enqueue(i); + } + } + else + { + // Reference, so enqueue all type arguments and their original definitions: + foreach (var namedTypeArgument in current.TypeArguments.OfType()) + { + workQueue.Enqueue(namedTypeArgument); + workQueue.Enqueue(namedTypeArgument.OriginalDefinition); + } + } + } + } + + private bool HasExpandingCycle() + { + return startSymbol.TypeParameters.Any(HasExpandingCycle); + } + + private bool HasExpandingCycle(ITypeParameterSymbol start) + { + var visited = new HashSet(SymbolEqualityComparer.Default); + var path = new List(); + var hasExpandingCycle = HasExpandingCycle(start, visited, path, hasSeenExpandingEdge: false); + return hasExpandingCycle; + } + + private List<(ITypeParameterSymbol To, bool IsExpanding)> GetOutgoingEdges(ITypeParameterSymbol typeParameter) + { + return edges.TryGetValue(typeParameter, out var outgoingEdges) + ? outgoingEdges + : new List<(ITypeParameterSymbol, bool)>(); + } + + /// + /// A modified cycle detection algorithm based on DFS. + /// + /// The current node that is being visited + /// The nodes that have already been visited by any path. + /// The nodes already visited on the current path. + /// Whether an expanding edge was already seen in this path. We're looking for a cycle that has at least one expanding edge. + /// + private bool HasExpandingCycle(ITypeParameterSymbol current, HashSet visited, List currentPath, bool hasSeenExpandingEdge) + { + if (currentPath.Count > 0 && SymbolEqualityComparer.Default.Equals(current, currentPath[0])) + { + return hasSeenExpandingEdge; + } + + if (visited.Contains(current)) + { + return false; + } + + visited.Add(current); + currentPath.Add(current); + + var outgoingEdges = GetOutgoingEdges(current); + + foreach (var outgoingEdge in outgoingEdges) + { + if (HasExpandingCycle(outgoingEdge.To, visited, currentPath, hasSeenExpandingEdge: hasSeenExpandingEdge || outgoingEdge.IsExpanding)) + { + return true; + } + } + + currentPath.RemoveAt(currentPath.Count - 1); + return false; + } + } } internal abstract class Type : Type where T : ITypeSymbol diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Semmle.Extraction.CSharp.csproj b/csharp/extractor/Semmle.Extraction.CSharp/Semmle.Extraction.CSharp.csproj index 4227a1df71015..a06a1df38f267 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Semmle.Extraction.CSharp.csproj +++ b/csharp/extractor/Semmle.Extraction.CSharp/Semmle.Extraction.CSharp.csproj @@ -18,7 +18,7 @@ - - + + \ No newline at end of file diff --git a/csharp/extractor/Semmle.Extraction.Tests/Semmle.Extraction.Tests.csproj b/csharp/extractor/Semmle.Extraction.Tests/Semmle.Extraction.Tests.csproj index 4e04bafc638ec..92bf46deb44f0 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Semmle.Extraction.Tests.csproj +++ b/csharp/extractor/Semmle.Extraction.Tests/Semmle.Extraction.Tests.csproj @@ -8,12 +8,12 @@ - - + + all runtime; build; native; contentfiles; analyzers - + diff --git a/csharp/extractor/Semmle.Extraction/Context.cs b/csharp/extractor/Semmle.Extraction/Context.cs index 6694757f0d837..a6442758daf23 100644 --- a/csharp/extractor/Semmle.Extraction/Context.cs +++ b/csharp/extractor/Semmle.Extraction/Context.cs @@ -153,9 +153,9 @@ internal void AddFreshLabel(Entity entity) /// Enqueue the given action to be performed later. /// /// The action to run. - public void PopulateLater(Action a) + public void PopulateLater(Action a, bool preserveDuplicationKey = true) { - var key = GetCurrentTagStackKey(); + var key = preserveDuplicationKey ? GetCurrentTagStackKey() : null; if (key is not null) { // If we are currently executing with a duplication guard, then the same diff --git a/csharp/extractor/Semmle.Extraction/Semmle.Extraction.csproj b/csharp/extractor/Semmle.Extraction/Semmle.Extraction.csproj index 1c15b614ce419..433bb15ab1f31 100644 --- a/csharp/extractor/Semmle.Extraction/Semmle.Extraction.csproj +++ b/csharp/extractor/Semmle.Extraction/Semmle.Extraction.csproj @@ -12,9 +12,9 @@ TRACE;DEBUG;DEBUG_LABELS - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/csharp/extractor/Semmle.Util.Tests/Semmle.Util.Tests.csproj b/csharp/extractor/Semmle.Util.Tests/Semmle.Util.Tests.csproj index cb362f6df3307..384555bf18cf6 100644 --- a/csharp/extractor/Semmle.Util.Tests/Semmle.Util.Tests.csproj +++ b/csharp/extractor/Semmle.Util.Tests/Semmle.Util.Tests.csproj @@ -6,12 +6,12 @@ enable - - + + all runtime; build; native; contentfiles; analyzers - + diff --git a/csharp/extractor/Semmle.Util/Semmle.Util.csproj b/csharp/extractor/Semmle.Util/Semmle.Util.csproj index b2f1548488606..894488f9f842e 100644 --- a/csharp/extractor/Semmle.Util/Semmle.Util.csproj +++ b/csharp/extractor/Semmle.Util/Semmle.Util.csproj @@ -15,7 +15,7 @@ - + diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/ExtractortMessages.expected b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/ExtractortMessages.expected new file mode 100644 index 0000000000000..88d88c203f290 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/ExtractortMessages.expected @@ -0,0 +1,4 @@ +| test.cs:2:14:2:20 | Found recursive generic inheritance hierarchy. Base class of type is not extracted | 4 | GenB> | +| test.cs:2:14:2:20 | Found recursive generic inheritance hierarchy. Base class of type is not extracted | 4 | GenB> | +| test.cs:2:14:2:20 | Found recursive generic inheritance hierarchy. Base class of type is not extracted | 4 | GenB | +| test.cs:2:14:2:20 | Found recursive generic inheritance hierarchy. Base class of type is not extracted | 4 | GenB | diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/ExtractortMessages.ql b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/ExtractortMessages.ql new file mode 100644 index 0000000000000..10b9822fc2e6c --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/ExtractortMessages.ql @@ -0,0 +1,6 @@ +import csharp +import semmle.code.csharp.commons.Diagnostics + +query predicate extractorMessages(ExtractorMessage msg, int severity, string elementText) { + msg.getSeverity() = severity and msg.getElementText() = elementText +} diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/Types.expected b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/Types.expected new file mode 100644 index 0000000000000..1d9a1d04aff99 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/Types.expected @@ -0,0 +1,35 @@ +| test.cs:1:14:1:20 | GenA<> | System.Object | +| test.cs:1:14:1:20 | GenA>> | System.Object | +| test.cs:1:14:1:20 | GenA>> | System.Object | +| test.cs:2:14:2:20 | GenB<> | System.Object | +| test.cs:2:14:2:20 | GenB> | System.Object | +| test.cs:2:14:2:20 | GenB> | System.Object | +| test.cs:2:14:2:20 | GenB | System.Object | +| test.cs:4:7:4:10 | P<> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:4:7:4:10 | P> | System.Object | +| test.cs:5:7:5:13 | C<,> | P> | +| test.cs:5:7:5:13 | C | P> | +| test.cs:5:7:5:13 | C | P> | +| test.cs:5:7:5:13 | C | P> | +| test.cs:5:7:5:13 | C | P> | +| test.cs:5:7:5:13 | C | P> | +| test.cs:6:7:6:13 | D<,> | P> | +| test.cs:6:7:6:13 | D | P> | +| test.cs:6:7:6:13 | D | P> | +| test.cs:6:7:6:13 | D | P> | +| test.cs:6:7:6:13 | D | P> | +| test.cs:6:7:6:13 | D | P> | +| test.cs:8:7:8:10 | A<> | System.Object | +| test.cs:8:7:8:10 | A | System.Object | +| test.cs:13:14:13:18 | Class | System.Object | diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/Types.ql b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/Types.ql new file mode 100644 index 0000000000000..c7b1545c51d27 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/Types.ql @@ -0,0 +1,5 @@ +import csharp + +from Class c +where c.fromSource() +select c, c.getBaseClass().getQualifiedName() diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.cs b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.cs new file mode 100644 index 0000000000000..35f5c68d5fa7d --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.cs @@ -0,0 +1,23 @@ +public class GenA { }; +public class GenB : GenA>> { }; + +class P { } +class C : P> { } +class D : P> { } + +class A : System.IEquatable> +{ + public bool Equals(A other) { return true; } +} + +public class Class +{ + public static int Main() + { + GenB a = new GenB(); + P> b = new C(); + A c = new A(); + + return 0; + } +} diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.csproj b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.csproj new file mode 100644 index 0000000000000..97ae9f860c19b --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.csproj @@ -0,0 +1,12 @@ + + + + Exe + net7.0 + + + + + + + diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.py b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.py new file mode 100644 index 0000000000000..24cc83b4f2db9 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/test.py @@ -0,0 +1,3 @@ +from create_database_utils import * + +run_codeql_database_create(['dotnet build'], lang="csharp", extra_args=["--extractor-option=cil=false"]) diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py b/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py index 52a0be310ccfe..65e8309dac02b 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py +++ b/csharp/ql/integration-tests/all-platforms/dotnet_run/test.py @@ -53,3 +53,8 @@ def check_build_out(msg, s): s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test7-db', 'dotnet build', 'dotnet run --no-build hello world'], "test8-db") check_build_out("hello, world", s) check_diagnostics(test_db="test8-db") + +# two arguments, no '--' (first argument quoted) +s = run_codeql_database_create_stdout(['dotnet clean', 'rm -rf test8-db', 'dotnet run "hello world part1" part2'], "test9-db") +check_build_out("hello world part1, part2", s) +check_diagnostics(test_db="test9-db") diff --git a/csharp/ql/integration-tests/posix-only/dotnet_test/dotnet_test.csproj b/csharp/ql/integration-tests/posix-only/dotnet_test/dotnet_test.csproj index 5ea4974db7ff9..968726df75663 100644 --- a/csharp/ql/integration-tests/posix-only/dotnet_test/dotnet_test.csproj +++ b/csharp/ql/integration-tests/posix-only/dotnet_test/dotnet_test.csproj @@ -8,10 +8,10 @@ - + - - + + diff --git a/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj b/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj index dfa6909c44bcd..95c7586e04eb4 100644 --- a/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj +++ b/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj @@ -10,10 +10,10 @@ - - - - + + + + diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 308df381a1213..f4b5abf69c6ea 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -1165,8 +1165,14 @@ private module ArgumentNodes { ) { e1.(Argument).isArgumentOf(e2, _) and exactScope = false and - scope = e2 and - isSuccessor = true + isSuccessor = true and + if e2 instanceof PropertyWrite + then + exists(AssignableDefinition def | + def.getTargetAccess() = e2 and + scope = def.getExpr() + ) + else scope = e2 } } diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index cd877b8cc2fb8..585d6402ff8ba 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -136,7 +136,7 @@ diagnostics( string error_tag: string ref, string error_message: string ref, string full_error_message: string ref, - int location: @location_default ref + int location: @location ref ); extractor_messages( @@ -145,7 +145,7 @@ extractor_messages( string origin : string ref, string text : string ref, string entity : string ref, - int location: @location_default ref, + int location: @location ref, string stack_trace : string ref ); diff --git a/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/old.dbscheme b/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/old.dbscheme new file mode 100644 index 0000000000000..cd877b8cc2fb8 --- /dev/null +++ b/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/old.dbscheme @@ -0,0 +1,2078 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @utf16_string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr | @urshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_field | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/semmlecode.csharp.dbscheme new file mode 100644 index 0000000000000..585d6402ff8ba --- /dev/null +++ b/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/semmlecode.csharp.dbscheme @@ -0,0 +1,2078 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | f1.cs + * 3 | f2.cs + * 4 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event | @operator; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +@has_scoped_annotation = @local_scope_variable + +scoped_annotation( + int id: @has_scoped_annotation ref, + int kind: int ref // scoped ref = 1, scoped value = 2 + ); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @utf16_string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* C# 11.0 */ +| 131 = @list_pattern_expr +| 132 = @slice_pattern_expr +| 133 = @urshift_expr +| 134 = @assign_urshift_expr +| 135 = @utf8_string_literal_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@string_literal_expr = @utf16_string_literal_expr | @utf8_string_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr | @urshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_field | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/upgrade.properties b/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/upgrade.properties new file mode 100644 index 0000000000000..f73a420a1425a --- /dev/null +++ b/csharp/ql/lib/upgrades/cd877b8cc2fb8327499f96fbefd01bb988b2ed63/upgrade.properties @@ -0,0 +1,2 @@ +description: Update the schemas for some tables to allow assembly locations. +compatibility: full diff --git a/csharp/ql/test/library-tests/csharp7/TupleExpr.expected b/csharp/ql/test/library-tests/csharp7/TupleExpr.expected index ed5c61051c148..66ceb61382b57 100644 --- a/csharp/ql/test/library-tests/csharp7/TupleExpr.expected +++ b/csharp/ql/test/library-tests/csharp7/TupleExpr.expected @@ -40,8 +40,8 @@ | CSharp7.cs:87:18:87:34 | (..., ...) | CSharp7.cs:87:18:87:34 | (String,String) | 1 | CSharp7.cs:87:30:87:33 | "X2" | | CSharp7.cs:88:9:88:24 | (..., ...) | CSharp7.cs:87:18:87:34 | (String,String) | 0 | CSharp7.cs:88:14:88:15 | String t2 | | CSharp7.cs:88:9:88:24 | (..., ...) | CSharp7.cs:87:18:87:34 | (String,String) | 1 | CSharp7.cs:88:22:88:23 | String t3 | -| CSharp7.cs:95:18:95:38 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 0 | CSharp7.cs:95:19:95:19 | 1 | -| CSharp7.cs:95:18:95:38 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 1 | CSharp7.cs:95:22:95:37 | "TupleExprNode1" | +| CSharp7.cs:95:18:95:38 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 0 | CSharp7.cs:95:19:95:19 | 1 | +| CSharp7.cs:95:18:95:38 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 1 | CSharp7.cs:95:22:95:37 | "TupleExprNode1" | | CSharp7.cs:96:18:96:43 | (..., ...) | CSharp7.cs:96:18:96:43 | (Int32,(String,Int32)) | 0 | CSharp7.cs:96:19:96:19 | 1 | | CSharp7.cs:96:18:96:43 | (..., ...) | CSharp7.cs:96:18:96:43 | (Int32,(String,Int32)) | 1 | CSharp7.cs:96:22:96:42 | (..., ...) | | CSharp7.cs:96:22:96:42 | (..., ...) | file://:0:0:0:0 | (String,Int32) | 0 | CSharp7.cs:96:23:96:38 | "TupleExprNode2" | @@ -82,11 +82,11 @@ | CSharp7.cs:223:9:223:18 | (..., ...) | CSharp7.cs:213:5:213:17 | (Int32,Double) | 1 | CSharp7.cs:223:17:223:17 | _ | | CSharp7.cs:224:9:224:18 | (..., ...) | CSharp7.cs:213:5:213:17 | (Int32,Double) | 0 | CSharp7.cs:224:10:224:10 | _ | | CSharp7.cs:224:9:224:18 | (..., ...) | CSharp7.cs:213:5:213:17 | (Int32,Double) | 1 | CSharp7.cs:224:17:224:17 | Double y | -| CSharp7.cs:283:40:283:61 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 0 | CSharp7.cs:283:41:283:48 | access to property Key | -| CSharp7.cs:283:40:283:61 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 1 | CSharp7.cs:283:51:283:60 | access to property Value | -| CSharp7.cs:285:18:285:34 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 0 | CSharp7.cs:285:23:285:23 | Int32 a | -| CSharp7.cs:285:18:285:34 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 1 | CSharp7.cs:285:33:285:33 | String b | -| CSharp7.cs:287:18:287:31 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 0 | CSharp7.cs:287:23:287:23 | Int32 a | -| CSharp7.cs:287:18:287:31 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 1 | CSharp7.cs:287:30:287:30 | String b | -| CSharp7.cs:289:18:289:27 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 0 | CSharp7.cs:289:23:289:23 | Int32 a | -| CSharp7.cs:289:18:289:27 | (..., ...) | file://:0:0:0:0 | (Int32,String) | 1 | CSharp7.cs:289:26:289:26 | String b | +| CSharp7.cs:283:40:283:61 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 0 | CSharp7.cs:283:41:283:48 | access to property Key | +| CSharp7.cs:283:40:283:61 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 1 | CSharp7.cs:283:51:283:60 | access to property Value | +| CSharp7.cs:285:18:285:34 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 0 | CSharp7.cs:285:23:285:23 | Int32 a | +| CSharp7.cs:285:18:285:34 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 1 | CSharp7.cs:285:33:285:33 | String b | +| CSharp7.cs:287:18:287:31 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 0 | CSharp7.cs:287:23:287:23 | Int32 a | +| CSharp7.cs:287:18:287:31 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 1 | CSharp7.cs:287:30:287:30 | String b | +| CSharp7.cs:289:18:289:27 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 0 | CSharp7.cs:289:23:289:23 | Int32 a | +| CSharp7.cs:289:18:289:27 | (..., ...) | CSharp7.cs:95:18:95:38 | (Int32,String) | 1 | CSharp7.cs:289:26:289:26 | String b | diff --git a/csharp/ql/test/library-tests/csharp7/TupleTypes.expected b/csharp/ql/test/library-tests/csharp7/TupleTypes.expected index 55c27e756f4e4..d958ad60e4d11 100644 --- a/csharp/ql/test/library-tests/csharp7/TupleTypes.expected +++ b/csharp/ql/test/library-tests/csharp7/TupleTypes.expected @@ -1,10 +1,13 @@ | (Int32,(String,Int32)) | (int, (string, int)) | ValueTuple | 2 | 0 | CSharp7.cs:96:19:96:19 | Item1 | -| (Int32,(String,Int32)) | (int, (string, int)) | ValueTuple | 2 | 1 | CSharp7.cs:96:22:96:42 | Item2 | +| (Int32,(String,Int32)) | (int, (string, int)) | ValueTuple | 2 | 1 | CSharp7.cs:102:22:102:46 | Item2 | | (Int32,Double) | (int, double) | ValueTuple | 2 | 0 | CSharp7.cs:213:6:213:8 | Item1 | | (Int32,Double) | (int, double) | ValueTuple | 2 | 1 | CSharp7.cs:213:11:213:16 | Item2 | | (Int32,Int32) | (int, int) | ValueTuple | 2 | 0 | CSharp7.cs:62:10:62:10 | Item1 | | (Int32,Int32) | (int, int) | ValueTuple | 2 | 1 | CSharp7.cs:62:17:62:17 | Item2 | +| (Int32,String) | (int, string) | ValueTuple | 2 | 0 | CSharp7.cs:95:19:95:19 | Item1 | +| (Int32,String) | (int, string) | ValueTuple | 2 | 1 | CSharp7.cs:95:22:95:37 | Item2 | | (String,Int32) | (string, int) | ValueTuple | 2 | 0 | CSharp7.cs:82:17:82:17 | Item1 | +| (String,Int32) | (string, int) | ValueTuple | 2 | 0 | CSharp7.cs:101:19:101:38 | Item1 | | (String,Int32) | (string, int) | ValueTuple | 2 | 1 | CSharp7.cs:82:23:82:23 | Item2 | | (String,String) | (string, string) | ValueTuple | 2 | 0 | CSharp7.cs:87:19:87:27 | Item1 | | (String,String) | (string, string) | ValueTuple | 2 | 1 | CSharp7.cs:87:30:87:33 | Item2 | diff --git a/csharp/tools/tracing-config.lua b/csharp/tools/tracing-config.lua index 716a6f42cee6d..c2534aed5592c 100644 --- a/csharp/tools/tracing-config.lua +++ b/csharp/tools/tracing-config.lua @@ -64,7 +64,7 @@ function RegisterExtractorPack(id) -- for `dotnet test`, we should not append `-p:UseSharedCompilation=false` to the command line -- if an `exe` or `dll` is passed as an argument as the call is forwarded to vstest. - if testMatch and (arg:match('%.exe$') or arg:match('%.dll')) then + if testMatch and (arg:match('%.exe$') or arg:match('%.dll')) then match = false break end @@ -110,7 +110,7 @@ function RegisterExtractorPack(id) invocation = { path = AbsolutifyExtractorPath(id, compilerPath), arguments = { - commandLineString = table.concat(argv, " ") + commandLineString = ArgvToCommandLineString(argv) } } } @@ -174,7 +174,7 @@ function RegisterExtractorPack(id) seenCompilerCall = true end if seenCompilerCall then - table.insert(extractorArgs, '"' .. arg .. '"') + table.insert(extractorArgs, arg) end end @@ -184,7 +184,7 @@ function RegisterExtractorPack(id) invocation = { path = AbsolutifyExtractorPath(id, extractor), arguments = { - commandLineString = table.concat(extractorArgs, " ") + commandLineString = ArgvToCommandLineString(extractorArgs) } } } diff --git a/go/extractor/diagnostics/diagnostics.go b/go/extractor/diagnostics/diagnostics.go index 728122cb7878e..5b75c9c4040f3 100644 --- a/go/extractor/diagnostics/diagnostics.go +++ b/go/extractor/diagnostics/diagnostics.go @@ -482,3 +482,14 @@ func EmitGoModVersionSupportedLowerEqualGoEnv(msg string) { noLocation, ) } + +func EmitNewerSystemGoRequired(requiredVersion string) { + emitDiagnostic( + "go/autobuilder/newer-system-go-version-required", + "The Go version installed on the system is too old to support this project", + "At least Go version `"+requiredVersion+"` is required to build this project, but the version installed on the system is older. [Install a newer version](https://github.com/actions/setup-go#basic).", + severityError, + fullVisibility, + noLocation, + ) +} diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index a55279edffbcd..fa003b238db99 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -91,6 +91,10 @@ func ExtractWithFlags(buildFlags []string, patterns []string) error { } pkgs, err := packages.Load(cfg, patterns...) if err != nil { + // the toolchain directive is only supported in Go 1.21 and above + if strings.Contains(err.Error(), "unknown directive: toolchain") { + diagnostics.EmitNewerSystemGoRequired("1.21.0") + } return err } log.Println("Done running packages.Load.") diff --git a/go/ql/lib/change-notes/2023-08-28-add-error-sanitizer-for-xss.md b/go/ql/lib/change-notes/2023-08-28-add-error-sanitizer-for-xss.md new file mode 100644 index 0000000000000..2f1f5037390a0 --- /dev/null +++ b/go/ql/lib/change-notes/2023-08-28-add-error-sanitizer-for-xss.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added [http.Error](https://pkg.go.dev/net/http#Error) to XSS sanitzers. \ No newline at end of file diff --git a/go/ql/lib/semmle/go/security/Xss.qll b/go/ql/lib/semmle/go/security/Xss.qll index 9003b76641638..3310c7a420d65 100644 --- a/go/ql/lib/semmle/go/security/Xss.qll +++ b/go/ql/lib/semmle/go/security/Xss.qll @@ -109,6 +109,18 @@ module SharedXss { } } + /** + * A http.Error function returns with the ContentType of text/plain, and is not a valid XSS sink + */ + class ErrorSanitizer extends Sanitizer { + ErrorSanitizer() { + exists(Function f, DataFlow::CallNode call | call = f.getACall() | + f.hasQualifiedName("net/http", "Error") and + call.getArgument(1) = this + ) + } + } + /** * A regexp replacement involving an HTML meta-character, or a call to an escape * function, viewed as a sanitizer for XSS vulnerabilities. diff --git a/go/ql/test/query-tests/Security/CWE-079/reflectedxsstest.go b/go/ql/test/query-tests/Security/CWE-079/reflectedxsstest.go index a6f311e845802..d1ea413c3b928 100644 --- a/go/ql/test/query-tests/Security/CWE-079/reflectedxsstest.go +++ b/go/ql/test/query-tests/Security/CWE-079/reflectedxsstest.go @@ -25,9 +25,9 @@ func ServeJsonDirect(w http.ResponseWriter, r http.Request) { func ErrTest(w http.ResponseWriter, r http.Request) { cookie, err := r.Cookie("somecookie") - w.Write([]byte(fmt.Sprintf("Cookie result: %v", cookie))) // BAD: Cookie's value is user-controlled - w.Write([]byte(fmt.Sprintf("Cookie check error: %v", err))) // GOOD: Cookie's err return is harmless - + w.Write([]byte(fmt.Sprintf("Cookie result: %v", cookie))) // BAD: Cookie's value is user-controlled + w.Write([]byte(fmt.Sprintf("Cookie check error: %v", err))) // GOOD: Cookie's err return is harmless + http.Error(w, fmt.Sprintf("Cookie result: %v", cookie), 500) // Good: only plain text is written. file, header, err := r.FormFile("someFile") content, err2 := ioutil.ReadAll(file) w.Write([]byte(fmt.Sprintf("File content: %v", content))) // BAD: file content is user-controlled diff --git a/java/kotlin-extractor/build.py b/java/kotlin-extractor/build.py index 009017b0073cd..c639209a93033 100755 --- a/java/kotlin-extractor/build.py +++ b/java/kotlin-extractor/build.py @@ -92,6 +92,7 @@ def compile_to_dir(build_dir, srcs, classpath, java_classpath, output): kotlin_arg_file = build_dir + '/kotlin.args' kotlin_args = ['-Werror', '-opt-in=kotlin.RequiresOptIn', + '-opt-in=org.jetbrains.kotlin.ir.symbols.IrSymbolInternals', '-d', output, '-module-name', 'codeql-kotlin-extractor', '-no-reflect', '-no-stdlib', @@ -168,7 +169,7 @@ def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, shutil.rmtree(tmp_src_dir) shutil.copytree('src', tmp_src_dir) - include_version_folder = tmp_src_dir + '/main/kotlin/utils/versions/to_include' + include_version_folder = tmp_src_dir + '/main/kotlin/utils/this_version' os.makedirs(include_version_folder) resource_dir = tmp_src_dir + '/main/resources/com/github/codeql' @@ -192,11 +193,7 @@ def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, shutil.copytree(d, include_version_folder, dirs_exist_ok=True) # remove all version folders: - for version in kotlin_plugin_versions.many_versions: - d = tmp_src_dir + '/main/kotlin/utils/versions/v_' + \ - version.replace('.', '_') - if os.path.exists(d): - shutil.rmtree(d) + shutil.rmtree(tmp_src_dir + '/main/kotlin/utils/versions') srcs = find_sources(tmp_src_dir) diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt b/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt index c766d70df339e..0e9524a8e4320 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt @@ -20,6 +20,7 @@ import java.nio.file.Files import java.nio.file.Paths import java.util.zip.GZIPInputStream import java.util.zip.GZIPOutputStream +import com.github.codeql.utils.versions.usesK2 import com.semmle.util.files.FileUtil import kotlin.system.exitProcess @@ -97,6 +98,7 @@ class KotlinExtractorExtension( private fun runExtractor(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) { val startTimeMs = System.currentTimeMillis() + val usesK2 = usesK2(pluginContext) // This default should be kept in sync with com.semmle.extractor.java.interceptors.KotlinInterceptor.initializeExtractionContext val trapDir = File(System.getenv("CODEQL_EXTRACTOR_JAVA_TRAP_DIR").takeUnless { it.isNullOrEmpty() } ?: "kotlin-extractor/trap") val compression_env_var = "CODEQL_EXTRACTOR_JAVA_OPTION_TRAP_COMPRESSION" @@ -134,6 +136,7 @@ class KotlinExtractorExtension( tw.writeCompilation_info(compilation, "Kotlin Compiler Version", KotlinCompilerVersion.getVersion() ?: "") val extractor_name = this::class.java.getResource("extractor.name")?.readText() ?: "" tw.writeCompilation_info(compilation, "Kotlin Extractor Name", extractor_name) + tw.writeCompilation_info(compilation, "Uses Kotlin 2", usesK2.toString()) if (compilationStartTime != null) { tw.writeCompilation_compiler_times(compilation, -1.0, (System.currentTimeMillis()-compilationStartTime)/1000.0) } diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt index 55ec8c44dbb66..022b71ca562bd 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt @@ -107,7 +107,7 @@ open class KotlinFileExtractor( fun extractFileContents(file: IrFile, id: Label) { with("file", file) { val locId = tw.getWholeFileLocation() - val pkg = file.fqName.asString() + val pkg = file.packageFqName.asString() val pkgId = extractPackage(pkg) tw.writeHasLocation(id, locId) tw.writeCupackage(id, pkgId) @@ -1901,8 +1901,9 @@ open class KotlinFileExtractor( verboseln("No match as didn't find target package") return false } - if (targetPkg.fqName.asString() != pName) { - verboseln("No match as package name is ${targetPkg.fqName.asString()}") + val targetName = targetPkg.packageFqName.asString() + if (targetName != pName) { + verboseln("No match as package name is $targetName") return false } verboseln("Match") @@ -2556,8 +2557,9 @@ open class KotlinFileExtractor( verboseln("No match as didn't find target package") return false } - if (targetPkg.fqName.asString() != pkgName) { - verboseln("No match as package name is ${targetPkg.fqName.asString()} not $pkgName") + val targetName = targetPkg.packageFqName.asString() + if (targetName != pkgName) { + verboseln("No match as package name is $targetName not $pkgName") return false } verboseln("Match") diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt index 9c8f289eb0a02..6d12d28cf9e9d 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt @@ -5,6 +5,7 @@ import com.github.codeql.utils.versions.codeQlWithHasQuestionMark import com.github.codeql.utils.versions.getFileClassFqName import com.github.codeql.utils.versions.getKotlinType import com.github.codeql.utils.versions.isRawType +import com.github.codeql.utils.versions.packageFqName import com.semmle.extractor.java.OdasaOutput import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.ir.* @@ -83,7 +84,7 @@ open class KotlinUsesExtractor( ) fun extractFileClass(f: IrFile): Label { - val pkg = f.fqName.asString() + val pkg = f.packageFqName.asString() val jvmName = getFileClassName(f) val id = extractFileClass(pkg, jvmName) if (tw.lm.fileClassLocationsExtracted.add(f)) { @@ -848,7 +849,7 @@ open class KotlinUsesExtractor( when(dp) { is IrFile -> if(canBeTopLevel) { - usePackage(dp.fqName.asString()) + usePackage(dp.packageFqName.asString()) } else { extractFileClass(dp) } diff --git a/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt b/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt index 5fdf073813d17..7cf1439b56ae3 100644 --- a/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt +++ b/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt @@ -276,8 +276,8 @@ class MetaAnnotationSupport(private val logger: FileLogger, private val pluginCo run { logger.warnElement("Expected property's parent class to have a receiver parameter", parentClass); return } val newParam = copyParameterToFunction(thisReceiever, this) dispatchReceiverParameter = newParam - body = factory.createBlockBody( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf( + body = factory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET).apply({ + this.statements.add( IrReturnImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, pluginContext.irBuiltIns.nothingType, @@ -294,7 +294,7 @@ class MetaAnnotationSupport(private val logger: FileLogger, private val pluginCo ) ) ) - ) + }) } } diff --git a/java/kotlin-extractor/src/main/kotlin/PrimitiveTypeInfo.kt b/java/kotlin-extractor/src/main/kotlin/PrimitiveTypeInfo.kt index a14b0c138db56..738d44c7adf79 100644 --- a/java/kotlin-extractor/src/main/kotlin/PrimitiveTypeInfo.kt +++ b/java/kotlin-extractor/src/main/kotlin/PrimitiveTypeInfo.kt @@ -8,11 +8,12 @@ import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.name.FqName import com.github.codeql.utils.* +import com.github.codeql.utils.versions.packageFqName class PrimitiveTypeMapping(val logger: Logger, val pluginContext: IrPluginContext) { fun getPrimitiveInfo(s: IrSimpleType) = s.classOrNull?.let { - if ((it.owner.parent as? IrPackageFragment)?.fqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME) + if ((it.owner.parent as? IrPackageFragment)?.packageFqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME) mapping[it.owner.name] else null diff --git a/java/kotlin-extractor/src/main/kotlin/comments/CommentExtractor.kt b/java/kotlin-extractor/src/main/kotlin/comments/CommentExtractor.kt index ad4aaf6093611..6a6b67b20aac8 100644 --- a/java/kotlin-extractor/src/main/kotlin/comments/CommentExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/comments/CommentExtractor.kt @@ -3,8 +3,8 @@ package com.github.codeql.comments import com.github.codeql.* import com.github.codeql.utils.IrVisitorLookup import com.github.codeql.utils.isLocalFunction +import com.github.codeql.utils.Psi2IrFacade import com.github.codeql.utils.versions.getPsi2Ir -import com.github.codeql.utils.versions.Psi2IrFacade import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.KotlinCompilerVersion diff --git a/java/kotlin-extractor/src/main/kotlin/utils/ClassNames.kt b/java/kotlin-extractor/src/main/kotlin/utils/ClassNames.kt index 927d579ec34fd..30325af4b0f8b 100644 --- a/java/kotlin-extractor/src/main/kotlin/utils/ClassNames.kt +++ b/java/kotlin-extractor/src/main/kotlin/utils/ClassNames.kt @@ -2,6 +2,7 @@ package com.github.codeql import com.github.codeql.utils.getJvmName import com.github.codeql.utils.versions.getFileClassFqName +import com.github.codeql.utils.versions.packageFqName import com.intellij.openapi.vfs.StandardFileSystems import org.jetbrains.kotlin.load.java.sources.JavaSourceElement import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaClass @@ -33,7 +34,7 @@ fun getFileClassName(f: IrFile) = fun getIrElementBinaryName(that: IrElement): String { if (that is IrFile) { val shortName = getFileClassName(that) - val pkg = that.fqName.asString() + val pkg = that.packageFqName.asString() return if (pkg.isEmpty()) shortName else "$pkg.$shortName" } @@ -59,7 +60,7 @@ fun getIrElementBinaryName(that: IrElement): String { .forEach { when (it) { is IrClass -> internalName.insert(0, getName(it) + "$") - is IrPackageFragment -> it.fqName.asString().takeIf { fqName -> fqName.isNotEmpty() }?.let { fqName -> internalName.insert(0, "$fqName.") } + is IrPackageFragment -> it.packageFqName.asString().takeIf { fqName -> fqName.isNotEmpty() }?.let { fqName -> internalName.insert(0, "$fqName.") } } } return internalName.toString() diff --git a/java/kotlin-extractor/src/main/kotlin/utils/IrVisitorLookup.kt b/java/kotlin-extractor/src/main/kotlin/utils/IrVisitorLookup.kt index d7da222442b38..970c03da9cb45 100644 --- a/java/kotlin-extractor/src/main/kotlin/utils/IrVisitorLookup.kt +++ b/java/kotlin-extractor/src/main/kotlin/utils/IrVisitorLookup.kt @@ -1,6 +1,6 @@ package com.github.codeql.utils -import com.github.codeql.utils.versions.Psi2IrFacade +import com.github.codeql.utils.Psi2IrFacade import com.intellij.psi.PsiElement import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrDeclaration diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/Psi2IrFacade.kt b/java/kotlin-extractor/src/main/kotlin/utils/Psi2IrFacade.kt similarity index 88% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/Psi2IrFacade.kt rename to java/kotlin-extractor/src/main/kotlin/utils/Psi2IrFacade.kt index 2c9e5f65e9434..c9845b46895b5 100644 --- a/java/kotlin-extractor/src/main/kotlin/utils/versions/Psi2IrFacade.kt +++ b/java/kotlin-extractor/src/main/kotlin/utils/Psi2IrFacade.kt @@ -1,4 +1,4 @@ -package com.github.codeql.utils.versions +package com.github.codeql.utils import com.intellij.psi.PsiElement import org.jetbrains.kotlin.ir.IrElement @@ -8,4 +8,4 @@ import org.jetbrains.kotlin.psi.KtFile interface Psi2IrFacade { fun getKtFile(irFile: IrFile): KtFile? fun findPsiElement(irElement: IrElement, irFile: IrFile): PsiElement? -} \ No newline at end of file +} diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/IrSymbolInternals.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/IrSymbolInternals.kt new file mode 100644 index 0000000000000..b4f55b07cfd36 --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/IrSymbolInternals.kt @@ -0,0 +1,4 @@ +package org.jetbrains.kotlin.ir.symbols + +@RequiresOptIn(level = RequiresOptIn.Level.WARNING) +annotation class IrSymbolInternals diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/Psi2Ir.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/Psi2Ir.kt index 80120107478b9..2046b507bf87a 100644 --- a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/Psi2Ir.kt +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/Psi2Ir.kt @@ -1,3 +1,5 @@ package com.github.codeql.utils.versions +import com.github.codeql.utils.Psi2IrFacade + fun getPsi2Ir(): Psi2IrFacade? = null diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/UsesK2.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/UsesK2.kt new file mode 100644 index 0000000000000..39219d77730a3 --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/UsesK2.kt @@ -0,0 +1,7 @@ +package com.github.codeql.utils.versions + +import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext + +fun usesK2(@Suppress("UNUSED_PARAMETER") pluginContext: IrPluginContext): Boolean { + return false +} diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/packageFqName.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/packageFqName.kt new file mode 100644 index 0000000000000..87e67cd83680a --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_4_32/packageFqName.kt @@ -0,0 +1,10 @@ +package com.github.codeql.utils.versions + +import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.name.FqName + +val IrFile.packageFqName: FqName + get() = this.fqName + +val IrPackageFragment.packageFqName: FqName + get() = this.fqName diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_5_20/Psi2Ir.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_5_20/Psi2Ir.kt index 73987106c55f7..dcd1c26afd224 100644 --- a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_5_20/Psi2Ir.kt +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_5_20/Psi2Ir.kt @@ -6,6 +6,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.getKtFile import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.psi.KtFile +import com.github.codeql.utils.Psi2IrFacade fun getPsi2Ir(): Psi2IrFacade? = Psi2Ir() diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_0-Beta/UsesK2.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_0-Beta/UsesK2.kt new file mode 100644 index 0000000000000..8d5e334556595 --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_0-Beta/UsesK2.kt @@ -0,0 +1,7 @@ +package com.github.codeql.utils.versions + +import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext + +fun usesK2(pluginContext: IrPluginContext): Boolean { + return pluginContext.languageVersionSettings.languageVersion.usesK2 +} diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255/IrSymbolInternals.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255/IrSymbolInternals.kt new file mode 100644 index 0000000000000..48829cc30c5fb --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255/IrSymbolInternals.kt @@ -0,0 +1,4 @@ +package com.github.codeql + +// The compiler provides the annotation class, so we don't need to do +// anything diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255/packageFqName.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255/packageFqName.kt new file mode 100644 index 0000000000000..613d51c7cbfb1 --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255/packageFqName.kt @@ -0,0 +1,3 @@ +package com.github.codeql + +// The compiler provides packageFqName, so we don't need to do anything diff --git a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll index 90ec5e93f8bbf..b65d7ba89aa86 100644 --- a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll @@ -35,22 +35,54 @@ newtype TApplicationModeEndpoint = argExpr.isVararg() and not exists(int i | i < idx and call.getArgument(i).(Argument).isVararg()) ) + } or + TMethodReturnValue(Call call) { not call instanceof ConstructorCall } or + TOverriddenParameter(Parameter p, Method overriddenMethod) { + not p.getCallable().callsConstructor(_) and + p.getCallable().(Method).overrides(overriddenMethod) } /** * An endpoint is a node that is a candidate for modeling. */ abstract private class ApplicationModeEndpoint extends TApplicationModeEndpoint { - abstract predicate isArgOf(Call c, int idx); + /** + * Gets the callable to be modeled that this endpoint represents. + */ + abstract Callable getCallable(); + + abstract Call getCall(); - Call getCall() { this.isArgOf(result, _) } + /** + * Gets the input (if any) for this endpoint, eg.: `Argument[0]`. + * + * For endpoints that are source candidates, this will be `none()`. + */ + abstract string getMaDInput(); - int getArgIndex() { this.isArgOf(_, result) } + /** + * Gets the output (if any) for this endpoint, eg.: `ReturnValue`. + * + * For endpoints that are sink candidates, this will be `none()`. + */ + abstract string getMaDOutput(); abstract Top asTop(); + /** + * Converts the endpoint to a node that can be used in a data flow graph. + */ abstract DataFlow::Node asNode(); + string getExtensibleType() { + if not exists(this.getMaDInput()) and exists(this.getMaDOutput()) + then result = "sourceModel" + else + if exists(this.getMaDInput()) and not exists(this.getMaDOutput()) + then result = "sinkModel" + else none() // if both exist, it would be a summaryModel (not yet supported) + } + abstract string toString(); } @@ -63,7 +95,15 @@ class ExplicitArgument extends ApplicationModeEndpoint, TExplicitArgument { ExplicitArgument() { this = TExplicitArgument(call, arg) } - override predicate isArgOf(Call c, int idx) { c = call and this.asTop() = c.getArgument(idx) } + override Callable getCallable() { result = call.getCallee() } + + override Call getCall() { result = call } + + private int getArgIndex() { this.asTop() = call.getArgument(result) } + + override string getMaDInput() { result = "Argument[" + this.getArgIndex() + "]" } + + override string getMaDOutput() { none() } override Top asTop() { result = arg.asExpr() } @@ -78,9 +118,13 @@ class InstanceArgument extends ApplicationModeEndpoint, TInstanceArgument { InstanceArgument() { this = TInstanceArgument(call, arg) } - override predicate isArgOf(Call c, int idx) { - c = call and this.asTop() = c.getQualifier() and idx = -1 - } + override Callable getCallable() { result = call.getCallee() } + + override Call getCall() { result = call } + + override string getMaDInput() { result = "Argument[this]" } + + override string getMaDOutput() { none() } override Top asTop() { if exists(arg.asExpr()) then result = arg.asExpr() else result = call } @@ -105,15 +149,78 @@ class ImplicitVarargsArray extends ApplicationModeEndpoint, TImplicitVarargsArra ImplicitVarargsArray() { this = TImplicitVarargsArray(call, vararg, idx) } - override predicate isArgOf(Call c, int i) { c = call and i = idx } + override Callable getCallable() { result = call.getCallee() } + + override Call getCall() { result = call } + + override string getMaDInput() { result = "Argument[" + idx + "]" } - override Top asTop() { result = this.getCall() } + override string getMaDOutput() { none() } + + override Top asTop() { result = call } override DataFlow::Node asNode() { result = vararg } override string toString() { result = vararg.toString() } } +/** + * An endpoint that represents a method call. The `ReturnValue` of a method call + * may be a source. + */ +class MethodReturnValue extends ApplicationModeEndpoint, TMethodReturnValue { + Call call; + + MethodReturnValue() { this = TMethodReturnValue(call) } + + override Callable getCallable() { result = call.getCallee() } + + override Call getCall() { result = call } + + override string getMaDInput() { none() } + + override string getMaDOutput() { result = "ReturnValue" } + + override Top asTop() { result = call } + + override DataFlow::Node asNode() { result.asExpr() = call } + + override string toString() { result = call.toString() } +} + +/** + * An endpoint that represents a parameter of an overridden method that may be + * a source. + */ +class OverriddenParameter extends ApplicationModeEndpoint, TOverriddenParameter { + Parameter p; + Method overriddenMethod; + + OverriddenParameter() { this = TOverriddenParameter(p, overriddenMethod) } + + override Callable getCallable() { + // NB: we're returning the overridden callable here. This means that the + // candidate model will be about the overridden method, not the overriding + // method. This is a more general model, that also applies to other + // subclasses of the overridden class. + result = overriddenMethod + } + + override Call getCall() { none() } + + private int getArgIndex() { p.getCallable().getParameter(result) = p } + + override string getMaDInput() { none() } + + override string getMaDOutput() { result = "Parameter[" + this.getArgIndex() + "]" } + + override Top asTop() { result = p } + + override DataFlow::Node asNode() { result.(DataFlow::ParameterNode).asParameter() = p } + + override string toString() { result = p.toString() } +} + /** * A candidates implementation. * @@ -161,6 +268,14 @@ module ApplicationCandidatesImpl implements SharedCharacteristics::CandidateSig isCustomSink(e, kind) and provenance = "custom-sink" } + predicate isSource(Endpoint e, string kind, string provenance) { + exists(string package, string type, string name, string signature, string ext, string output | + sourceSpec(e, package, type, name, signature, ext, output) and + ExternalFlow::sourceModel(package, type, _, name, [signature, ""], ext, output, kind, + provenance) + ) + } + predicate isNeutral(Endpoint e) { exists(string package, string type, string name, string signature | sinkSpec(e, package, type, name, signature, _, _) and @@ -168,13 +283,24 @@ module ApplicationCandidatesImpl implements SharedCharacteristics::CandidateSig ) } + // XXX how to extend to support sources? additional predicate sinkSpec( Endpoint e, string package, string type, string name, string signature, string ext, string input ) { - ApplicationModeGetCallable::getCallable(e).hasQualifiedName(package, type, name) and - signature = ExternalFlow::paramsString(ApplicationModeGetCallable::getCallable(e)) and + e.getCallable().hasQualifiedName(package, type, name) and + signature = ExternalFlow::paramsString(e.getCallable()) and + ext = "" and + input = e.getMaDInput() + } + + additional predicate sourceSpec( + Endpoint e, string package, string type, string name, string signature, string ext, + string output + ) { + e.getCallable().hasQualifiedName(package, type, name) and + signature = ExternalFlow::paramsString(e.getCallable()) and ext = "" and - input = AutomodelJavaUtil::getArgumentForIndex(e.getArgIndex()) + output = e.getMaDOutput() } /** @@ -229,11 +355,12 @@ class ApplicationModeMetadataExtractor extends string { predicate hasMetadata( Endpoint e, string package, string type, string subtypes, string name, string signature, - string input, string isVarargsArray + string input, string output, string isVarargsArray ) { exists(Callable callable | - e.getCall().getCallee() = callable and - input = AutomodelJavaUtil::getArgumentForIndex(e.getArgIndex()) and + e.getCallable() = callable and + (if exists(e.getMaDInput()) then input = e.getMaDInput() else input = "") and + (if exists(e.getMaDOutput()) then output = e.getMaDOutput() else output = "") and package = callable.getDeclaringType().getPackage().getName() and // we're using the erased types because the MaD convention is to not specify type parameters. // Whether something is or isn't a sink doesn't usually depend on the type parameters. @@ -266,8 +393,8 @@ private class UnexploitableIsCharacteristic extends CharacteristicsImpl::NotASin override predicate appliesToEndpoint(Endpoint e) { not ApplicationCandidatesImpl::isSink(e, _, _) and - ApplicationModeGetCallable::getCallable(e).getName().matches("is%") and - ApplicationModeGetCallable::getCallable(e).getReturnType() instanceof BooleanType + e.getCallable().getName().matches("is%") and + e.getCallable().getReturnType() instanceof BooleanType } } @@ -313,9 +440,13 @@ private class IsMaDTaintStepCharacteristic extends CharacteristicsImpl::NotASink IsMaDTaintStepCharacteristic() { this = "taint step" } override predicate appliesToEndpoint(Endpoint e) { - FlowSummaryImpl::Private::Steps::summaryThroughStepValue(e.asNode(), _, _) or - FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(e.asNode(), _, _) or - FlowSummaryImpl::Private::Steps::summaryGetterStep(e.asNode(), _, _, _) or + e.getExtensibleType() = "sinkModel" and + FlowSummaryImpl::Private::Steps::summaryThroughStepValue(e.asNode(), _, _) + or + FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(e.asNode(), _, _) + or + FlowSummaryImpl::Private::Steps::summaryGetterStep(e.asNode(), _, _, _) + or FlowSummaryImpl::Private::Steps::summarySetterStep(e.asNode(), _, _, _) } } @@ -326,8 +457,8 @@ private class IsMaDTaintStepCharacteristic extends CharacteristicsImpl::NotASink * The reason is that we would expect data/taint flow into the method implementation to uncover * any sinks that are present there. */ -private class ArgumentToLocalCall extends CharacteristicsImpl::UninterestingToModelCharacteristic { - ArgumentToLocalCall() { this = "argument to local call" } +private class LocalCall extends CharacteristicsImpl::UninterestingToModelCharacteristic { + LocalCall() { this = "local call" } override predicate appliesToEndpoint(Endpoint e) { ApplicationModeGetCallable::getCallable(e).fromSource() @@ -354,6 +485,7 @@ private class NonPublicMethodCharacteristic extends CharacteristicsImpl::Uninter NonPublicMethodCharacteristic() { this = "non-public method" } override predicate appliesToEndpoint(Endpoint e) { + e.getExtensibleType() = "sinkModel" and not ApplicationModeGetCallable::getCallable(e).isPublic() } } @@ -376,6 +508,7 @@ private class OtherArgumentToModeledMethodCharacteristic extends Characteristics } override predicate appliesToEndpoint(Endpoint e) { + e.getExtensibleType() = "sinkModel" and not ApplicationCandidatesImpl::isSink(e, _, _) and exists(Endpoint otherSink | ApplicationCandidatesImpl::isSink(otherSink, _, "manual") and @@ -393,7 +526,10 @@ private class OtherArgumentToModeledMethodCharacteristic extends Characteristics private class FunctionValueCharacteristic extends CharacteristicsImpl::LikelyNotASinkCharacteristic { FunctionValueCharacteristic() { this = "function value" } - override predicate appliesToEndpoint(Endpoint e) { e.asNode().asExpr() instanceof FunctionalExpr } + override predicate appliesToEndpoint(Endpoint e) { + e.getExtensibleType() = "sinkModel" and + e.asNode().asExpr() instanceof FunctionalExpr + } } /** @@ -407,7 +543,10 @@ private class CannotBeTaintedCharacteristic extends CharacteristicsImpl::LikelyN { CannotBeTaintedCharacteristic() { this = "cannot be tainted" } - override predicate appliesToEndpoint(Endpoint e) { not this.isKnownOutNodeForStep(e) } + override predicate appliesToEndpoint(Endpoint e) { + e.getExtensibleType() = "sinkModel" and + not this.isKnownOutNodeForStep(e) + } /** * Holds if the node `n` is known as the predecessor in a modeled flow step. diff --git a/java/ql/automodel/src/AutomodelApplicationModeExtractCandidates.ql b/java/ql/automodel/src/AutomodelApplicationModeExtractCandidates.ql index b46a25b088d5e..85d3e513a3655 100644 --- a/java/ql/automodel/src/AutomodelApplicationModeExtractCandidates.ql +++ b/java/ql/automodel/src/AutomodelApplicationModeExtractCandidates.ql @@ -25,18 +25,20 @@ private import AutomodelJavaUtil bindingset[limit] private Endpoint getSampleForSignature( int limit, string package, string type, string subtypes, string name, string signature, - string input, string isVarargs + string input, string output, string isVarargs, string extensibleType ) { exists(int n, int num_endpoints, ApplicationModeMetadataExtractor meta | num_endpoints = count(Endpoint e | - meta.hasMetadata(e, package, type, subtypes, name, signature, input, isVarargs) + e.getExtensibleType() = extensibleType and + meta.hasMetadata(e, package, type, subtypes, name, signature, input, output, isVarargs) ) | result = rank[n](Endpoint e, Location loc | loc = e.asTop().getLocation() and - meta.hasMetadata(e, package, type, subtypes, name, signature, input, isVarargs) + e.getExtensibleType() = extensibleType and + meta.hasMetadata(e, package, type, subtypes, name, signature, input, output, isVarargs) | e order by @@ -55,37 +57,39 @@ private Endpoint getSampleForSignature( from Endpoint endpoint, string message, ApplicationModeMetadataExtractor meta, DollarAtString package, DollarAtString type, DollarAtString subtypes, DollarAtString name, DollarAtString signature, - DollarAtString input, DollarAtString isVarargsArray, DollarAtString alreadyAiModeled + DollarAtString input, DollarAtString output, DollarAtString isVarargsArray, + DollarAtString alreadyAiModeled, DollarAtString extensibleType where not exists(CharacteristicsImpl::UninterestingToModelCharacteristic u | u.appliesToEndpoint(endpoint) ) and endpoint = - getSampleForSignature(9, package, type, subtypes, name, signature, input, isVarargsArray) and - // If a node is already a known sink for any of our existing ATM queries and is already modeled as a MaD sink, we - // don't include it as a candidate. Otherwise, we might include it as a candidate for query A, but the model will - // label it as a sink for one of the sink types of query B, for which it's already a known sink. This would result in - // overlap between our detected sinks and the pre-existing modeling. We assume that, if a sink has already been - // modeled in a MaD model, then it doesn't belong to any additional sink types, and we don't need to reexamine it. + getSampleForSignature(9, package, type, subtypes, name, signature, input, output, + isVarargsArray, extensibleType) and + // If a node is already modeled in MaD, we don't include it as a candidate. Otherwise, we might include it as a + // candidate for query A, but the model will label it as a sink for one of the sink types of query B, for which it's + // already a known sink. This would result in overlap between our detected sinks and the pre-existing modeling. We + // assume that, if a sink has already been modeled in a MaD model, then it doesn't belong to any additional sink + // types, and we don't need to reexamine it. ( - not CharacteristicsImpl::isSink(endpoint, _, _) and alreadyAiModeled = "" + not CharacteristicsImpl::isModeled(endpoint, _, _, _) and alreadyAiModeled = "" or alreadyAiModeled.matches("%ai-%") and - CharacteristicsImpl::isSink(endpoint, _, alreadyAiModeled) + CharacteristicsImpl::isModeled(endpoint, _, _, alreadyAiModeled) ) and - meta.hasMetadata(endpoint, package, type, subtypes, name, signature, input, isVarargsArray) and + meta.hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, isVarargsArray) and includeAutomodelCandidate(package, type, name, signature) and // The message is the concatenation of all sink types for which this endpoint is known neither to be a sink nor to be // a non-sink, and we surface only endpoints that have at least one such sink type. message = strictconcat(AutomodelEndpointTypes::SinkType sinkType | - not CharacteristicsImpl::isKnownSink(endpoint, sinkType, _) and + not CharacteristicsImpl::isKnownAs(endpoint, sinkType, _) and CharacteristicsImpl::isSinkCandidate(endpoint, sinkType) | sinkType, ", " ) select endpoint.asNode(), - message + "\nrelated locations: $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@.", // + message + "\nrelated locations: $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@.", // CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext()), "CallContext", // package, "package", // type, "type", // @@ -93,5 +97,7 @@ select endpoint.asNode(), name, "name", // method name signature, "signature", // input, "input", // + output, "output", // isVarargsArray, "isVarargsArray", // - alreadyAiModeled, "alreadyAiModeled" + alreadyAiModeled, "alreadyAiModeled", // + extensibleType, "extensibleType" diff --git a/java/ql/automodel/src/AutomodelApplicationModeExtractNegativeExamples.ql b/java/ql/automodel/src/AutomodelApplicationModeExtractNegativeExamples.ql index a1cb9c8961a84..96726ee0e4f72 100644 --- a/java/ql/automodel/src/AutomodelApplicationModeExtractNegativeExamples.ql +++ b/java/ql/automodel/src/AutomodelApplicationModeExtractNegativeExamples.ql @@ -44,7 +44,7 @@ from Endpoint endpoint, EndpointCharacteristic characteristic, float confidence, string message, ApplicationModeMetadataExtractor meta, DollarAtString package, DollarAtString type, DollarAtString subtypes, DollarAtString name, DollarAtString signature, DollarAtString input, - DollarAtString isVarargsArray + DollarAtString output, DollarAtString isVarargsArray where endpoint = getSampleForCharacteristic(characteristic, 100) and confidence >= SharedCharacteristics::highConfidence() and @@ -52,7 +52,7 @@ where // Exclude endpoints that have contradictory endpoint characteristics, because we only want examples we're highly // certain about in the prompt. not erroneousEndpoints(endpoint, _, _, _, _, false) and - meta.hasMetadata(endpoint, package, type, subtypes, name, signature, input, isVarargsArray) and + meta.hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, isVarargsArray) and // It's valid for a node to satisfy the logic for both `isSink` and `isSanitizer`, but in that case it will be // treated by the actual query as a sanitizer, since the final logic is something like // `isSink(n) and not isSanitizer(n)`. We don't want to include such nodes as negative examples in the prompt, because @@ -65,7 +65,7 @@ where ) and message = characteristic select endpoint.asNode(), - message + "\nrelated locations: $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@.", // + message + "\nrelated locations: $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@.", // CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext()), "CallContext", // package, "package", // type, "type", // @@ -73,4 +73,5 @@ select endpoint.asNode(), name, "name", // signature, "signature", // input, "input", // + output, "output", // isVarargsArray, "isVarargsArray" // diff --git a/java/ql/automodel/src/AutomodelApplicationModeExtractPositiveExamples.ql b/java/ql/automodel/src/AutomodelApplicationModeExtractPositiveExamples.ql index 7341f5127023a..5ff5a73af6030 100644 --- a/java/ql/automodel/src/AutomodelApplicationModeExtractPositiveExamples.ql +++ b/java/ql/automodel/src/AutomodelApplicationModeExtractPositiveExamples.ql @@ -13,19 +13,20 @@ private import AutomodelEndpointTypes private import AutomodelJavaUtil from - Endpoint endpoint, SinkType sinkType, ApplicationModeMetadataExtractor meta, + Endpoint endpoint, EndpointType endpointType, ApplicationModeMetadataExtractor meta, DollarAtString package, DollarAtString type, DollarAtString subtypes, DollarAtString name, - DollarAtString signature, DollarAtString input, DollarAtString isVarargsArray + DollarAtString signature, DollarAtString input, DollarAtString output, + DollarAtString isVarargsArray where // Exclude endpoints that have contradictory endpoint characteristics, because we only want examples we're highly // certain about in the prompt. not erroneousEndpoints(endpoint, _, _, _, _, false) and - meta.hasMetadata(endpoint, package, type, subtypes, name, signature, input, isVarargsArray) and + meta.hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, isVarargsArray) and // Extract positive examples of sinks belonging to the existing ATM query configurations. - CharacteristicsImpl::isKnownSink(endpoint, sinkType, _) and + CharacteristicsImpl::isKnownAs(endpoint, endpointType, _) and exists(CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext())) select endpoint.asNode(), - sinkType + "\nrelated locations: $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@.", // + endpointType + "\nrelated locations: $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@.", // CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext()), "CallContext", // package, "package", // type, "type", // @@ -33,4 +34,5 @@ select endpoint.asNode(), name, "name", // signature, "signature", // input, "input", // + output, "output", // isVarargsArray, "isVarargsArray" diff --git a/java/ql/automodel/src/AutomodelEndpointTypes.qll b/java/ql/automodel/src/AutomodelEndpointTypes.qll index 618fa4bc7ddd0..e7eaed15541d4 100644 --- a/java/ql/automodel/src/AutomodelEndpointTypes.qll +++ b/java/ql/automodel/src/AutomodelEndpointTypes.qll @@ -28,12 +28,6 @@ abstract class SinkType extends EndpointType { SinkType() { any() } } -/** A class for source types that can be predicted by a classifier. */ -abstract class SourceType extends EndpointType { - bindingset[this] - SourceType() { any() } -} - /** The `Negative` class for non-sinks. */ class NegativeSinkType extends SinkType { NegativeSinkType() { this = "non-sink" } @@ -58,3 +52,14 @@ class RequestForgerySinkType extends SinkType { class CommandInjectionSinkType extends SinkType { CommandInjectionSinkType() { this = "command-injection" } } + +/** A class for source types that can be predicted by a classifier. */ +abstract class SourceType extends EndpointType { + bindingset[this] + SourceType() { any() } +} + +/** A source of remote data. */ +class RemoteSourceType extends SourceType { + RemoteSourceType() { this = "remote" } +} diff --git a/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll b/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll index 02d945437e3fb..020e15a3eaaee 100644 --- a/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll @@ -117,6 +117,10 @@ module FrameworkCandidatesImpl implements SharedCharacteristics::CandidateSig { ) } + predicate isSource(Endpoint e, string kind, string provenance) { + none() // TODO: implement + } + predicate isNeutral(Endpoint e) { exists(string package, string type, string name, string signature | sinkSpec(e, package, type, name, signature, _, _) and diff --git a/java/ql/automodel/src/AutomodelFrameworkModeExtractCandidates.ql b/java/ql/automodel/src/AutomodelFrameworkModeExtractCandidates.ql index c3de8a208d5eb..e06594d0d39f3 100644 --- a/java/ql/automodel/src/AutomodelFrameworkModeExtractCandidates.ql +++ b/java/ql/automodel/src/AutomodelFrameworkModeExtractCandidates.ql @@ -40,7 +40,7 @@ where // a non-sink, and we surface only endpoints that have at least one such sink type. message = strictconcat(AutomodelEndpointTypes::SinkType sinkType | - not CharacteristicsImpl::isKnownSink(endpoint, sinkType, _) and + not CharacteristicsImpl::isKnownAs(endpoint, sinkType, _) and CharacteristicsImpl::isSinkCandidate(endpoint, sinkType) | sinkType, ", " diff --git a/java/ql/automodel/src/AutomodelFrameworkModeExtractPositiveExamples.ql b/java/ql/automodel/src/AutomodelFrameworkModeExtractPositiveExamples.ql index 3807de45c5a09..dfbaaef35e5dc 100644 --- a/java/ql/automodel/src/AutomodelFrameworkModeExtractPositiveExamples.ql +++ b/java/ql/automodel/src/AutomodelFrameworkModeExtractPositiveExamples.ql @@ -22,7 +22,7 @@ where not erroneousEndpoints(endpoint, _, _, _, _, false) and meta.hasMetadata(endpoint, package, type, subtypes, name, signature, input, parameterName) and // Extract positive examples of sinks belonging to the existing ATM query configurations. - CharacteristicsImpl::isKnownSink(endpoint, sinkType, _) + CharacteristicsImpl::isKnownAs(endpoint, sinkType, _) select endpoint, sinkType + "\nrelated locations: $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@.", // CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", // diff --git a/java/ql/automodel/src/AutomodelJavaUtil.qll b/java/ql/automodel/src/AutomodelJavaUtil.qll index a224fc291a2ca..8fd8702bfc413 100644 --- a/java/ql/automodel/src/AutomodelJavaUtil.qll +++ b/java/ql/automodel/src/AutomodelJavaUtil.qll @@ -39,6 +39,9 @@ predicate isKnownKind(string kind, AutomodelEndpointTypes::EndpointType type) { or kind = "command-injection" and type instanceof AutomodelEndpointTypes::CommandInjectionSinkType + or + kind = "remote" and + type instanceof AutomodelEndpointTypes::RemoteSourceType } /** Gets the models-as-data description for the method argument with the index `index`. */ diff --git a/java/ql/automodel/src/AutomodelSharedCharacteristics.qll b/java/ql/automodel/src/AutomodelSharedCharacteristics.qll index 845f8385e5b81..992d9c08332df 100644 --- a/java/ql/automodel/src/AutomodelSharedCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelSharedCharacteristics.qll @@ -62,6 +62,11 @@ signature module CandidateSig { */ predicate isSink(Endpoint e, string kind, string provenance); + /** + * Holds if `e` is a sink with the label `kind`, and provenance `provenance`. + */ + predicate isSource(Endpoint e, string kind, string provenance); + /** * Holds if `e` is not a sink of any kind. */ @@ -91,17 +96,23 @@ module SharedCharacteristics { predicate isNeutral = Candidate::isNeutral/1; + predicate isModeled(Candidate::Endpoint e, string kind, string extensibleKind, string provenance) { + Candidate::isSink(e, kind, provenance) and extensibleKind = "sinkModel" + or + Candidate::isSource(e, kind, provenance) and extensibleKind = "sourceModel" + } + /** - * Holds if `sink` is a known sink of type `endpointType`. + * Holds if `endpoint` is modeled as `endpointType` (endpoint type must not be negative). */ - predicate isKnownSink( - Candidate::Endpoint sink, Candidate::EndpointType endpointType, + predicate isKnownAs( + Candidate::Endpoint endpoint, Candidate::EndpointType endpointType, EndpointCharacteristic characteristic ) { // If the list of characteristics includes positive indicators with maximal confidence for this class, then it's a // known sink for the class. not endpointType instanceof Candidate::NegativeEndpointType and - characteristic.appliesToEndpoint(sink) and + characteristic.appliesToEndpoint(endpoint) and characteristic.hasImplications(endpointType, true, maximalConfidence()) } @@ -209,6 +220,25 @@ module SharedCharacteristics { } } + /** + * A high-confidence characteristic that indicates that an endpoint is a source of a specified type. These endpoints can + * be used as positive samples for training or for a few-shot prompt. + */ + abstract class SourceCharacteristic extends EndpointCharacteristic { + bindingset[this] + SourceCharacteristic() { any() } + + abstract Candidate::EndpointType getSourceType(); + + final override predicate hasImplications( + Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence + ) { + endpointType = this.getSourceType() and + isPositiveIndicator = true and + confidence = maximalConfidence() + } + } + /** * A high-confidence characteristic that indicates that an endpoint is not a sink of any type. These endpoints can be * used as negative samples for training or for a few-shot prompt. @@ -292,6 +322,25 @@ module SharedCharacteristics { override Candidate::EndpointType getSinkType() { result = endpointType } } + private class KnownSourceCharacteristic extends SourceCharacteristic { + string madKind; + Candidate::EndpointType endpointType; + string provenance; + + KnownSourceCharacteristic() { + Candidate::isKnownKind(madKind, endpointType) and + // bind "this" to a unique string differing from that of the SinkType classes + this = madKind + "_" + provenance + "_characteristic" and + Candidate::isSource(_, madKind, provenance) + } + + override predicate appliesToEndpoint(Candidate::Endpoint e) { + Candidate::isSource(e, madKind, provenance) + } + + override Candidate::EndpointType getSourceType() { result = endpointType } + } + /** * A negative characteristic that indicates that an endpoint was manually modeled as a neutral model. */ diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected index 77d51830c6733..a5bc12867cf9c 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected @@ -1,4 +1,13 @@ -| Test.java:16:3:16:11 | reference | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:16:3:16:24 | set(...) | CallContext | file://java.util.concurrent.atomic:1:1:1:1 | java.util.concurrent.atomic | package | file://AtomicReference:1:1:1:1 | AtomicReference | type | file://false:1:1:1:1 | false | subtypes | file://set:1:1:1:1 | set | name | file://(String):1:1:1:1 | (String) | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | -| Test.java:21:3:21:10 | supplier | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:21:3:21:16 | get(...) | CallContext | file://java.util.function:1:1:1:1 | java.util.function | package | file://Supplier:1:1:1:1 | Supplier | type | file://true:1:1:1:1 | true | subtypes | file://get:1:1:1:1 | get | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | -| Test.java:34:4:34:11 | openPath | command-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:33:10:35:3 | newInputStream(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://false:1:1:1:1 | false | isVarargsArray | file://ai-manual:1:1:1:1 | ai-manual | alreadyAiModeled | -| Test.java:53:4:53:4 | o | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:51:3:56:3 | walk(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://true:1:1:1:1 | true | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | +| PluginImpl.java:5:27:5:37 | name | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | PluginImpl.java:5:27:5:37 | name | CallContext | file://hudson:1:1:1:1 | hudson | package | file://Plugin:1:1:1:1 | Plugin | type | file://true:1:1:1:1 | true | subtypes | file://configure:1:1:1:1 | configure | name | file://(String,String):1:1:1:1 | (String,String) | signature | file://:1:1:1:1 | | input | file://Parameter[0]:1:1:1:1 | Parameter[0] | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| PluginImpl.java:5:40:5:51 | value | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | PluginImpl.java:5:40:5:51 | value | CallContext | file://hudson:1:1:1:1 | hudson | package | file://Plugin:1:1:1:1 | Plugin | type | file://true:1:1:1:1 | true | subtypes | file://configure:1:1:1:1 | configure | name | file://(String,String):1:1:1:1 | (String,String) | signature | file://:1:1:1:1 | | input | file://Parameter[1]:1:1:1:1 | Parameter[1] | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:18:3:18:11 | reference | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:18:3:18:24 | set(...) | CallContext | file://java.util.concurrent.atomic:1:1:1:1 | java.util.concurrent.atomic | package | file://AtomicReference:1:1:1:1 | AtomicReference | type | file://false:1:1:1:1 | false | subtypes | file://set:1:1:1:1 | set | name | file://(String):1:1:1:1 | (String) | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:23:3:23:10 | supplier | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:23:3:23:16 | get(...) | CallContext | file://java.util.function:1:1:1:1 | java.util.function | package | file://Supplier:1:1:1:1 | Supplier | type | file://true:1:1:1:1 | true | subtypes | file://get:1:1:1:1 | get | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:23:3:23:16 | get(...) | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:23:3:23:16 | get(...) | CallContext | file://java.util.function:1:1:1:1 | java.util.function | package | file://Supplier:1:1:1:1 | Supplier | type | file://true:1:1:1:1 | true | subtypes | file://get:1:1:1:1 | get | name | file://():1:1:1:1 | () | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:27:3:31:3 | copy(...) | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:27:3:31:3 | copy(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:35:10:37:3 | newInputStream(...) | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:35:10:37:3 | newInputStream(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:36:4:36:11 | openPath | command-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:35:10:37:3 | newInputStream(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://ai-manual:1:1:1:1 | ai-manual | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:42:4:42:22 | get(...) | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:42:4:42:22 | get(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Paths:1:1:1:1 | Paths | type | file://false:1:1:1:1 | false | subtypes | file://get:1:1:1:1 | get | name | file://(String,String[]):1:1:1:1 | (String,String[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:53:3:58:3 | walk(...) | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:53:3:58:3 | walk(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:55:4:55:4 | o | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:53:3:58:3 | walk(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://:1:1:1:1 | | output | file://true:1:1:1:1 | true | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:62:3:62:3 | c | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:62:3:62:20 | getInputStream(...) | CallContext | file://java.net:1:1:1:1 | java.net | package | file://URLConnection:1:1:1:1 | URLConnection | type | file://true:1:1:1:1 | true | subtypes | file://getInputStream:1:1:1:1 | getInputStream | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:67:30:67:47 | writer | command-injection, path-injection, request-forgery, sql-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:67:30:67:47 | writer | CallContext | file://java.lang:1:1:1:1 | java.lang | package | file://Throwable:1:1:1:1 | Throwable | type | file://true:1:1:1:1 | true | subtypes | file://printStackTrace:1:1:1:1 | printStackTrace | name | file://(PrintWriter):1:1:1:1 | (PrintWriter) | signature | file://:1:1:1:1 | | input | file://Parameter[0]:1:1:1:1 | Parameter[0] | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected index 1ca68cb2281ad..4fa671e9570ec 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected @@ -1,2 +1,4 @@ -| Test.java:46:4:46:5 | f2 | known non-sink\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@. | Test.java:45:10:47:3 | compareTo(...) | CallContext | file://java.io:1:1:1:1 | java.io | package | file://File:1:1:1:1 | File | type | file://true:1:1:1:1 | true | subtypes | file://compareTo:1:1:1:1 | compareTo | name | file://(File):1:1:1:1 | (File) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://false:1:1:1:1 | false | isVarargsArray | -| Test.java:52:4:52:4 | p | taint step\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@. | Test.java:51:3:56:3 | walk(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:47:10:49:3 | compareTo(...) | known sanitizer\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:47:10:49:3 | compareTo(...) | CallContext | file://java.io:1:1:1:1 | java.io | package | file://File:1:1:1:1 | File | type | file://true:1:1:1:1 | true | subtypes | file://compareTo:1:1:1:1 | compareTo | name | file://(File):1:1:1:1 | (File) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:48:4:48:5 | f2 | known non-sink\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:47:10:49:3 | compareTo(...) | CallContext | file://java.io:1:1:1:1 | java.io | package | file://File:1:1:1:1 | File | type | file://true:1:1:1:1 | true | subtypes | file://compareTo:1:1:1:1 | compareTo | name | file://(File):1:1:1:1 | (File) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:54:4:54:4 | p | taint step\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:53:3:58:3 | walk(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:66:7:66:18 | this | exception\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:66:7:66:18 | super(...) | CallContext | file://java.lang:1:1:1:1 | java.lang | package | file://Exception:1:1:1:1 | Exception | type | file://true:1:1:1:1 | true | subtypes | file://Exception:1:1:1:1 | Exception | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected index e07f92f4baf12..dcbabe2bc37a2 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected @@ -1,3 +1,4 @@ -| Test.java:26:4:26:9 | source | path-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@. | Test.java:25:3:29:3 | copy(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://false:1:1:1:1 | false | isVarargsArray | -| Test.java:27:4:27:9 | target | path-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@. | Test.java:25:3:29:3 | copy(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://false:1:1:1:1 | false | isVarargsArray | -| Test.java:34:4:34:11 | openPath | path-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@. | Test.java:33:10:35:3 | newInputStream(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:28:4:28:9 | source | path-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:27:3:31:3 | copy(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:29:4:29:9 | target | path-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:27:3:31:3 | copy(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:36:4:36:11 | openPath | path-injection\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:35:10:37:3 | newInputStream(...) | CallContext | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | +| Test.java:62:3:62:20 | getInputStream(...) | remote\nrelated locations: $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:62:3:62:20 | getInputStream(...) | CallContext | file://java.net:1:1:1:1 | java.net | package | file://URLConnection:1:1:1:1 | URLConnection | type | file://true:1:1:1:1 | true | subtypes | file://getInputStream:1:1:1:1 | getInputStream | name | file://():1:1:1:1 | () | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/PluginImpl.java b/java/ql/automodel/test/AutomodelApplicationModeExtraction/PluginImpl.java new file mode 100644 index 0000000000000..11c0384f75928 --- /dev/null +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/PluginImpl.java @@ -0,0 +1,8 @@ +import hudson.Plugin; + +public class PluginImpl extends Plugin { + @Override + public void configure(String name, String value) { + // ... + } +} diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java b/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java index 1a660f7752f85..4887285eb7102 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java @@ -1,6 +1,7 @@ package com.github.codeql.test; import java.io.InputStream; +import java.io.PrintWriter; import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; @@ -9,6 +10,7 @@ import java.util.function.Supplier; import java.io.File; import java.nio.file.FileVisitOption; +import java.net.URLConnection; class Test { public static void main(String[] args) throws Exception { @@ -18,11 +20,11 @@ public static void main(String[] args) throws Exception { } public static void callSupplier(Supplier supplier) { - supplier.get(); // Argument[this] is a candidate + supplier.get(); // Argument[this] is a sink candidate; the call is a source candidate } public static void copyFiles(Path source, Path target, CopyOption option) throws Exception { - Files.copy( + Files.copy( // the call is a source candidate source, // positive example (known sink) target, // positive example (known sink) option // no candidate (not modeled, but source and target are modeled) @@ -30,29 +32,39 @@ public static void copyFiles(Path source, Path target, CopyOption option) throws } public static InputStream getInputStream(Path openPath) throws Exception { - return Files.newInputStream( + return Files.newInputStream( // the call is a source candidate openPath // positive example (known sink), candidate ("only" ai-modeled, and useful as a candidate in regression testing) ); } public static InputStream getInputStream(String openPath) throws Exception { - return Test.getInputStream( - Paths.get(openPath) // no candidate (argument to local call) + return Test.getInputStream( // the call is not a source candidate (argument to local call) + Paths.get(openPath) // no sink candidate (argument to local call); the call is a source candidate ); } public static int compareFiles(File f1, File f2) { - return f1.compareTo( + return f1.compareTo( // compareTo call is a known sanitizer f2 // negative example (modeled as not a sink) ); } - + public static void FilesWalkExample(Path p, FileVisitOption o) throws Exception { - Files.walk( + Files.walk( // the call is a source candidate p, // negative example (modeled as a taint step) o, // the implicit varargs array is a candidate o // not a candidate (only the first arg corresponding to a varargs array // is extracted) ); } + + public static void WebSocketExample(URLConnection c) throws Exception { + c.getInputStream(); // the call is a source example, c is a sink candidate + } +} + +class OverrideTest extends Exception { + public void printStackTrace(PrintWriter writer) { // writer is a source candidate because it overrides an existing method + return; + } } diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/hudson/Plugin.java b/java/ql/automodel/test/AutomodelApplicationModeExtraction/hudson/Plugin.java new file mode 100644 index 0000000000000..f88d8ab35fdd4 --- /dev/null +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/hudson/Plugin.java @@ -0,0 +1,5 @@ +package hudson; + +public class Plugin { + public void configure(String name, String value) {} +} diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.expected b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.expected new file mode 100644 index 0000000000000..b7d6dd6e972c8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.expected @@ -0,0 +1,7 @@ +| Number of files with extension jar | 1 | +| Number of files with extension kt | 1 | +| Number of lines of code | 2 | +| Number of lines of code with extension kt | 2 | +| Total number of lines | 3 | +| Total number of lines with extension kt | 3 | +| Uses Kotlin 2: false | 1 | diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.ext.yml b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.ext.yml new file mode 100644 index 0000000000000..3b6ffa4a3771f --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.ext.yml @@ -0,0 +1,13 @@ +extensions: + - addsTo: + pack: codeql/java-queries + extensible: extractorInformationSkipKey + data: + # These will have unstable values, as they are dependent on the + # JDK that the test is run with, so filter them out: + - ["Number of files"] + - ["Number of files with extension class"] + # These depend on the Kotlin version you have installed + - ["Kotlin Compiler Version: %"] + - ["Kotlin Extractor Name: %"] + diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.qlref b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.qlref new file mode 100644 index 0000000000000..ff57e78a9d7a4 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/ExtractorInformation.qlref @@ -0,0 +1 @@ +Telemetry/ExtractorInformation.ql \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/SomeClass.kt b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/SomeClass.kt new file mode 100644 index 0000000000000..80fb3d3af6a23 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/SomeClass.kt @@ -0,0 +1,2 @@ +class SomeClass { +} diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/test.py b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/test.py new file mode 100755 index 0000000000000..4a0fa4efd23bd --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin1/test.py @@ -0,0 +1,3 @@ +from create_database_utils import * + +run_codeql_database_create(["kotlinc SomeClass.kt"], lang="java") diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.expected b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.expected new file mode 100644 index 0000000000000..e1fe4c6ee3941 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.expected @@ -0,0 +1,3 @@ +| Number of files with extension jar | 1 | +| Number of files with extension kt | 1 | +| Uses Kotlin 2: true | 1 | diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.ext.yml b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.ext.yml new file mode 100644 index 0000000000000..be02d9554f819 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.ext.yml @@ -0,0 +1,17 @@ +extensions: + - addsTo: + pack: codeql/java-queries + extensible: extractorInformationSkipKey + data: + # These will have unstable values, as they are dependent on the + # JDK that the test is run with, so filter them out: + - ["Number of files"] + - ["Number of files with extension class"] + # These depend on the Kotlin version you have installed + - ["Kotlin Compiler Version: %"] + - ["Kotlin Extractor Name: %"] + # Currently we get some diagnostics as Kotlin 2 support isn't complete. + # Ignore these, as the number probably isn't stable. + - ["Number of diagnostics from CodeQL Kotlin extractor with severity %"] + - ["Total number of diagnostics from CodeQL Kotlin extractor"] + diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.qlref b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.qlref new file mode 100644 index 0000000000000..ff57e78a9d7a4 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/ExtractorInformation.qlref @@ -0,0 +1 @@ +Telemetry/ExtractorInformation.ql \ No newline at end of file diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/SomeClass.kt b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/SomeClass.kt new file mode 100644 index 0000000000000..80fb3d3af6a23 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/SomeClass.kt @@ -0,0 +1,2 @@ +class SomeClass { +} diff --git a/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/test.py b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/test.py new file mode 100755 index 0000000000000..c61bbf8886066 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/kotlin/extractor_information_kotlin2/test.py @@ -0,0 +1,3 @@ +from create_database_utils import * + +run_codeql_database_create(["kotlinc -language-version 2.0 SomeClass.kt"], lang="java") diff --git a/java/ql/src/Telemetry/ExtractorInformation.ql b/java/ql/src/Telemetry/ExtractorInformation.ql index 51990878a3460..24cd705eee77e 100644 --- a/java/ql/src/Telemetry/ExtractorInformation.ql +++ b/java/ql/src/Telemetry/ExtractorInformation.ql @@ -87,7 +87,7 @@ predicate extractorTotalDiagnostics(string key, int value) { from string key, int value where - not extractorInformationSkipKey(key) and + not exists(string pattern | extractorInformationSkipKey(pattern) and key.matches(pattern)) and ( compilationInfo(key, value) or fileCount(key, value) or diff --git a/java/ql/test/library-tests/qlengine/selectAtType.expected b/java/ql/test/library-tests/qlengine/selectAtType.expected deleted file mode 100644 index e5eb1d6ba3547..0000000000000 --- a/java/ql/test/library-tests/qlengine/selectAtType.expected +++ /dev/null @@ -1 +0,0 @@ -ERROR: class or primitive expected in query (selectAtType.ql:5,8-15) diff --git a/java/ql/test/library-tests/qlengine/selectAtType.ql b/java/ql/test/library-tests/qlengine/selectAtType.ql deleted file mode 100644 index 14fa6ce034fb5..0000000000000 --- a/java/ql/test/library-tests/qlengine/selectAtType.ql +++ /dev/null @@ -1,5 +0,0 @@ -import java - -@classorinterface clasz() { any() } - -select clasz() diff --git a/misc/scripts/accept-expected-changes-from-ci.py b/misc/scripts/accept-expected-changes-from-ci.py index 47a6bec76ab67..1e03b426e7bfc 100755 --- a/misc/scripts/accept-expected-changes-from-ci.py +++ b/misc/scripts/accept-expected-changes-from-ci.py @@ -114,7 +114,7 @@ def make_patches_from_log_file(log_file_lines) -> List[Patch]: while True: next_line = parse_log_line(next(lines)) # it can be the case that - if next_line[0] in (" ", "-", "+", "@"): + if next_line and next_line[0] in (" ", "-", "+", "@"): lines_changed.append(next_line) if "FAILED" in next_line: break diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index ee33f3f121078..c0714c618a77f 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -4396,6 +4396,117 @@ private module StdlibPrivate { preservesValue = true } } + + // --------------------------------------------------------------------------- + // asyncio + // --------------------------------------------------------------------------- + /** Provides models for the `asyncio` module. */ + module AsyncIO { + /** + * A call to the `asyncio.create_subprocess_exec` function (also accessible via the `subprocess` module of `asyncio`) + * + * See https://docs.python.org/3/library/asyncio-subprocess.html#creating-subprocesses + */ + private class CreateSubprocessExec extends SystemCommandExecution::Range, + FileSystemAccess::Range, API::CallNode + { + CreateSubprocessExec() { + this = API::moduleImport("asyncio").getMember("create_subprocess_exec").getACall() + or + this = + API::moduleImport("asyncio") + .getMember("subprocess") + .getMember("create_subprocess_exec") + .getACall() + } + + override DataFlow::Node getCommand() { result = this.getParameter(0, "program").asSink() } + + override DataFlow::Node getAPathArgument() { result = this.getCommand() } + + override predicate isShellInterpreted(DataFlow::Node arg) { + none() // this is a safe API. + } + } + + /** + * A call to the `asyncio.create_subprocess_shell` function (also accessible via the `subprocess` module of `asyncio`) + * + * See https://docs.python.org/3/library/asyncio-subprocess.html#asyncio.create_subprocess_shell + */ + private class CreateSubprocessShell extends SystemCommandExecution::Range, + FileSystemAccess::Range, API::CallNode + { + CreateSubprocessShell() { + this = API::moduleImport("asyncio").getMember("create_subprocess_shell").getACall() + or + this = + API::moduleImport("asyncio") + .getMember("subprocess") + .getMember("create_subprocess_shell") + .getACall() + } + + override DataFlow::Node getCommand() { result = this.getParameter(0, "cmd").asSink() } + + override DataFlow::Node getAPathArgument() { result = this.getCommand() } + + override predicate isShellInterpreted(DataFlow::Node arg) { arg = this.getCommand() } + } + + /** + * Get an asyncio event loop (an object with basetype `AbstractEventLoop`). + * + * See https://docs.python.org/3/library/asyncio-eventloop.html + */ + private API::Node getAsyncioEventLoop() { + result = API::moduleImport("asyncio").getMember("get_running_loop").getReturn() + or + result = API::moduleImport("asyncio").getMember("get_event_loop").getReturn() // deprecated in Python 3.10.0 and later + or + result = API::moduleImport("asyncio").getMember("new_event_loop").getReturn() + } + + /** + * A call to `subprocess_exec` on an event loop instance. + * + * See https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.subprocess_exec + */ + private class EventLoopSubprocessExec extends API::CallNode, SystemCommandExecution::Range, + FileSystemAccess::Range + { + EventLoopSubprocessExec() { + this = getAsyncioEventLoop().getMember("subprocess_exec").getACall() + } + + override DataFlow::Node getCommand() { result = this.getArg(1) } + + override DataFlow::Node getAPathArgument() { result = this.getCommand() } + + override predicate isShellInterpreted(DataFlow::Node arg) { + none() // this is a safe API. + } + } + + /** + * A call to `subprocess_shell` on an event loop instance. + * + * See https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.subprocess_shell + */ + private class EventLoopSubprocessShell extends API::CallNode, SystemCommandExecution::Range, + FileSystemAccess::Range + { + EventLoopSubprocessShell() { + this = getAsyncioEventLoop().getMember("subprocess_shell").getACall() + } + + override DataFlow::Node getCommand() { result = this.getParameter(1, "cmd").asSink() } + + override DataFlow::Node getAPathArgument() { result = this.getCommand() } + + override predicate isShellInterpreted(DataFlow::Node arg) { arg = this.getCommand() } + } + } } // --------------------------------------------------------------------------- diff --git a/python/ql/lib/semmle/python/security/dataflow/CleartextLoggingQuery.qll b/python/ql/lib/semmle/python/security/dataflow/CleartextLoggingQuery.qll index 7479c24fc531d..0b0cb04682069 100644 --- a/python/ql/lib/semmle/python/security/dataflow/CleartextLoggingQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/CleartextLoggingQuery.qll @@ -16,9 +16,11 @@ private import semmle.python.dataflow.new.SensitiveDataSources import CleartextLoggingCustomizations::CleartextLogging /** + * DEPRECATED: Use `CleartextLoggingFlow` module instead. + * * A taint-tracking configuration for detecting "Clear-text logging of sensitive information". */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "CleartextLogging" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -31,3 +33,14 @@ class Configuration extends TaintTracking::Configuration { node instanceof Sanitizer } } + +private module CleartextLoggingConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "Clear-text logging of sensitive information" vulnerabilities. */ +module CleartextLoggingFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/CleartextStorageQuery.qll b/python/ql/lib/semmle/python/security/dataflow/CleartextStorageQuery.qll index e5320c76d346b..ef9c8c13b56b3 100644 --- a/python/ql/lib/semmle/python/security/dataflow/CleartextStorageQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/CleartextStorageQuery.qll @@ -16,9 +16,11 @@ private import semmle.python.dataflow.new.SensitiveDataSources import CleartextStorageCustomizations::CleartextStorage /** + * DEPRECATED: Use `CleartextStorageFlow` module instead. + * * A taint-tracking configuration for detecting "Clear-text storage of sensitive information". */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "CleartextStorage" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -31,3 +33,14 @@ class Configuration extends TaintTracking::Configuration { node instanceof Sanitizer } } + +private module CleartextStorageConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "Clear-text storage of sensitive information" vulnerabilities. */ +module CleartextStorageFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/CodeInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/CodeInjectionQuery.qll index a318ae60aa801..3cdb72c383aa3 100644 --- a/python/ql/lib/semmle/python/security/dataflow/CodeInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/CodeInjectionQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import CodeInjectionCustomizations::CodeInjection /** + * DEPRECATED: Use `CodeInjectionFlow` module instead. + * * A taint-tracking configuration for detecting "code injection" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "CodeInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module CodeInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "code injection" vulnerabilities. */ +module CodeInjectionFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/CommandInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/CommandInjectionQuery.qll index 526fd9d069440..80ca46dafa95f 100644 --- a/python/ql/lib/semmle/python/security/dataflow/CommandInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/CommandInjectionQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import CommandInjectionCustomizations::CommandInjection /** + * DEPRECATED: Use `CommandInjectionFlow` module instead. + * * A taint-tracking configuration for detecting "command injection" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "CommandInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,17 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +/** + * A taint-tracking configuration for detecting "command injection" vulnerabilities. + */ +module CommandInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "command injection" vulnerabilities. */ +module CommandInjectionFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/LdapInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/LdapInjectionQuery.qll index aa13a8ee6a98c..1ebead9541883 100644 --- a/python/ql/lib/semmle/python/security/dataflow/LdapInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/LdapInjectionQuery.qll @@ -14,10 +14,12 @@ import semmle.python.dataflow.new.RemoteFlowSources import LdapInjectionCustomizations::LdapInjection /** + * DEPRECATED: Use `LdapInjectionDnFlow` module instead. + * * A taint-tracking configuration for detecting LDAP injection vulnerabilities * via the distinguished name (DN) parameter of an LDAP search. */ -class DnConfiguration extends TaintTracking::Configuration { +deprecated class DnConfiguration extends TaintTracking::Configuration { DnConfiguration() { this = "LdapDnInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -31,11 +33,24 @@ class DnConfiguration extends TaintTracking::Configuration { } } +private module LdapInjectionDnConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof DnSink } + + predicate isBarrier(DataFlow::Node node) { node instanceof DnSanitizer } +} + +/** Global taint-tracking for detecting "LDAP injection via the distinguished name (DN) parameter" vulnerabilities. */ +module LdapInjectionDnFlow = TaintTracking::Global; + /** + * DEPRECATED: Use `LdapInjectionFilterFlow` module instead. + * * A taint-tracking configuration for detecting LDAP injection vulnerabilities * via the filter parameter of an LDAP search. */ -class FilterConfiguration extends TaintTracking::Configuration { +deprecated class FilterConfiguration extends TaintTracking::Configuration { FilterConfiguration() { this = "LdapFilterInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -48,3 +63,19 @@ class FilterConfiguration extends TaintTracking::Configuration { guard instanceof FilterSanitizerGuard } } + +private module LdapInjectionFilterConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof FilterSink } + + predicate isBarrier(DataFlow::Node node) { node instanceof FilterSanitizer } +} + +/** Global taint-tracking for detecting "LDAP injection via the filter parameter" vulnerabilities. */ +module LdapInjectionFilterFlow = TaintTracking::Global; + +/** Global taint-tracking for detecting "LDAP injection" vulnerabilities. */ +module LdapInjectionFlow = + DataFlow::MergePathGraph; diff --git a/python/ql/lib/semmle/python/security/dataflow/LogInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/LogInjectionQuery.qll index 4679c2c154b66..8f91c6e85eeb3 100644 --- a/python/ql/lib/semmle/python/security/dataflow/LogInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/LogInjectionQuery.qll @@ -1,5 +1,5 @@ /** - * Provides a taint-tracking configuration for tracking untrusted user input used in log entries. + * Provides a taint-tracking configuration for tracking "log injection" vulnerabilities. * * Note, for performance reasons: only import this file if * `LogInjection::Configuration` is needed, otherwise @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import LogInjectionCustomizations::LogInjection /** + * DEPRECATED: Use `LogInjectionFlow` module instead. + * * A taint-tracking configuration for tracking untrusted user input used in log entries. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "LogInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module LogInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "log injection" vulnerabilities. */ +module LogInjectionFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/PamAuthorizationQuery.qll b/python/ql/lib/semmle/python/security/dataflow/PamAuthorizationQuery.qll index 18dc29a4a7152..4b150299b318f 100644 --- a/python/ql/lib/semmle/python/security/dataflow/PamAuthorizationQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/PamAuthorizationQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import PamAuthorizationCustomizations::PamAuthorizationCustomizations /** + * DEPRECATED: Use `PamAuthorizationFlow` module instead. + * * A taint-tracking configuration for detecting "PAM Authorization" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "PamAuthorization" } override predicate isSource(DataFlow::Node node) { node instanceof Source } @@ -37,3 +39,28 @@ class Configuration extends TaintTracking::Configuration { exists(VulnPamAuthCall c | c.getArg(0) = node1 | node2 = c) } } + +private module PamAuthorizationConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + // Models flow from a remotely supplied username field to a PAM `handle`. + // `retval = pam_start(service, username, byref(conv), byref(handle))` + exists(API::CallNode pamStart, DataFlow::Node handle, API::CallNode pointer | + pointer = API::moduleImport("ctypes").getMember(["pointer", "byref"]).getACall() and + pamStart = libPam().getMember("pam_start").getACall() and + pointer = pamStart.getArg(3) and + handle = pointer.getArg(0) and + pamStart.getArg(1) = node1 and + handle = node2 + ) + or + // Flow from handle to the authenticate call in the final step + exists(VulnPamAuthCall c | c.getArg(0) = node1 | node2 = c) + } +} + +/** Global taint-tracking for detecting "PAM Authorization" vulnerabilities. */ +module PamAuthorizationFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/PathInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/PathInjectionQuery.qll index 5616a94465ad8..b185098dcb869 100644 --- a/python/ql/lib/semmle/python/security/dataflow/PathInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/PathInjectionQuery.qll @@ -13,6 +13,8 @@ import semmle.python.dataflow.new.TaintTracking import PathInjectionCustomizations::PathInjection /** + * DEPRECATED: Use `PathInjectionFlow` module instead. + * * A taint-tracking configuration for detecting "path injection" vulnerabilities. * * This configuration uses two flow states, `NotNormalized` and `NormalizedUnchecked`, @@ -25,7 +27,7 @@ import PathInjectionCustomizations::PathInjection * * Such checks are ineffective in the `NotNormalized` state. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "PathInjection" } override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { @@ -74,3 +76,52 @@ class NotNormalized extends DataFlow::FlowState { class NormalizedUnchecked extends DataFlow::FlowState { NormalizedUnchecked() { this = "NormalizedUnchecked" } } + +/** + * This configuration uses two flow states, `NotNormalized` and `NormalizedUnchecked`, + * to track the requirement that a file path must be first normalized and then checked + * before it is safe to use. + * + * At sources, paths are assumed not normalized. At normalization points, they change + * state to `NormalizedUnchecked` after which they can be made safe by an appropriate + * check of the prefix. + * + * Such checks are ineffective in the `NotNormalized` state. + */ +module PathInjectionConfig implements DataFlow::StateConfigSig { + class FlowState = DataFlow::FlowState; + + predicate isSource(DataFlow::Node source, FlowState state) { + source instanceof Source and state instanceof NotNormalized + } + + predicate isSink(DataFlow::Node sink, FlowState state) { + sink instanceof Sink and + ( + state instanceof NotNormalized or + state instanceof NormalizedUnchecked + ) + } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + predicate isBarrier(DataFlow::Node node, FlowState state) { + // Block `NotNormalized` paths here, since they change state to `NormalizedUnchecked` + node instanceof Path::PathNormalization and + state instanceof NotNormalized + or + node instanceof Path::SafeAccessCheck and + state instanceof NormalizedUnchecked + } + + predicate isAdditionalFlowStep( + DataFlow::Node nodeFrom, FlowState stateFrom, DataFlow::Node nodeTo, FlowState stateTo + ) { + nodeFrom = nodeTo.(Path::PathNormalization).getPathArg() and + stateFrom instanceof NotNormalized and + stateTo instanceof NormalizedUnchecked + } +} + +/** Global taint-tracking for detecting "path injection" vulnerabilities. */ +module PathInjectionFlow = TaintTracking::GlobalWithState; diff --git a/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSCustomizations.qll b/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSCustomizations.qll index 09d787de57fc6..a6ba053e2d2f5 100644 --- a/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSCustomizations.qll +++ b/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSCustomizations.qll @@ -6,7 +6,6 @@ private import python private import semmle.python.dataflow.new.DataFlow -private import semmle.python.dataflow.new.DataFlow2 private import semmle.python.dataflow.new.TaintTracking private import semmle.python.Concepts private import semmle.python.dataflow.new.RemoteFlowSources diff --git a/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSQuery.qll b/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSQuery.qll index d9fd1e843e82c..2279814e49ef9 100644 --- a/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import PolynomialReDoSCustomizations::PolynomialReDoS /** + * DEPRECATED: Use `PolynomialReDoSFlow` module instead. + * * A taint-tracking configuration for detecting "polynomial regular expression denial of service (ReDoS)" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "PolynomialReDoS" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module PolynomialReDoSConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "polynomial regular expression denial of service (ReDoS)" vulnerabilities. */ +module PolynomialReDoSFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/ReflectedXssQuery.qll b/python/ql/lib/semmle/python/security/dataflow/ReflectedXssQuery.qll index d150c80ffb1dc..d136c9d16b8c5 100644 --- a/python/ql/lib/semmle/python/security/dataflow/ReflectedXssQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/ReflectedXssQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import ReflectedXSSCustomizations::ReflectedXss /** + * DEPRECATED: Use `ReflectedXssFlow` module instead. + * * A taint-tracking configuration for detecting "reflected server-side cross-site scripting" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "ReflectedXSS" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module ReflectedXssConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "reflected server-side cross-site scripting" vulnerabilities. */ +module ReflectedXssFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/RegexInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/RegexInjectionQuery.qll index c8287b22c7543..168091bf212fd 100644 --- a/python/ql/lib/semmle/python/security/dataflow/RegexInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/RegexInjectionQuery.qll @@ -1,5 +1,5 @@ /** - * Provides a taint-tracking configuration for detecting regular expression injection + * Provides a taint-tracking configuration for detecting "regular expression injection" * vulnerabilities. * * Note, for performance reasons: only import this file if @@ -13,9 +13,11 @@ import semmle.python.dataflow.new.TaintTracking import RegexInjectionCustomizations::RegexInjection /** + * DEPRECATED: Use `RegexInjectionFlow` module instead. + * * A taint-tracking configuration for detecting "reflected server-side cross-site scripting" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "RegexInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -28,3 +30,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module RegexInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "regular expression injection" vulnerabilities. */ +module RegexInjectionFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll b/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll index 36ec416cca28e..a6c08185bd180 100644 --- a/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryQuery.qll @@ -13,6 +13,8 @@ import semmle.python.Concepts import ServerSideRequestForgeryCustomizations::ServerSideRequestForgery /** + * DEPRECATED: Use `FullServerSideRequestForgeryFlow` module instead. + * * A taint-tracking configuration for detecting "Server-side request forgery" vulnerabilities. * * This configuration has a sanitizer to limit results to cases where attacker has full control of URL. @@ -21,7 +23,7 @@ import ServerSideRequestForgeryCustomizations::ServerSideRequestForgery * You should use the `fullyControlledRequest` to only select results where all * URL parts are fully controlled. */ -class FullServerSideRequestForgeryConfiguration extends TaintTracking::Configuration { +deprecated class FullServerSideRequestForgeryConfiguration extends TaintTracking::Configuration { FullServerSideRequestForgeryConfiguration() { this = "FullServerSideRequestForgery" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -39,24 +41,51 @@ class FullServerSideRequestForgeryConfiguration extends TaintTracking::Configura } } +/** + * This configuration has a sanitizer to limit results to cases where attacker has full control of URL. + * See `PartialServerSideRequestForgery` for a variant without this requirement. + * + * You should use the `fullyControlledRequest` to only select results where all + * URL parts are fully controlled. + */ +private module FullServerSideRequestForgeryConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { + node instanceof Sanitizer + or + node instanceof FullUrlControlSanitizer + } +} + +/** + * Global taint-tracking for detecting "Full server-side request forgery" vulnerabilities. + * + * You should use the `fullyControlledRequest` to only select results where all + * URL parts are fully controlled. + */ +module FullServerSideRequestForgeryFlow = TaintTracking::Global; + /** * Holds if all URL parts of `request` is fully user controlled. */ predicate fullyControlledRequest(Http::Client::Request request) { - exists(FullServerSideRequestForgeryConfiguration fullConfig | - forall(DataFlow::Node urlPart | urlPart = request.getAUrlPart() | - fullConfig.hasFlow(_, urlPart) - ) + forall(DataFlow::Node urlPart | urlPart = request.getAUrlPart() | + FullServerSideRequestForgeryFlow::flow(_, urlPart) ) } /** + * DEPRECATED: Use `FullServerSideRequestForgeryFlow` module instead. + * * A taint-tracking configuration for detecting "Server-side request forgery" vulnerabilities. * * This configuration has results, even when the attacker does not have full control over the URL. * See `FullServerSideRequestForgeryConfiguration`, and the `fullyControlledRequest` predicate. */ -class PartialServerSideRequestForgeryConfiguration extends TaintTracking::Configuration { +deprecated class PartialServerSideRequestForgeryConfiguration extends TaintTracking::Configuration { PartialServerSideRequestForgeryConfiguration() { this = "PartialServerSideRequestForgery" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -69,3 +98,21 @@ class PartialServerSideRequestForgeryConfiguration extends TaintTracking::Config guard instanceof SanitizerGuard } } + +/** + * This configuration has results, even when the attacker does not have full control over the URL. + * See `FullServerSideRequestForgeryConfiguration`, and the `fullyControlledRequest` predicate. + */ +private module PartialServerSideRequestForgeryConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** + * Global taint-tracking for detecting "partial server-side request forgery" vulnerabilities. + */ +module PartialServerSideRequestForgeryFlow = + TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/SqlInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/SqlInjectionQuery.qll index 23e6b91a0ef13..9b78686fed389 100644 --- a/python/ql/lib/semmle/python/security/dataflow/SqlInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/SqlInjectionQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import SqlInjectionCustomizations::SqlInjection /** + * DEPRECATED: Use `SqlInjectionFlow` module instead. + * * A taint-tracking configuration for detecting "SQL injection" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "SqlInjection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module SqlInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "SQL injection" vulnerabilities. */ +module SqlInjectionFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/StackTraceExposureQuery.qll b/python/ql/lib/semmle/python/security/dataflow/StackTraceExposureQuery.qll index 3975985fce11b..22404903c481c 100644 --- a/python/ql/lib/semmle/python/security/dataflow/StackTraceExposureQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/StackTraceExposureQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import StackTraceExposureCustomizations::StackTraceExposure /** + * DEPRECATED: Use `StackTraceExposureFlow` module instead. + * * A taint-tracking configuration for detecting "stack trace exposure" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "StackTraceExposure" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -36,3 +38,23 @@ class Configuration extends TaintTracking::Configuration { ) } } + +private module StackTraceExposureConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + // A stack trace is accessible as the `__traceback__` attribute of a caught exception. + // see https://docs.python.org/3/reference/datamodel.html#traceback-objects + predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + exists(DataFlow::AttrRead attr | attr.getAttributeName() = "__traceback__" | + nodeFrom = attr.getObject() and + nodeTo = attr + ) + } +} + +/** Global taint-tracking for detecting "stack trace exposure" vulnerabilities. */ +module StackTraceExposureFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/TarSlipQuery.qll b/python/ql/lib/semmle/python/security/dataflow/TarSlipQuery.qll index 6cf41742a66ce..7bb008f1afb39 100644 --- a/python/ql/lib/semmle/python/security/dataflow/TarSlipQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/TarSlipQuery.qll @@ -1,5 +1,5 @@ /** - * Provides a taint-tracking configuration for detecting "command injection" vulnerabilities. + * Provides a taint-tracking configuration for detecting "tar slip" vulnerabilities. * * Note, for performance reasons: only import this file if * `TarSlip::Configuration` is needed, otherwise @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import TarSlipCustomizations::TarSlip /** - * A taint-tracking configuration for detecting "command injection" vulnerabilities. + * DEPRECATED: Use `TarSlipFlow` module instead. + * + * A taint-tracking configuration for detecting "tar slip" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "TarSlip" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -23,3 +25,14 @@ class Configuration extends TaintTracking::Configuration { override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } } + +private module TarSlipConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "tar slip" vulnerabilities. */ +module TarSlipFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/UnsafeDeserializationQuery.qll b/python/ql/lib/semmle/python/security/dataflow/UnsafeDeserializationQuery.qll index 0a2046b8a4bc4..d9dfde62bcb42 100644 --- a/python/ql/lib/semmle/python/security/dataflow/UnsafeDeserializationQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/UnsafeDeserializationQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import UnsafeDeserializationCustomizations::UnsafeDeserialization /** + * DEPRECATED: Use `UnsafeDeserializationFlow` module instead. + * * A taint-tracking configuration for detecting "code execution from deserialization" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "UnsafeDeserialization" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module UnsafeDeserializationConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "code execution from deserialization" vulnerabilities. */ +module UnsafeDeserializationFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/UnsafeShellCommandConstructionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/UnsafeShellCommandConstructionQuery.qll index 80781a97ac61b..73205fdeb28c4 100644 --- a/python/ql/lib/semmle/python/security/dataflow/UnsafeShellCommandConstructionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/UnsafeShellCommandConstructionQuery.qll @@ -14,9 +14,11 @@ private import CommandInjectionCustomizations::CommandInjection as CommandInject private import semmle.python.dataflow.new.BarrierGuards /** + * DEPRECATED: Use `UnsafeShellCommandConstructionFlow` module instead. + * * A taint-tracking configuration for detecting shell command constructed from library input vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "UnsafeShellCommandConstruction" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -33,3 +35,23 @@ class Configuration extends TaintTracking::Configuration { result instanceof DataFlow::FeatureHasSourceCallContext } } + +/** + * A taint-tracking configuration for detecting "shell command constructed from library input" vulnerabilities. + */ +module UnsafeShellCommandConstructionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { + node instanceof CommandInjection::Sanitizer // using all sanitizers from `py/command-injection` + } + + // override to require the path doesn't have unmatched return steps + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext } +} + +/** Global taint-tracking for detecting "shell command constructed from library input" vulnerabilities. */ +module UnsafeShellCommandConstructionFlow = + TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/UrlRedirectQuery.qll b/python/ql/lib/semmle/python/security/dataflow/UrlRedirectQuery.qll index 599f08d133a40..cb1adc2113565 100644 --- a/python/ql/lib/semmle/python/security/dataflow/UrlRedirectQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/UrlRedirectQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import UrlRedirectCustomizations::UrlRedirect /** + * DEPRECATED: Use `UrlRedirectFlow` module instead. + * * A taint-tracking configuration for detecting "URL redirection" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "UrlRedirect" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module UrlRedirectConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "URL redirection" vulnerabilities. */ +module UrlRedirectFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/WeakSensitiveDataHashingQuery.qll b/python/ql/lib/semmle/python/security/dataflow/WeakSensitiveDataHashingQuery.qll index f7aec51277256..9e2803b336995 100644 --- a/python/ql/lib/semmle/python/security/dataflow/WeakSensitiveDataHashingQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/WeakSensitiveDataHashingQuery.qll @@ -24,10 +24,12 @@ module NormalHashFunction { import WeakSensitiveDataHashingCustomizations::NormalHashFunction /** + * DEPRECATED: Use `Flow` module instead. + * * A taint-tracking configuration for detecting use of a broken or weak * cryptographic hashing algorithm on sensitive data. */ - class Configuration extends TaintTracking::Configuration { + deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "NormalHashFunction" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -44,6 +46,21 @@ module NormalHashFunction { sensitiveDataExtraStepForCalls(node1, node2) } } + + private module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + sensitiveDataExtraStepForCalls(node1, node2) + } + } + + /** Global taint-tracking for detecting "use of a broken or weak cryptographic hashing algorithm on sensitive data" vulnerabilities. */ + module Flow = TaintTracking::Global; } /** @@ -57,13 +74,15 @@ module ComputationallyExpensiveHashFunction { import WeakSensitiveDataHashingCustomizations::ComputationallyExpensiveHashFunction /** + * DEPRECATED: Use `Flow` module instead. + * * A taint-tracking configuration for detecting use of a broken or weak * cryptographic hashing algorithm on passwords. * * Passwords has stricter requirements on the hashing algorithm used (must be * computationally expensive to prevent brute-force attacks). */ - class Configuration extends TaintTracking::Configuration { + deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "ComputationallyExpensiveHashFunction" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -80,4 +99,49 @@ module ComputationallyExpensiveHashFunction { sensitiveDataExtraStepForCalls(node1, node2) } } + + /** + * Passwords has stricter requirements on the hashing algorithm used (must be + * computationally expensive to prevent brute-force attacks). + */ + private module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + sensitiveDataExtraStepForCalls(node1, node2) + } + } + + /** Global taint-tracking for detecting "use of a broken or weak cryptographic hashing algorithm on passwords" vulnerabilities. */ + module Flow = TaintTracking::Global; +} + +/** + * Global taint-tracking for detecting both variants of "use of a broken or weak + * cryptographic hashing algorithm on sensitive data" vulnerabilities. + * + * See convenience predicates `normalHashFunctionFlowPath` and + * `computationallyExpensiveHashFunctionFlowPath`. + */ +module WeakSensitiveDataHashingFlow = + DataFlow::MergePathGraph; + +/** Holds if data can flow from `source` to `sink` with `NormalHashFunction::Flow`. */ +predicate normalHashFunctionFlowPath( + WeakSensitiveDataHashingFlow::PathNode source, WeakSensitiveDataHashingFlow::PathNode sink +) { + NormalHashFunction::Flow::flowPath(source.asPathNode1(), sink.asPathNode1()) +} + +/** Holds if data can flow from `source` to `sink` with `ComputationallyExpensiveHashFunction::Flow`. */ +predicate computationallyExpensiveHashFunctionFlowPath( + WeakSensitiveDataHashingFlow::PathNode source, WeakSensitiveDataHashingFlow::PathNode sink +) { + ComputationallyExpensiveHashFunction::Flow::flowPath(source.asPathNode2(), sink.asPathNode2()) } diff --git a/python/ql/lib/semmle/python/security/dataflow/XmlBombQuery.qll b/python/ql/lib/semmle/python/security/dataflow/XmlBombQuery.qll index d0c0b85d84f18..dcf3939bc7861 100644 --- a/python/ql/lib/semmle/python/security/dataflow/XmlBombQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/XmlBombQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import XmlBombCustomizations::XmlBomb /** + * DEPRECATED: Use `XmlBombFlow` module instead. + * * A taint-tracking configuration for detecting "XML bomb" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "XmlBomb" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -26,3 +28,14 @@ class Configuration extends TaintTracking::Configuration { node instanceof Sanitizer } } + +private module XmlBombConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "XML bomb" vulnerabilities. */ +module XmlBombFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/XpathInjectionQuery.qll b/python/ql/lib/semmle/python/security/dataflow/XpathInjectionQuery.qll index aa5a27c5392dc..34a34e49ba2eb 100644 --- a/python/ql/lib/semmle/python/security/dataflow/XpathInjectionQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/XpathInjectionQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import XpathInjectionCustomizations::XpathInjection /** + * DEPRECATED: Use `XpathInjectionFlow` module instead. + * * A taint-tracking configuration for detecting "Xpath Injection" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "Xpath Injection" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -27,3 +29,14 @@ class Configuration extends TaintTracking::Configuration { guard instanceof SanitizerGuard } } + +private module XpathInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "Xpath Injection" vulnerabilities. */ +module XpathInjectionFlow = TaintTracking::Global; diff --git a/python/ql/lib/semmle/python/security/dataflow/XxeQuery.qll b/python/ql/lib/semmle/python/security/dataflow/XxeQuery.qll index dd2409f2a3ce5..8d85d275f1e1c 100644 --- a/python/ql/lib/semmle/python/security/dataflow/XxeQuery.qll +++ b/python/ql/lib/semmle/python/security/dataflow/XxeQuery.qll @@ -12,9 +12,11 @@ import semmle.python.dataflow.new.TaintTracking import XxeCustomizations::Xxe /** + * DEPRECATED: Use `XxeFlow` module instead. + * * A taint-tracking configuration for detecting "XML External Entity (XXE)" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { +deprecated class Configuration extends TaintTracking::Configuration { Configuration() { this = "Xxe" } override predicate isSource(DataFlow::Node source) { source instanceof Source } @@ -26,3 +28,14 @@ class Configuration extends TaintTracking::Configuration { node instanceof Sanitizer } } + +private module XxeConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } +} + +/** Global taint-tracking for detecting "XML External Entity (XXE)" vulnerabilities. */ +module XxeFlow = TaintTracking::Global; diff --git a/python/ql/src/Functions/ModificationOfParameterWithDefault.ql b/python/ql/src/Functions/ModificationOfParameterWithDefault.ql index 88b346fd2a0d1..3c60109169496 100644 --- a/python/ql/src/Functions/ModificationOfParameterWithDefault.ql +++ b/python/ql/src/Functions/ModificationOfParameterWithDefault.ql @@ -13,11 +13,11 @@ import python import semmle.python.functions.ModificationOfParameterWithDefault -import DataFlow::PathGraph +import ModificationOfParameterWithDefault::Flow::PathGraph from - ModificationOfParameterWithDefault::Configuration config, DataFlow::PathNode source, - DataFlow::PathNode sink -where config.hasFlowPath(source, sink) + ModificationOfParameterWithDefault::Flow::PathNode source, + ModificationOfParameterWithDefault::Flow::PathNode sink +where ModificationOfParameterWithDefault::Flow::flowPath(source, sink) select sink.getNode(), source, sink, "This expression mutates a $@.", source.getNode(), "default value" diff --git a/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll b/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll index 766cf6845affc..82e3c3121d0b3 100644 --- a/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll +++ b/python/ql/src/Security/CWE-020-ExternalAPIs/ExternalAPIs.qll @@ -167,8 +167,12 @@ class ExternalApiDataNode extends DataFlow::Node { } } -/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ -class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration { +/** + * DEPRECATED: Use `XmlBombFlow` module instead. + * + * A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. + */ +deprecated class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration { UntrustedDataToExternalApiConfig() { this = "UntrustedDataToExternalAPIConfig" } override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } @@ -176,14 +180,21 @@ class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } +private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + + predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } +} + +/** Global taint-tracking from `RemoteFlowSource`s to `ExternalApiDataNode`s. */ +module UntrustedDataToExternalApiFlow = TaintTracking::Global; + /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { any(UntrustedDataToExternalApiConfig c).hasFlow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ - DataFlow::Node getAnUntrustedSource() { - any(UntrustedDataToExternalApiConfig c).hasFlow(result, this) - } + DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } } /** An external API which is used with untrusted data. */ diff --git a/python/ql/src/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.ql b/python/ql/src/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.ql index 6426854222c33..f5706ccc3a6d8 100644 --- a/python/ql/src/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.ql +++ b/python/ql/src/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.ql @@ -11,14 +11,14 @@ import python import ExternalAPIs -import DataFlow::PathGraph +import UntrustedDataToExternalApiFlow::PathGraph from - UntrustedDataToExternalApiConfig config, DataFlow::PathNode source, DataFlow::PathNode sink, + UntrustedDataToExternalApiFlow::PathNode source, UntrustedDataToExternalApiFlow::PathNode sink, ExternalApiUsedWithUntrustedData externalApi where sink.getNode() = externalApi.getUntrustedDataNode() and - config.hasFlowPath(source, sink) + UntrustedDataToExternalApiFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Call to " + externalApi.toString() + " with untrusted data from $@.", source.getNode(), source.toString() diff --git a/python/ql/src/Security/CWE-022/PathInjection.ql b/python/ql/src/Security/CWE-022/PathInjection.ql index 8548c815fe433..1686dec7c916f 100644 --- a/python/ql/src/Security/CWE-022/PathInjection.ql +++ b/python/ql/src/Security/CWE-022/PathInjection.ql @@ -18,9 +18,9 @@ import python import semmle.python.security.dataflow.PathInjectionQuery -import DataFlow::PathGraph +import PathInjectionFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from PathInjectionFlow::PathNode source, PathInjectionFlow::PathNode sink +where PathInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This path depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-022/TarSlip.ql b/python/ql/src/Security/CWE-022/TarSlip.ql index 647b41756f842..cb0cd54d19b38 100644 --- a/python/ql/src/Security/CWE-022/TarSlip.ql +++ b/python/ql/src/Security/CWE-022/TarSlip.ql @@ -14,9 +14,9 @@ import python import semmle.python.security.dataflow.TarSlipQuery -import DataFlow::PathGraph +import TarSlipFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from TarSlipFlow::PathNode source, TarSlipFlow::PathNode sink +where TarSlipFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This file extraction depends on a $@.", source.getNode(), "potentially untrusted source" diff --git a/python/ql/src/Security/CWE-078/CommandInjection.ql b/python/ql/src/Security/CWE-078/CommandInjection.ql index f8c48714e1afb..1c2c5125b32ec 100644 --- a/python/ql/src/Security/CWE-078/CommandInjection.ql +++ b/python/ql/src/Security/CWE-078/CommandInjection.ql @@ -16,9 +16,9 @@ import python import semmle.python.security.dataflow.CommandInjectionQuery -import DataFlow::PathGraph +import CommandInjectionFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from CommandInjectionFlow::PathNode source, CommandInjectionFlow::PathNode sink +where CommandInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This command line depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-078/UnsafeShellCommandConstruction.ql b/python/ql/src/Security/CWE-078/UnsafeShellCommandConstruction.ql index 10f4b77126136..561bcf7dd491a 100644 --- a/python/ql/src/Security/CWE-078/UnsafeShellCommandConstruction.ql +++ b/python/ql/src/Security/CWE-078/UnsafeShellCommandConstruction.ql @@ -16,11 +16,13 @@ import python import semmle.python.security.dataflow.UnsafeShellCommandConstructionQuery -import DataFlow::PathGraph +import UnsafeShellCommandConstructionFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink, Sink sinkNode +from + UnsafeShellCommandConstructionFlow::PathNode source, + UnsafeShellCommandConstructionFlow::PathNode sink, Sink sinkNode where - config.hasFlowPath(source, sink) and + UnsafeShellCommandConstructionFlow::flowPath(source, sink) and sinkNode = sink.getNode() select sinkNode.getStringConstruction(), source, sink, "This " + sinkNode.describe() + " which depends on $@ is later used in a $@.", source.getNode(), diff --git a/python/ql/src/Security/CWE-079/ReflectedXss.ql b/python/ql/src/Security/CWE-079/ReflectedXss.ql index 1189e35be67d6..11ebad00e375c 100644 --- a/python/ql/src/Security/CWE-079/ReflectedXss.ql +++ b/python/ql/src/Security/CWE-079/ReflectedXss.ql @@ -15,9 +15,9 @@ import python import semmle.python.security.dataflow.ReflectedXssQuery -import DataFlow::PathGraph +import ReflectedXssFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from ReflectedXssFlow::PathNode source, ReflectedXssFlow::PathNode sink +where ReflectedXssFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-089/SqlInjection.ql b/python/ql/src/Security/CWE-089/SqlInjection.ql index 5e910cf3edfa6..e6861e860669f 100644 --- a/python/ql/src/Security/CWE-089/SqlInjection.ql +++ b/python/ql/src/Security/CWE-089/SqlInjection.ql @@ -13,9 +13,9 @@ import python import semmle.python.security.dataflow.SqlInjectionQuery -import DataFlow::PathGraph +import SqlInjectionFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from SqlInjectionFlow::PathNode source, SqlInjectionFlow::PathNode sink +where SqlInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This SQL query depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-090/LdapInjection.ql b/python/ql/src/Security/CWE-090/LdapInjection.ql index efcf52eba41b8..f4943f8a8dcaf 100644 --- a/python/ql/src/Security/CWE-090/LdapInjection.ql +++ b/python/ql/src/Security/CWE-090/LdapInjection.ql @@ -14,14 +14,14 @@ // Determine precision above import python import semmle.python.security.dataflow.LdapInjectionQuery -import DataFlow::PathGraph +import LdapInjectionFlow::PathGraph -from DataFlow::PathNode source, DataFlow::PathNode sink, string parameterName +from LdapInjectionFlow::PathNode source, LdapInjectionFlow::PathNode sink, string parameterName where - any(DnConfiguration dnConfig).hasFlowPath(source, sink) and + LdapInjectionDnFlow::flowPath(source.asPathNode1(), sink.asPathNode1()) and parameterName = "DN" or - any(FilterConfiguration filterConfig).hasFlowPath(source, sink) and + LdapInjectionFilterFlow::flowPath(source.asPathNode2(), sink.asPathNode2()) and parameterName = "filter" select sink.getNode(), source, sink, "LDAP query parameter (" + parameterName + ") depends on a $@.", source.getNode(), diff --git a/python/ql/src/Security/CWE-094/CodeInjection.ql b/python/ql/src/Security/CWE-094/CodeInjection.ql index 5e5c06b68b7e3..d0683c7ffcabb 100644 --- a/python/ql/src/Security/CWE-094/CodeInjection.ql +++ b/python/ql/src/Security/CWE-094/CodeInjection.ql @@ -16,9 +16,9 @@ import python import semmle.python.security.dataflow.CodeInjectionQuery -import DataFlow::PathGraph +import CodeInjectionFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink +where CodeInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This code execution depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-117/LogInjection.ql b/python/ql/src/Security/CWE-117/LogInjection.ql index 3c380321af277..f1b72faaccbd0 100644 --- a/python/ql/src/Security/CWE-117/LogInjection.ql +++ b/python/ql/src/Security/CWE-117/LogInjection.ql @@ -13,9 +13,9 @@ import python import semmle.python.security.dataflow.LogInjectionQuery -import DataFlow::PathGraph +import LogInjectionFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from LogInjectionFlow::PathNode source, LogInjectionFlow::PathNode 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/python/ql/src/Security/CWE-209/StackTraceExposure.ql b/python/ql/src/Security/CWE-209/StackTraceExposure.ql index 7b8cf74c597f7..1feed997e25ca 100644 --- a/python/ql/src/Security/CWE-209/StackTraceExposure.ql +++ b/python/ql/src/Security/CWE-209/StackTraceExposure.ql @@ -15,10 +15,10 @@ import python import semmle.python.security.dataflow.StackTraceExposureQuery -import DataFlow::PathGraph +import StackTraceExposureFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from StackTraceExposureFlow::PathNode source, StackTraceExposureFlow::PathNode sink +where StackTraceExposureFlow::flowPath(source, sink) select sink.getNode(), source, sink, "$@ flows to this location and may be exposed to an external user.", source.getNode(), "Stack trace information" diff --git a/python/ql/src/Security/CWE-285/PamAuthorization.ql b/python/ql/src/Security/CWE-285/PamAuthorization.ql index 43cbc33917a0f..1da0b8c9b10fc 100644 --- a/python/ql/src/Security/CWE-285/PamAuthorization.ql +++ b/python/ql/src/Security/CWE-285/PamAuthorization.ql @@ -11,12 +11,12 @@ */ import python -import DataFlow::PathGraph +import PamAuthorizationFlow::PathGraph import semmle.python.ApiGraphs import semmle.python.security.dataflow.PamAuthorizationQuery -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from PamAuthorizationFlow::PathNode source, PamAuthorizationFlow::PathNode sink +where PamAuthorizationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This PAM authentication depends on a $@, and 'pam_acct_mgmt' is not called afterwards.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-312/CleartextLogging.qhelp b/python/ql/src/Security/CWE-312/CleartextLogging.qhelp index 884b1dbdd4b40..3244a0354d747 100644 --- a/python/ql/src/Security/CWE-312/CleartextLogging.qhelp +++ b/python/ql/src/Security/CWE-312/CleartextLogging.qhelp @@ -2,4 +2,33 @@ "-//Semmle//qhelp//EN" "qhelp.dtd"> - + + + +

If sensitive data is written to a log entry it could be exposed to an attacker +who gains access to the logs.

+ +

Potential attackers can obtain sensitive user data when the log output is displayed. Additionally that data may +expose system information such as full path names, system information, and sometimes usernames and passwords.

+
+ + +

+Sensitive data should not be logged. +

+
+ + +

In the example the entire process environment is logged using `print`. Regular users of the production deployed application +should not have access to this much information about the environment configuration. +

+ + +

In the second example the data that is logged is not sensitive.

+ +
+ + +
+ + diff --git a/python/ql/src/Security/CWE-312/CleartextLogging.ql b/python/ql/src/Security/CWE-312/CleartextLogging.ql index 0c2591eaec440..500a2b5f9b788 100644 --- a/python/ql/src/Security/CWE-312/CleartextLogging.ql +++ b/python/ql/src/Security/CWE-312/CleartextLogging.ql @@ -15,12 +15,13 @@ import python private import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph +import CleartextLoggingFlow::PathGraph import semmle.python.security.dataflow.CleartextLoggingQuery -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink, string classification +from + CleartextLoggingFlow::PathNode source, CleartextLoggingFlow::PathNode sink, string classification where - config.hasFlowPath(source, sink) and + CleartextLoggingFlow::flowPath(source, sink) and classification = source.getNode().(Source).getClassification() select sink.getNode(), source, sink, "This expression logs $@ as clear text.", source.getNode(), "sensitive data (" + classification + ")" diff --git a/python/ql/src/Security/CWE-312/CleartextStorage.ql b/python/ql/src/Security/CWE-312/CleartextStorage.ql index 9a8d5de333117..f83097d6e0b9d 100644 --- a/python/ql/src/Security/CWE-312/CleartextStorage.ql +++ b/python/ql/src/Security/CWE-312/CleartextStorage.ql @@ -15,12 +15,13 @@ import python private import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph +import CleartextStorageFlow::PathGraph import semmle.python.security.dataflow.CleartextStorageQuery -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink, string classification +from + CleartextStorageFlow::PathNode source, CleartextStorageFlow::PathNode sink, string classification where - config.hasFlowPath(source, sink) and + CleartextStorageFlow::flowPath(source, sink) and classification = source.getNode().(Source).getClassification() select sink.getNode(), source, sink, "This expression stores $@ as clear text.", source.getNode(), "sensitive data (" + classification + ")" diff --git a/python/ql/src/Security/CWE-312/examples/CleartextLogging.py b/python/ql/src/Security/CWE-312/examples/CleartextLogging.py new file mode 100644 index 0000000000000..57733712d590b --- /dev/null +++ b/python/ql/src/Security/CWE-312/examples/CleartextLogging.py @@ -0,0 +1,3 @@ +# BAD: Logging cleartext sensitive data +import os +print(f"[INFO] Environment: {os.environ}") \ No newline at end of file diff --git a/python/ql/src/Security/CWE-312/examples/CleartextLoggingGood.py b/python/ql/src/Security/CWE-312/examples/CleartextLoggingGood.py new file mode 100644 index 0000000000000..853f7fe488be9 --- /dev/null +++ b/python/ql/src/Security/CWE-312/examples/CleartextLoggingGood.py @@ -0,0 +1,3 @@ +not_sensitive_data = {'a': 1, 'b': 2} +# GOOD: it is fine to log data that is not sensitive +print(f"[INFO] Some object contains: {not_sensitive_data}") \ No newline at end of file diff --git a/python/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql b/python/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql index ce46a21fe71b3..ef72ae1fdbc15 100644 --- a/python/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql +++ b/python/ql/src/Security/CWE-327/WeakSensitiveDataHashing.ql @@ -16,33 +16,29 @@ import python import semmle.python.security.dataflow.WeakSensitiveDataHashingQuery import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking -import DataFlow::PathGraph +import WeakSensitiveDataHashingFlow::PathGraph from - DataFlow::PathNode source, DataFlow::PathNode sink, string ending, string algorithmName, - string classification + WeakSensitiveDataHashingFlow::PathNode source, WeakSensitiveDataHashingFlow::PathNode sink, + string ending, string algorithmName, string classification where - exists(NormalHashFunction::Configuration config | - config.hasFlowPath(source, sink) and - algorithmName = sink.getNode().(NormalHashFunction::Sink).getAlgorithmName() and - classification = source.getNode().(NormalHashFunction::Source).getClassification() and - ending = "." - ) + normalHashFunctionFlowPath(source, sink) and + algorithmName = sink.getNode().(NormalHashFunction::Sink).getAlgorithmName() and + classification = source.getNode().(NormalHashFunction::Source).getClassification() and + ending = "." or - exists(ComputationallyExpensiveHashFunction::Configuration config | - config.hasFlowPath(source, sink) and - algorithmName = sink.getNode().(ComputationallyExpensiveHashFunction::Sink).getAlgorithmName() and - classification = - source.getNode().(ComputationallyExpensiveHashFunction::Source).getClassification() and - ( - sink.getNode().(ComputationallyExpensiveHashFunction::Sink).isComputationallyExpensive() and - ending = "." - or - not sink.getNode().(ComputationallyExpensiveHashFunction::Sink).isComputationallyExpensive() and - ending = - " for " + classification + - " hashing, since it is not a computationally expensive hash function." - ) + computationallyExpensiveHashFunctionFlowPath(source, sink) and + algorithmName = sink.getNode().(ComputationallyExpensiveHashFunction::Sink).getAlgorithmName() and + classification = + source.getNode().(ComputationallyExpensiveHashFunction::Source).getClassification() and + ( + sink.getNode().(ComputationallyExpensiveHashFunction::Sink).isComputationallyExpensive() and + ending = "." + or + not sink.getNode().(ComputationallyExpensiveHashFunction::Sink).isComputationallyExpensive() and + ending = + " for " + classification + + " hashing, since it is not a computationally expensive hash function." ) select sink.getNode(), source, sink, "$@ is used in a hashing algorithm (" + algorithmName + ") that is insecure" + ending, diff --git a/python/ql/src/Security/CWE-502/UnsafeDeserialization.ql b/python/ql/src/Security/CWE-502/UnsafeDeserialization.ql index a15838cdabd0d..395101de78f7f 100644 --- a/python/ql/src/Security/CWE-502/UnsafeDeserialization.ql +++ b/python/ql/src/Security/CWE-502/UnsafeDeserialization.ql @@ -14,9 +14,9 @@ import python import semmle.python.security.dataflow.UnsafeDeserializationQuery -import DataFlow::PathGraph +import UnsafeDeserializationFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from UnsafeDeserializationFlow::PathNode source, UnsafeDeserializationFlow::PathNode sink +where UnsafeDeserializationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Unsafe deserialization depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-601/UrlRedirect.ql b/python/ql/src/Security/CWE-601/UrlRedirect.ql index fbe3f3349ce42..813cb4a997a98 100644 --- a/python/ql/src/Security/CWE-601/UrlRedirect.ql +++ b/python/ql/src/Security/CWE-601/UrlRedirect.ql @@ -14,9 +14,9 @@ import python import semmle.python.security.dataflow.UrlRedirectQuery -import DataFlow::PathGraph +import UrlRedirectFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from UrlRedirectFlow::PathNode source, UrlRedirectFlow::PathNode 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/python/ql/src/Security/CWE-611/Xxe.ql b/python/ql/src/Security/CWE-611/Xxe.ql index b361f6ffcfb7e..948e0f8a5f958 100644 --- a/python/ql/src/Security/CWE-611/Xxe.ql +++ b/python/ql/src/Security/CWE-611/Xxe.ql @@ -14,10 +14,10 @@ import python import semmle.python.security.dataflow.XxeQuery -import DataFlow::PathGraph +import XxeFlow::PathGraph -from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink -where cfg.hasFlowPath(source, sink) +from XxeFlow::PathNode source, XxeFlow::PathNode 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/python/ql/src/Security/CWE-643/XpathInjection.ql b/python/ql/src/Security/CWE-643/XpathInjection.ql index 07df47624e74e..90d4bcbd2c35c 100644 --- a/python/ql/src/Security/CWE-643/XpathInjection.ql +++ b/python/ql/src/Security/CWE-643/XpathInjection.ql @@ -13,9 +13,9 @@ import python import semmle.python.security.dataflow.XpathInjectionQuery -import DataFlow::PathGraph +import XpathInjectionFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from XpathInjectionFlow::PathNode source, XpathInjectionFlow::PathNode sink +where XpathInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XPath expression depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-730/PolynomialReDoS.ql b/python/ql/src/Security/CWE-730/PolynomialReDoS.ql index 1b315c651c3b0..b3b4a8cac92a6 100644 --- a/python/ql/src/Security/CWE-730/PolynomialReDoS.ql +++ b/python/ql/src/Security/CWE-730/PolynomialReDoS.ql @@ -15,13 +15,13 @@ import python import semmle.python.security.dataflow.PolynomialReDoSQuery -import DataFlow::PathGraph +import PolynomialReDoSFlow::PathGraph from - Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink, Sink sinkNode, + PolynomialReDoSFlow::PathNode source, PolynomialReDoSFlow::PathNode sink, Sink sinkNode, PolynomialBackTrackingTerm regexp where - config.hasFlowPath(source, sink) and + PolynomialReDoSFlow::flowPath(source, sink) and sinkNode = sink.getNode() and regexp.getRootTerm() = sinkNode.getRegExp() // not ( diff --git a/python/ql/src/Security/CWE-730/RegexInjection.ql b/python/ql/src/Security/CWE-730/RegexInjection.ql index 5075c7a675dfb..fe1dc1dfe6601 100644 --- a/python/ql/src/Security/CWE-730/RegexInjection.ql +++ b/python/ql/src/Security/CWE-730/RegexInjection.ql @@ -16,13 +16,13 @@ import python private import semmle.python.Concepts import semmle.python.security.dataflow.RegexInjectionQuery -import DataFlow::PathGraph +import RegexInjectionFlow::PathGraph from - Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink, + RegexInjectionFlow::PathNode source, RegexInjectionFlow::PathNode sink, RegexExecution regexExecution where - config.hasFlowPath(source, sink) and + RegexInjectionFlow::flowPath(source, sink) and regexExecution = sink.getNode().(Sink).getRegexExecution() select sink.getNode(), source, sink, "This regular expression depends on a $@ and is executed by $@.", source.getNode(), diff --git a/python/ql/src/Security/CWE-776/XmlBomb.ql b/python/ql/src/Security/CWE-776/XmlBomb.ql index f943aa58c44f6..c92d4f289f53e 100644 --- a/python/ql/src/Security/CWE-776/XmlBomb.ql +++ b/python/ql/src/Security/CWE-776/XmlBomb.ql @@ -14,10 +14,10 @@ import python import semmle.python.security.dataflow.XmlBombQuery -import DataFlow::PathGraph +import XmlBombFlow::PathGraph -from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink -where cfg.hasFlowPath(source, sink) +from XmlBombFlow::PathNode source, XmlBombFlow::PathNode sink +where XmlBombFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XML parsing depends on a $@ without guarding against uncontrolled entity expansion.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-798/HardcodedCredentials.ql b/python/ql/src/Security/CWE-798/HardcodedCredentials.ql index d1d29a78ff549..0a92427ec2302 100644 --- a/python/ql/src/Security/CWE-798/HardcodedCredentials.ql +++ b/python/ql/src/Security/CWE-798/HardcodedCredentials.ql @@ -16,7 +16,6 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import semmle.python.filters.Tests -import DataFlow::PathGraph bindingset[char, fraction] predicate fewer_characters_than(StrConst str, string char, float fraction) { @@ -108,17 +107,19 @@ private string getACredentialRegex() { result = "(?i).*(cert)(?!.*(format|name)).*" } -class HardcodedCredentialsConfiguration extends TaintTracking::Configuration { - HardcodedCredentialsConfiguration() { this = "Hardcoded credentials configuration" } +private module HardcodedCredentialsConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof HardcodedValueSource } - override predicate isSource(DataFlow::Node source) { source instanceof HardcodedValueSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof CredentialSink } + predicate isSink(DataFlow::Node sink) { sink instanceof CredentialSink } } -from HardcodedCredentialsConfiguration config, DataFlow::PathNode src, DataFlow::PathNode sink +module HardcodedCredentialsFlow = TaintTracking::Global; + +import HardcodedCredentialsFlow::PathGraph + +from HardcodedCredentialsFlow::PathNode src, HardcodedCredentialsFlow::PathNode sink where - config.hasFlowPath(src, sink) and + HardcodedCredentialsFlow::flowPath(src, sink) and not any(TestScope test).contains(src.getNode().asCfgNode().getNode()) select src.getNode(), src, sink, "This hardcoded value is $@.", sink.getNode(), "used as credentials" diff --git a/python/ql/src/Security/CWE-918/FullServerSideRequestForgery.ql b/python/ql/src/Security/CWE-918/FullServerSideRequestForgery.ql index a29f9e775a1ea..4114ff31ce0d2 100644 --- a/python/ql/src/Security/CWE-918/FullServerSideRequestForgery.ql +++ b/python/ql/src/Security/CWE-918/FullServerSideRequestForgery.ql @@ -12,14 +12,14 @@ import python import semmle.python.security.dataflow.ServerSideRequestForgeryQuery -import DataFlow::PathGraph +import FullServerSideRequestForgeryFlow::PathGraph from - FullServerSideRequestForgeryConfiguration fullConfig, DataFlow::PathNode source, - DataFlow::PathNode sink, Http::Client::Request request + FullServerSideRequestForgeryFlow::PathNode source, + FullServerSideRequestForgeryFlow::PathNode sink, Http::Client::Request request where request = sink.getNode().(Sink).getRequest() and - fullConfig.hasFlowPath(source, sink) and + FullServerSideRequestForgeryFlow::flowPath(source, sink) and fullyControlledRequest(request) select request, source, sink, "The full URL of this request depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-918/PartialServerSideRequestForgery.ql b/python/ql/src/Security/CWE-918/PartialServerSideRequestForgery.ql index 3bbeaabcce6c6..c6c679ca5e3fe 100644 --- a/python/ql/src/Security/CWE-918/PartialServerSideRequestForgery.ql +++ b/python/ql/src/Security/CWE-918/PartialServerSideRequestForgery.ql @@ -12,14 +12,14 @@ import python import semmle.python.security.dataflow.ServerSideRequestForgeryQuery -import DataFlow::PathGraph +import PartialServerSideRequestForgeryFlow::PathGraph from - PartialServerSideRequestForgeryConfiguration partialConfig, DataFlow::PathNode source, - DataFlow::PathNode sink, Http::Client::Request request + PartialServerSideRequestForgeryFlow::PathNode source, + PartialServerSideRequestForgeryFlow::PathNode sink, Http::Client::Request request where request = sink.getNode().(Sink).getRequest() and - partialConfig.hasFlowPath(source, sink) and + PartialServerSideRequestForgeryFlow::flowPath(source, sink) and not fullyControlledRequest(request) select request, source, sink, "Part of the URL of this request depends on a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/Security/CWE-918/examples/ServerSideRequestForgery_full.py b/python/ql/src/Security/CWE-918/examples/ServerSideRequestForgery_full.py index 4772f3eaea4d7..0272458218224 100644 --- a/python/ql/src/Security/CWE-918/examples/ServerSideRequestForgery_full.py +++ b/python/ql/src/Security/CWE-918/examples/ServerSideRequestForgery_full.py @@ -8,8 +8,8 @@ def full_ssrf(): target = request.args["target"] # BAD: user has full control of URL - resp = request.get("https://" + target + ".example.com/data/") + resp = requests.get("https://" + target + ".example.com/data/") # GOOD: `subdomain` is controlled by the server. subdomain = "europe" if target == "EU" else "world" - resp = request.get("https://" + subdomain + ".example.com/data/") + resp = requests.get("https://" + subdomain + ".example.com/data/") diff --git a/python/ql/src/change-notes/2023-09-05-asyncio-cmdi-sinks.md b/python/ql/src/change-notes/2023-09-05-asyncio-cmdi-sinks.md new file mode 100644 index 0000000000000..6a05b201d6b74 --- /dev/null +++ b/python/ql/src/change-notes/2023-09-05-asyncio-cmdi-sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Extended the `py/command-line-injection` query with sinks from Python's `asyncio` module. diff --git a/python/ql/src/experimental/Security/CWE-022/ZipSlip.ql b/python/ql/src/experimental/Security/CWE-022/ZipSlip.ql index eba8da087b308..4bdca63e1d61c 100644 --- a/python/ql/src/experimental/Security/CWE-022/ZipSlip.ql +++ b/python/ql/src/experimental/Security/CWE-022/ZipSlip.ql @@ -15,10 +15,10 @@ import python import experimental.semmle.python.security.ZipSlip -import DataFlow::PathGraph +import ZipSlipFlow::PathGraph -from ZipSlipConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from ZipSlipFlow::PathNode source, ZipSlipFlow::PathNode sink +where ZipSlipFlow::flowPath(source, sink) select source.getNode(), source, sink, "This unsanitized archive entry, which may contain '..', is used in a $@.", sink.getNode(), "file system operation" diff --git a/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql b/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql index 65ff272bbbd7f..431fe293cecde 100755 --- a/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql +++ b/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql @@ -16,7 +16,7 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking -import DataFlow::PathGraph +import TarSlipImprovFlow::PathGraph import semmle.python.ApiGraphs import semmle.python.dataflow.new.internal.Attributes import semmle.python.dataflow.new.BarrierGuards @@ -54,12 +54,10 @@ class AllTarfileOpens extends API::CallNode { /** * A taint-tracking configuration for detecting more "TarSlip" vulnerabilities. */ -class Configuration extends TaintTracking::Configuration { - Configuration() { this = "TarSlip" } +private module TarSlipImprovConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source = tarfileOpen().getACall() } - override predicate isSource(DataFlow::Node source) { source = tarfileOpen().getACall() } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { ( // A sink capturing method calls to `extractall` without `members` argument. // For a call to `file.extractall` without `members` argument, `file` is considered a sink. @@ -100,7 +98,7 @@ class Configuration extends TaintTracking::Configuration { not sink.getScope().getLocation().getFile().inStdlib() } - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { nodeTo.(MethodCallNode).calls(nodeFrom, "getmembers") and nodeFrom instanceof AllTarfileOpens or @@ -113,7 +111,10 @@ class Configuration extends TaintTracking::Configuration { } } -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +/** Global taint-tracking for detecting more "TarSlip" vulnerabilities. */ +module TarSlipImprovFlow = TaintTracking::Global; + +from TarSlipImprovFlow::PathNode source, TarSlipImprovFlow::PathNode sink +where TarSlipImprovFlow::flowPath(source, sink) select sink, source, sink, "Extraction of tarfile from $@ to a potentially untrusted source $@.", source.getNode(), source.getNode().toString(), sink.getNode(), sink.getNode().toString() diff --git a/python/ql/src/experimental/Security/CWE-022bis/UnsafeUnpack.ql b/python/ql/src/experimental/Security/CWE-022bis/UnsafeUnpack.ql index a6a0e06559ced..1afe3f738ad50 100644 --- a/python/ql/src/experimental/Security/CWE-022bis/UnsafeUnpack.ql +++ b/python/ql/src/experimental/Security/CWE-022bis/UnsafeUnpack.ql @@ -16,9 +16,9 @@ import python import experimental.Security.UnsafeUnpackQuery -import DataFlow::PathGraph +import UnsafeUnpackFlow::PathGraph -from UnsafeUnpackingConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from UnsafeUnpackFlow::PathNode source, UnsafeUnpackFlow::PathNode sink +where UnsafeUnpackFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Unsafe extraction from a malicious tarball retrieved from a remote location." diff --git a/python/ql/src/experimental/Security/CWE-074/paramiko/paramiko.ql b/python/ql/src/experimental/Security/CWE-074/paramiko/paramiko.ql index 5a38a673080ba..a902ff045c463 100644 --- a/python/ql/src/experimental/Security/CWE-074/paramiko/paramiko.ql +++ b/python/ql/src/experimental/Security/CWE-074/paramiko/paramiko.ql @@ -16,16 +16,13 @@ import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import semmle.python.dataflow.new.RemoteFlowSources import semmle.python.ApiGraphs -import DataFlow::PathGraph private API::Node paramikoClient() { result = API::moduleImport("paramiko").getMember("SSHClient").getReturn() } -class ParamikoCmdInjectionConfiguration extends TaintTracking::Configuration { - ParamikoCmdInjectionConfiguration() { this = "ParamikoCMDInjectionConfiguration" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } +private module ParamikoConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } /** * exec_command of `paramiko.SSHClient` class execute command on ssh target server @@ -33,7 +30,7 @@ class ParamikoCmdInjectionConfiguration extends TaintTracking::Configuration { * and it run CMD on current system that running the ssh command * the Sink related to proxy command is the `connect` method of `paramiko.SSHClient` class */ - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink = paramikoClient().getMember("exec_command").getACall().getParameter(0, "command").asSink() or sink = paramikoClient().getMember("connect").getACall().getParameter(11, "sock").asSink() @@ -42,7 +39,7 @@ class ParamikoCmdInjectionConfiguration extends TaintTracking::Configuration { /** * this additional taint step help taint tracking to find the vulnerable `connect` method of `paramiko.SSHClient` class */ - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { exists(API::CallNode call | call = API::moduleImport("paramiko").getMember("ProxyCommand").getACall() and nodeFrom = call.getParameter(0, "command_line").asSink() and @@ -51,7 +48,12 @@ class ParamikoCmdInjectionConfiguration extends TaintTracking::Configuration { } } -from ParamikoCmdInjectionConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +/** Global taint-tracking for detecting "paramiko command injection" vulnerabilities. */ +module ParamikoFlow = TaintTracking::Global; + +import ParamikoFlow::PathGraph + +from ParamikoFlow::PathNode source, ParamikoFlow::PathNode sink +where ParamikoFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This code execution depends on a $@.", source.getNode(), "a user-provided value" diff --git a/python/ql/src/experimental/Security/CWE-079/ReflectedXSS.ql b/python/ql/src/experimental/Security/CWE-079/EmailXss.ql similarity index 72% rename from python/ql/src/experimental/Security/CWE-079/ReflectedXSS.ql rename to python/ql/src/experimental/Security/CWE-079/EmailXss.ql index 468cef01f7d1b..046efdeba8916 100644 --- a/python/ql/src/experimental/Security/CWE-079/ReflectedXSS.ql +++ b/python/ql/src/experimental/Security/CWE-079/EmailXss.ql @@ -15,10 +15,10 @@ // determine precision above import python -import experimental.semmle.python.security.dataflow.ReflectedXSS -import DataFlow::PathGraph +import experimental.semmle.python.security.dataflow.EmailXss +import EmailXssFlow::PathGraph -from ReflectedXssConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from EmailXssFlow::PathNode source, EmailXssFlow::PathNode sink +where EmailXssFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(), "a user-provided value" diff --git a/python/ql/src/experimental/Security/CWE-113/HeaderInjection.ql b/python/ql/src/experimental/Security/CWE-113/HeaderInjection.ql index 65305d2f3b57d..6527df0333968 100644 --- a/python/ql/src/experimental/Security/CWE-113/HeaderInjection.ql +++ b/python/ql/src/experimental/Security/CWE-113/HeaderInjection.ql @@ -14,9 +14,9 @@ // determine precision above import python import experimental.semmle.python.security.injection.HTTPHeaders -import DataFlow::PathGraph +import HeaderInjectionFlow::PathGraph -from HeaderInjectionFlowConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from HeaderInjectionFlow::PathNode source, HeaderInjectionFlow::PathNode sink +where HeaderInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This HTTP header is constructed from a $@.", source.getNode(), "user-provided value" diff --git a/python/ql/src/experimental/Security/CWE-1236/CsvInjection.ql b/python/ql/src/experimental/Security/CWE-1236/CsvInjection.ql index 28a68dd78df3c..df9b7cf9f654a 100644 --- a/python/ql/src/experimental/Security/CWE-1236/CsvInjection.ql +++ b/python/ql/src/experimental/Security/CWE-1236/CsvInjection.ql @@ -11,11 +11,11 @@ */ import python -import DataFlow::PathGraph +import CsvInjectionFlow::PathGraph import semmle.python.dataflow.new.DataFlow import experimental.semmle.python.security.injection.CsvInjection -from CsvInjectionFlowConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from CsvInjectionFlow::PathNode source, CsvInjectionFlow::PathNode sink +where CsvInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Csv injection might include code from $@.", source.getNode(), "this user input" diff --git a/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidation.ql b/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidation.ql index 67c6165376379..f830c0ea25d5e 100644 --- a/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidation.ql +++ b/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidation.ql @@ -14,10 +14,10 @@ import python import UnicodeBypassValidationQuery -import DataFlow::PathGraph +import UnicodeBypassValidationFlow::PathGraph -from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from UnicodeBypassValidationFlow::PathNode source, UnicodeBypassValidationFlow::PathNode sink +where UnicodeBypassValidationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This $@ processes unsafely $@ and any logical validation in-between could be bypassed using special Unicode characters.", sink.getNode(), "Unicode transformation (Unicode normalization)", source.getNode(), diff --git a/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidationQuery.qll b/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidationQuery.qll index 702a69a709564..a5d9d53b084e6 100644 --- a/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidationQuery.qll +++ b/python/ql/src/experimental/Security/CWE-176/UnicodeBypassValidationQuery.qll @@ -3,6 +3,7 @@ */ private import python +import semmle.python.dataflow.new.DataFlow import semmle.python.ApiGraphs import semmle.python.Concepts import semmle.python.dataflow.new.internal.DataFlowPublic @@ -27,16 +28,15 @@ class PostValidation extends DataFlow::FlowState { * This configuration uses two flow states, `PreValidation` and `PostValidation`, * to track the requirement that a logical validation has been performed before the Unicode Transformation. */ -class Configuration extends TaintTracking::Configuration { - Configuration() { this = "UnicodeBypassValidation" } +private module UnicodeBypassValidationConfig implements DataFlow::StateConfigSig { + class FlowState = DataFlow::FlowState; - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + predicate isSource(DataFlow::Node source, FlowState state) { source instanceof RemoteFlowSource and state instanceof PreValidation } - override predicate isAdditionalTaintStep( - DataFlow::Node nodeFrom, DataFlow::FlowState stateFrom, DataFlow::Node nodeTo, - DataFlow::FlowState stateTo + predicate isAdditionalFlowStep( + DataFlow::Node nodeFrom, FlowState stateFrom, DataFlow::Node nodeTo, FlowState stateTo ) { ( exists(Escaping escaping | nodeFrom = escaping.getAnInput() and nodeTo = escaping.getOutput()) @@ -51,7 +51,7 @@ class Configuration extends TaintTracking::Configuration { } /* A Unicode Tranformation (Unicode tranformation) is considered a sink when the algorithm used is either NFC or NFKC. */ - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { + predicate isSink(DataFlow::Node sink, FlowState state) { exists(API::CallNode cn | cn = API::moduleImport("unicodedata").getMember("normalize").getACall() and sink = cn.getArg(1) @@ -71,3 +71,6 @@ class Configuration extends TaintTracking::Configuration { state instanceof PostValidation } } + +/** Global taint-tracking for detecting "Unicode transformation mishandling" vulnerabilities. */ +module UnicodeBypassValidationFlow = TaintTracking::GlobalWithState; diff --git a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/PossibleTimingAttackAgainstHash.ql b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/PossibleTimingAttackAgainstHash.ql index f46b93fb266fd..82ba11c1d4ba2 100644 --- a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/PossibleTimingAttackAgainstHash.ql +++ b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/PossibleTimingAttackAgainstHash.ql @@ -17,21 +17,25 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import experimental.semmle.python.security.TimingAttack -import DataFlow::PathGraph /** * A configuration that tracks data flow from cryptographic operations * to equality test */ -class PossibleTimingAttackAgainstHash extends TaintTracking::Configuration { - PossibleTimingAttackAgainstHash() { this = "PossibleTimingAttackAgainstHash" } +private module PossibleTimingAttackAgainstHashConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof ProduceCryptoCall } - override predicate isSource(DataFlow::Node source) { source instanceof ProduceCryptoCall } - - override predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } + predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } } -from PossibleTimingAttackAgainstHash config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +module PossibleTimingAttackAgainstHashFlow = + TaintTracking::Global; + +import PossibleTimingAttackAgainstHashFlow::PathGraph + +from + PossibleTimingAttackAgainstHashFlow::PathNode source, + PossibleTimingAttackAgainstHashFlow::PathNode sink +where PossibleTimingAttackAgainstHashFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Possible Timing attack against $@ validation.", source.getNode().(ProduceCryptoCall).getResultType(), "message" diff --git a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/TimingAttackAgainstHash.ql b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/TimingAttackAgainstHash.ql index 392356b7c426d..e08f1dbb5177d 100644 --- a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/TimingAttackAgainstHash.ql +++ b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHash/TimingAttackAgainstHash.ql @@ -16,23 +16,24 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import experimental.semmle.python.security.TimingAttack -import DataFlow::PathGraph /** * A configuration that tracks data flow from cryptographic operations * to Equality test. */ -class TimingAttackAgainsthash extends TaintTracking::Configuration { - TimingAttackAgainsthash() { this = "TimingAttackAgainsthash" } +private module TimingAttackAgainstHashConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof ProduceCryptoCall } - override predicate isSource(DataFlow::Node source) { source instanceof ProduceCryptoCall } - - override predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } + predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } } -from TimingAttackAgainsthash config, DataFlow::PathNode source, DataFlow::PathNode sink +module TimingAttackAgainstHashFlow = TaintTracking::Global; + +import TimingAttackAgainstHashFlow::PathGraph + +from TimingAttackAgainstHashFlow::PathNode source, TimingAttackAgainstHashFlow::PathNode sink where - config.hasFlowPath(source, sink) and + TimingAttackAgainstHashFlow::flowPath(source, sink) and sink.getNode().(NonConstantTimeComparisonSink).includesUserInput() select sink.getNode(), source, sink, "Timing attack against $@ validation.", source.getNode().(ProduceCryptoCall).getResultType(), "message" diff --git a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHeaderValue/TimingAttackAgainstHeaderValue.ql b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHeaderValue/TimingAttackAgainstHeaderValue.ql index 1f2ff8f50fbe2..a1da41530a8f0 100644 --- a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHeaderValue/TimingAttackAgainstHeaderValue.ql +++ b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstHeaderValue/TimingAttackAgainstHeaderValue.ql @@ -15,20 +15,26 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import experimental.semmle.python.security.TimingAttack -import DataFlow::PathGraph /** * A configuration tracing flow from a client Secret obtained by an HTTP header to a unsafe Comparison. */ -class ClientSuppliedSecretConfig extends TaintTracking::Configuration { - ClientSuppliedSecretConfig() { this = "ClientSuppliedSecretConfig" } +private module TimingAttackAgainstHeaderValueConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof ClientSuppliedSecret } - override predicate isSource(DataFlow::Node source) { source instanceof ClientSuppliedSecret } - - override predicate isSink(DataFlow::Node sink) { sink instanceof CompareSink } + predicate isSink(DataFlow::Node sink) { sink instanceof CompareSink } } -from ClientSuppliedSecretConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) and not sink.getNode().(CompareSink).flowtolen() +module TimingAttackAgainstHeaderValueFlow = + TaintTracking::Global; + +import TimingAttackAgainstHeaderValueFlow::PathGraph + +from + TimingAttackAgainstHeaderValueFlow::PathNode source, + TimingAttackAgainstHeaderValueFlow::PathNode sink +where + TimingAttackAgainstHeaderValueFlow::flowPath(source, sink) and + not sink.getNode().(CompareSink).flowtolen() select sink.getNode(), source, sink, "Timing attack against $@ validation.", source.getNode(), "client-supplied token" diff --git a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.ql b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.ql index d43c3aa8995b2..cdf350dd7cd26 100644 --- a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.ql +++ b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.ql @@ -15,20 +15,24 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import experimental.semmle.python.security.TimingAttack -import DataFlow::PathGraph /** * A configuration tracing flow from obtaining a client Secret to a unsafe Comparison. */ -class ClientSuppliedSecretConfig extends TaintTracking::Configuration { - ClientSuppliedSecretConfig() { this = "ClientSuppliedSecretConfig" } +private module PossibleTimingAttackAgainstSensitiveInfoConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof SecretSource } - override predicate isSource(DataFlow::Node source) { source instanceof SecretSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } + predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } } -from ClientSuppliedSecretConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +module PossibleTimingAttackAgainstSensitiveInfoFlow = + TaintTracking::Global; + +import PossibleTimingAttackAgainstSensitiveInfoFlow::PathGraph + +from + PossibleTimingAttackAgainstSensitiveInfoFlow::PathNode source, + PossibleTimingAttackAgainstSensitiveInfoFlow::PathNode sink +where PossibleTimingAttackAgainstSensitiveInfoFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Timing attack against $@ validation.", source.getNode(), "client-supplied token" diff --git a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/TimingAttackAgainstSensitiveInfo.ql b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/TimingAttackAgainstSensitiveInfo.ql index 63587d4afcc12..8ec4fac97e321 100644 --- a/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/TimingAttackAgainstSensitiveInfo.ql +++ b/python/ql/src/experimental/Security/CWE-208/TimingAttackAgainstSensitiveInfo/TimingAttackAgainstSensitiveInfo.ql @@ -15,22 +15,25 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import experimental.semmle.python.security.TimingAttack -import DataFlow::PathGraph +import TimingAttackAgainstSensitiveInfoFlow::PathGraph /** * A configuration tracing flow from obtaining a client Secret to a unsafe Comparison. */ -class ClientSuppliedSecretConfig extends TaintTracking::Configuration { - ClientSuppliedSecretConfig() { this = "ClientSuppliedSecretConfig" } +private module TimingAttackAgainstSensitiveInfoConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof SecretSource } - override predicate isSource(DataFlow::Node source) { source instanceof SecretSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } + predicate isSink(DataFlow::Node sink) { sink instanceof NonConstantTimeComparisonSink } } -from ClientSuppliedSecretConfig config, DataFlow::PathNode source, DataFlow::PathNode sink +module TimingAttackAgainstSensitiveInfoFlow = + TaintTracking::Global; + +from + TimingAttackAgainstSensitiveInfoFlow::PathNode source, + TimingAttackAgainstSensitiveInfoFlow::PathNode sink where - config.hasFlowPath(source, sink) and + TimingAttackAgainstSensitiveInfoFlow::flowPath(source, sink) and ( source.getNode().(SecretSource).includesUserInput() or sink.getNode().(NonConstantTimeComparisonSink).includesUserInput() diff --git a/python/ql/src/experimental/Security/CWE-287-ConstantSecretKey/WebAppConstantSecretKey.ql b/python/ql/src/experimental/Security/CWE-287-ConstantSecretKey/WebAppConstantSecretKey.ql index 3854862823788..7bb35012b389f 100644 --- a/python/ql/src/experimental/Security/CWE-287-ConstantSecretKey/WebAppConstantSecretKey.ql +++ b/python/ql/src/experimental/Security/CWE-287-ConstantSecretKey/WebAppConstantSecretKey.ql @@ -25,7 +25,7 @@ newtype TFrameWork = Flask() or Django() -module WebAppConstantSecretKeyConfig implements DataFlow::StateConfigSig { +private module WebAppConstantSecretKeyConfig implements DataFlow::StateConfigSig { class FlowState = TFrameWork; predicate isSource(DataFlow::Node source, FlowState state) { @@ -54,11 +54,11 @@ module WebAppConstantSecretKeyConfig implements DataFlow::StateConfigSig { } } -module WebAppConstantSecretKey = TaintTracking::GlobalWithState; +module WebAppConstantSecretKeyFlow = TaintTracking::GlobalWithState; -import WebAppConstantSecretKey::PathGraph +import WebAppConstantSecretKeyFlow::PathGraph -from WebAppConstantSecretKey::PathNode source, WebAppConstantSecretKey::PathNode sink -where WebAppConstantSecretKey::flowPath(source, sink) +from WebAppConstantSecretKeyFlow::PathNode source, WebAppConstantSecretKeyFlow::PathNode sink +where WebAppConstantSecretKeyFlow::flowPath(source, sink) select sink, source, sink, "The SECRET_KEY config variable is assigned by $@.", source, " this constant String" diff --git a/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql b/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql index 9b73cdcec87ef..b23ca4b0bc661 100644 --- a/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql +++ b/python/ql/src/experimental/Security/CWE-327/Azure/UnsafeUsageOfClientSideEncryptionVersion.ql @@ -96,7 +96,7 @@ newtype TAzureFlowState = MkUsesV1Encryption() or MkUsesNoEncryption() -module AzureBlobClientConfig implements DataFlow::StateConfigSig { +private module AzureBlobClientConfig implements DataFlow::StateConfigSig { class FlowState = TAzureFlowState; predicate isSource(DataFlow::Node node, FlowState state) { @@ -147,10 +147,10 @@ module AzureBlobClientConfig implements DataFlow::StateConfigSig { } } -module AzureBlobClient = DataFlow::GlobalWithState; +module AzureBlobClientFlow = DataFlow::GlobalWithState; -import AzureBlobClient::PathGraph +import AzureBlobClientFlow::PathGraph -from AzureBlobClient::PathNode source, AzureBlobClient::PathNode sink -where AzureBlobClient::flowPath(source, sink) +from AzureBlobClientFlow::PathNode source, AzureBlobClientFlow::PathNode sink +where AzureBlobClientFlow::flowPath(source, sink) select sink, source, sink, "Unsafe usage of v1 version of Azure Storage client-side encryption" diff --git a/python/ql/src/experimental/Security/CWE-338/InsecureRandomness.ql b/python/ql/src/experimental/Security/CWE-338/InsecureRandomness.ql index 476906283aa7b..1991300726bf6 100644 --- a/python/ql/src/experimental/Security/CWE-338/InsecureRandomness.ql +++ b/python/ql/src/experimental/Security/CWE-338/InsecureRandomness.ql @@ -14,11 +14,11 @@ */ import python -import experimental.semmle.python.security.InsecureRandomness::InsecureRandomness +import experimental.semmle.python.security.InsecureRandomness import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph +import InsecureRandomness::Flow::PathGraph -from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink -where cfg.hasFlowPath(source, sink) +from InsecureRandomness::Flow::PathNode source, InsecureRandomness::Flow::PathNode sink +where InsecureRandomness::Flow::flowPath(source, sink) select sink.getNode(), source, sink, "Cryptographically insecure $@ in a security context.", source.getNode(), "random value" diff --git a/python/ql/src/experimental/Security/CWE-340/TokenBuiltFromUUID.ql b/python/ql/src/experimental/Security/CWE-340/TokenBuiltFromUUID.ql index 711abdb2f33a3..b91f2dd6237b8 100644 --- a/python/ql/src/experimental/Security/CWE-340/TokenBuiltFromUUID.ql +++ b/python/ql/src/experimental/Security/CWE-340/TokenBuiltFromUUID.ql @@ -16,7 +16,6 @@ import python import semmle.python.dataflow.new.DataFlow import semmle.python.ApiGraphs import semmle.python.dataflow.new.TaintTracking -import DataFlow::PathGraph class PredictableResultSource extends DataFlow::Node { PredictableResultSource() { @@ -40,14 +39,12 @@ class TokenAssignmentValueSink extends DataFlow::Node { } } -class TokenBuiltFromUuidConfig extends TaintTracking::Configuration { - TokenBuiltFromUuidConfig() { this = "TokenBuiltFromUuidConfig" } +private module TokenBuiltFromUuidConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof PredictableResultSource } - override predicate isSource(DataFlow::Node source) { source instanceof PredictableResultSource } + predicate isSink(DataFlow::Node sink) { sink instanceof TokenAssignmentValueSink } - override predicate isSink(DataFlow::Node sink) { sink instanceof TokenAssignmentValueSink } - - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { exists(DataFlow::CallCfgNode call | call = API::builtin("str").getACall() and nodeFrom = call.getArg(0) and @@ -56,6 +53,11 @@ class TokenBuiltFromUuidConfig extends TaintTracking::Configuration { } } -from DataFlow::PathNode source, DataFlow::PathNode sink, TokenBuiltFromUuidConfig config -where config.hasFlowPath(source, sink) +/** Global taint-tracking for detecting "TokenBuiltFromUUID" vulnerabilities. */ +module TokenBuiltFromUuidFlow = TaintTracking::Global; + +import TokenBuiltFromUuidFlow::PathGraph + +from TokenBuiltFromUuidFlow::PathNode source, TokenBuiltFromUuidFlow::PathNode sink +where TokenBuiltFromUuidFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Token built from $@.", source.getNode(), "predictable value" diff --git a/python/ql/src/experimental/Security/CWE-348/ClientSuppliedIpUsedInSecurityCheck.ql b/python/ql/src/experimental/Security/CWE-348/ClientSuppliedIpUsedInSecurityCheck.ql index aec637269acb0..51d6c9b66524b 100644 --- a/python/ql/src/experimental/Security/CWE-348/ClientSuppliedIpUsedInSecurityCheck.ql +++ b/python/ql/src/experimental/Security/CWE-348/ClientSuppliedIpUsedInSecurityCheck.ql @@ -16,21 +16,19 @@ import semmle.python.dataflow.new.DataFlow import semmle.python.dataflow.new.TaintTracking import semmle.python.ApiGraphs import ClientSuppliedIpUsedInSecurityCheckLib -import DataFlow::PathGraph +import ClientSuppliedIpUsedInSecurityCheckFlow::PathGraph /** * A taint-tracking configuration tracing flow from obtaining a client ip from an HTTP header to a sensitive use. */ -class ClientSuppliedIpUsedInSecurityCheckConfig extends TaintTracking::Configuration { - ClientSuppliedIpUsedInSecurityCheckConfig() { this = "ClientSuppliedIpUsedInSecurityCheckConfig" } - - override predicate isSource(DataFlow::Node source) { +private module ClientSuppliedIpUsedInSecurityCheckConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof ClientSuppliedIpUsedInSecurityCheck } - override predicate isSink(DataFlow::Node sink) { sink instanceof PossibleSecurityCheck } + predicate isSink(DataFlow::Node sink) { sink instanceof PossibleSecurityCheck } - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { exists(DataFlow::CallCfgNode ccn | ccn = API::moduleImport("netaddr").getMember("IPAddress").getACall() and ccn.getArg(0) = pred and @@ -38,7 +36,7 @@ class ClientSuppliedIpUsedInSecurityCheckConfig extends TaintTracking::Configura ) } - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { // `client_supplied_ip.split(",")[n]` for `n` > 0 exists(Subscript ss | not ss.getIndex().(IntegerLiteral).getText() = "0" and @@ -49,9 +47,13 @@ class ClientSuppliedIpUsedInSecurityCheckConfig extends TaintTracking::Configura } } +/** Global taint-tracking for detecting "client ip used in security check" vulnerabilities. */ +module ClientSuppliedIpUsedInSecurityCheckFlow = + TaintTracking::Global; + from - ClientSuppliedIpUsedInSecurityCheckConfig config, DataFlow::PathNode source, - DataFlow::PathNode sink -where config.hasFlowPath(source, sink) + ClientSuppliedIpUsedInSecurityCheckFlow::PathNode source, + ClientSuppliedIpUsedInSecurityCheckFlow::PathNode sink +where ClientSuppliedIpUsedInSecurityCheckFlow::flowPath(source, sink) select sink.getNode(), source, sink, "IP address spoofing might include code from $@.", source.getNode(), "this user input" diff --git a/python/ql/src/experimental/Security/CWE-522/LDAPInsecureAuth.qhelp b/python/ql/src/experimental/Security/CWE-522/LdapInsecureAuth.qhelp similarity index 100% rename from python/ql/src/experimental/Security/CWE-522/LDAPInsecureAuth.qhelp rename to python/ql/src/experimental/Security/CWE-522/LdapInsecureAuth.qhelp diff --git a/python/ql/src/experimental/Security/CWE-522/LDAPInsecureAuth.ql b/python/ql/src/experimental/Security/CWE-522/LdapInsecureAuth.ql similarity index 64% rename from python/ql/src/experimental/Security/CWE-522/LDAPInsecureAuth.ql rename to python/ql/src/experimental/Security/CWE-522/LdapInsecureAuth.ql index 960ef9a671a7e..8b72780d91a89 100644 --- a/python/ql/src/experimental/Security/CWE-522/LDAPInsecureAuth.ql +++ b/python/ql/src/experimental/Security/CWE-522/LdapInsecureAuth.ql @@ -12,9 +12,9 @@ // determine precision above import python -import DataFlow::PathGraph -import experimental.semmle.python.security.LDAPInsecureAuth +import experimental.semmle.python.security.LdapInsecureAuth +import LdapInsecureAuthFlow::PathGraph -from LdapInsecureAuthConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) +from LdapInsecureAuthFlow::PathNode source, LdapInsecureAuthFlow::PathNode sink +where LdapInsecureAuthFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This LDAP host is authenticated insecurely." diff --git a/python/ql/src/experimental/Security/CWE-614/CookieInjection.ql b/python/ql/src/experimental/Security/CWE-614/CookieInjection.ql index 894a69753d92a..4193e37dee245 100644 --- a/python/ql/src/experimental/Security/CWE-614/CookieInjection.ql +++ b/python/ql/src/experimental/Security/CWE-614/CookieInjection.ql @@ -15,13 +15,11 @@ import semmle.python.dataflow.new.DataFlow import experimental.semmle.python.Concepts import experimental.semmle.python.CookieHeader import experimental.semmle.python.security.injection.CookieInjection -import DataFlow::PathGraph +import CookieInjectionFlow::PathGraph -from - CookieInjectionFlowConfig config, DataFlow::PathNode source, DataFlow::PathNode sink, - string insecure +from CookieInjectionFlow::PathNode source, CookieInjectionFlow::PathNode sink, string insecure where - config.hasFlowPath(source, sink) and + CookieInjectionFlow::flowPath(source, sink) and if exists(sink.getNode().(CookieSink)) then insecure = ",and its " + sink.getNode().(CookieSink).getFlag() + " flag is not properly set." else insecure = "." diff --git a/python/ql/src/experimental/Security/UnsafeUnpackQuery.qll b/python/ql/src/experimental/Security/UnsafeUnpackQuery.qll index ba359ee32f374..338a5555c5726 100644 --- a/python/ql/src/experimental/Security/UnsafeUnpackQuery.qll +++ b/python/ql/src/experimental/Security/UnsafeUnpackQuery.qll @@ -39,10 +39,8 @@ class AllTarfileOpens extends API::CallNode { } } -class UnsafeUnpackingConfig extends TaintTracking::Configuration { - UnsafeUnpackingConfig() { this = "UnsafeUnpackingConfig" } - - override predicate isSource(DataFlow::Node source) { +module UnsafeUnpackConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { // A source coming from a remote location source instanceof RemoteFlowSource or @@ -92,7 +90,7 @@ class UnsafeUnpackingConfig extends TaintTracking::Configuration { source.(AttrRead).getAttributeName() = "FILES" } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { ( // A sink capturing method calls to `unpack_archive`. sink = API::moduleImport("shutil").getMember("unpack_archive").getACall().getArg(0) @@ -136,7 +134,7 @@ class UnsafeUnpackingConfig extends TaintTracking::Configuration { not sink.getScope().getLocation().getFile().inStdlib() } - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { // Reading the response nodeTo.(MethodCallNode).calls(nodeFrom, "read") or @@ -211,3 +209,6 @@ class UnsafeUnpackingConfig extends TaintTracking::Configuration { ) } } + +/** Global taint-tracking for detecting "UnsafeUnpacking" vulnerabilities. */ +module UnsafeUnpackFlow = TaintTracking::Global; diff --git a/python/ql/src/experimental/semmle/python/libraries/SmtpLib.qll b/python/ql/src/experimental/semmle/python/libraries/SmtpLib.qll index 83ea49cbb660e..7ecbbc1beba2a 100644 --- a/python/ql/src/experimental/semmle/python/libraries/SmtpLib.qll +++ b/python/ql/src/experimental/semmle/python/libraries/SmtpLib.qll @@ -2,7 +2,7 @@ private import python private import semmle.python.dataflow.new.DataFlow private import experimental.semmle.python.Concepts private import semmle.python.ApiGraphs -private import semmle.python.dataflow.new.TaintTracking2 +private import semmle.python.dataflow.new.TaintTracking module SmtpLib { /** Gets a reference to `smtplib.SMTP_SSL` */ @@ -31,16 +31,16 @@ module SmtpLib { * argument. Used because of the impossibility to get local source nodes from `_subparts`' * `(List|Tuple)` elements. */ - private class SmtpMessageConfig extends TaintTracking2::Configuration { - SmtpMessageConfig() { this = "SMTPMessageConfig" } + private module SmtpMessageConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source = mimeText(_) } - override predicate isSource(DataFlow::Node source) { source = mimeText(_) } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink = smtpMimeMultipartInstance().getACall().getArgByName("_subparts") } } + module SmtpMessageFlow = TaintTracking::Global; + /** * Using the `MimeText` call retrieves the content argument whose type argument equals `mimetype`. * This call flows into `MIMEMultipart`'s `_subparts` argument or the `.attach()` method call @@ -87,8 +87,7 @@ module SmtpLib { sink = [sendCall.getArg(2), sendCall.getArg(2).(DataFlow::MethodCallNode).getObject()] .getALocalSource() and - any(SmtpMessageConfig a) - .hasFlow(source, sink.(DataFlow::CallCfgNode).getArgByName("_subparts")) + SmtpMessageFlow::flow(source, sink.(DataFlow::CallCfgNode).getArgByName("_subparts")) or // via .attach() sink = smtpMimeMultipartInstance().getReturn().getMember("attach").getACall() and diff --git a/python/ql/src/experimental/semmle/python/security/InsecureRandomness.qll b/python/ql/src/experimental/semmle/python/security/InsecureRandomness.qll index 5ad5e2553a559..5a32a887bd5b8 100644 --- a/python/ql/src/experimental/semmle/python/security/InsecureRandomness.qll +++ b/python/ql/src/experimental/semmle/python/security/InsecureRandomness.qll @@ -21,17 +21,14 @@ module InsecureRandomness { * A taint-tracking configuration for reasoning about random values that are * not cryptographically secure. */ - class Configuration extends TaintTracking::Configuration { - Configuration() { this = "InsecureRandomness" } + private module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Source } - override predicate isSource(DataFlow::Node source) { source instanceof Source } + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } - - deprecated override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { - guard instanceof SanitizerGuard - } + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } } + + /** Global taint-tracking for detecting "random values that are not cryptographically secure" vulnerabilities. */ + module Flow = TaintTracking::Global; } diff --git a/python/ql/src/experimental/semmle/python/security/LDAPInsecureAuth.qll b/python/ql/src/experimental/semmle/python/security/LdapInsecureAuth.qll similarity index 90% rename from python/ql/src/experimental/semmle/python/security/LDAPInsecureAuth.qll rename to python/ql/src/experimental/semmle/python/security/LdapInsecureAuth.qll index 56fffe3a2a0f9..e8249dcdff731 100644 --- a/python/ql/src/experimental/semmle/python/security/LDAPInsecureAuth.qll +++ b/python/ql/src/experimental/semmle/python/security/LdapInsecureAuth.qll @@ -88,10 +88,8 @@ class LdapStringVar extends BinaryExpr { /** * A taint-tracking configuration for detecting LDAP insecure authentications. */ -class LdapInsecureAuthConfig extends TaintTracking::Configuration { - LdapInsecureAuthConfig() { this = "LDAPInsecureAuthConfig" } - - override predicate isSource(DataFlow::Node source) { +private module LdapInsecureAuthConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource or source.asExpr() instanceof LdapFullHost or source.asExpr() instanceof LdapBothStrings or @@ -100,7 +98,10 @@ class LdapInsecureAuthConfig extends TaintTracking::Configuration { source.asExpr() instanceof LdapStringVar } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(LdapBind ldapBind | not ldapBind.useSsl() and sink = ldapBind.getHost()) } } + +/** Global taint-tracking for detecting "LDAP insecure authentications" vulnerabilities. */ +module LdapInsecureAuthFlow = TaintTracking::Global; diff --git a/python/ql/src/experimental/semmle/python/security/TimingAttack.qll b/python/ql/src/experimental/semmle/python/security/TimingAttack.qll index 4df7752e64db1..f072f21230594 100644 --- a/python/ql/src/experimental/semmle/python/security/TimingAttack.qll +++ b/python/ql/src/experimental/semmle/python/security/TimingAttack.qll @@ -1,8 +1,6 @@ private import python -private import semmle.python.dataflow.new.TaintTracking2 private import semmle.python.dataflow.new.TaintTracking private import semmle.python.dataflow.new.DataFlow -private import semmle.python.dataflow.new.DataFlow2 private import semmle.python.ApiGraphs private import semmle.python.dataflow.new.RemoteFlowSources private import semmle.python.frameworks.Flask @@ -164,9 +162,7 @@ class NonConstantTimeComparisonSink extends DataFlow::Node { /** Holds if remote user input was used in the comparison. */ predicate includesUserInput() { - exists(UserInputInComparisonConfig config | - config.hasFlowTo(DataFlow2::exprNode(anotherParameter)) - ) + UserInputInComparisonFlow::flowTo(DataFlow::exprNode(anotherParameter)) } } @@ -177,9 +173,7 @@ class SecretSource extends DataFlow::Node { SecretSource() { secret = this.asExpr() } /** Holds if the secret was deliverd by remote user. */ - predicate includesUserInput() { - exists(UserInputSecretConfig config | config.hasFlowTo(DataFlow2::exprNode(secret))) - } + predicate includesUserInput() { UserInputSecretFlow::flowTo(DataFlow::exprNode(secret)) } } /** A string for `match` that identifies strings that look like they represent secret data. */ @@ -267,23 +261,21 @@ private string sensitiveheaders() { /** * A config that tracks data flow from remote user input to Variable that hold sensitive info */ -class UserInputSecretConfig extends TaintTracking::Configuration { - UserInputSecretConfig() { this = "UserInputSecretConfig" } +module UserInputSecretConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof CredentialExpr } + predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof CredentialExpr } } +module UserInputSecretFlow = TaintTracking::Global; + /** * A config that tracks data flow from remote user input to Equality test */ -class UserInputInComparisonConfig extends TaintTracking2::Configuration { - UserInputInComparisonConfig() { this = "UserInputInComparisonConfig" } +module UserInputInComparisonConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(Compare cmp, Expr left, Expr right, Cmpop cmpop | cmpop.getSymbol() = ["==", "in", "is not", "!="] and cmp.compares(left, cmpop, right) and @@ -292,15 +284,15 @@ class UserInputInComparisonConfig extends TaintTracking2::Configuration { } } +module UserInputInComparisonFlow = TaintTracking::Global; + /** * A configuration tracing flow from a client Secret obtained by an HTTP header to a len() function. */ -private class ExcludeLenFunc extends TaintTracking2::Configuration { - ExcludeLenFunc() { this = "ExcludeLenFunc" } - - override predicate isSource(DataFlow::Node source) { source instanceof ClientSuppliedSecret } +private module ExcludeLenFuncConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof ClientSuppliedSecret } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(Call call | call.getFunc().(Name).getId() = "len" and sink.asExpr() = call.getArg(0) @@ -308,6 +300,8 @@ private class ExcludeLenFunc extends TaintTracking2::Configuration { } } +module ExcludeLenFuncFlow = TaintTracking::Global; + /** * Holds if there is a fast-fail check. */ @@ -343,8 +337,7 @@ class CompareSink extends DataFlow::Node { * Holds if there is a flow to len(). */ predicate flowtolen() { - exists(ExcludeLenFunc config, DataFlow2::PathNode source, DataFlow2::PathNode sink | - config.hasFlowPath(source, sink) - ) + // TODO: Fly by comment: I don't understand this code at all, seems very strange. + ExcludeLenFuncFlow::flowPath(_, _) } } diff --git a/python/ql/src/experimental/semmle/python/security/ZipSlip.qll b/python/ql/src/experimental/semmle/python/security/ZipSlip.qll index 59f558c67d6fa..5f8b4d940ef85 100644 --- a/python/ql/src/experimental/semmle/python/security/ZipSlip.qll +++ b/python/ql/src/experimental/semmle/python/security/ZipSlip.qll @@ -4,10 +4,8 @@ import semmle.python.dataflow.new.DataFlow import semmle.python.ApiGraphs import semmle.python.dataflow.new.TaintTracking -class ZipSlipConfig extends TaintTracking::Configuration { - ZipSlipConfig() { this = "ZipSlipConfig" } - - override predicate isSource(DataFlow::Node source) { +private module ZipSlipConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { ( source = API::moduleImport("zipfile").getMember("ZipFile").getReturn().getMember("open").getACall() or @@ -29,7 +27,7 @@ class ZipSlipConfig extends TaintTracking::Configuration { not source.getScope().getLocation().getFile().inStdlib() } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { ( sink = any(CopyFile copyfile).getAPathArgument() or sink = any(CopyFile copyfile).getfsrcArgument() @@ -37,3 +35,6 @@ class ZipSlipConfig extends TaintTracking::Configuration { not sink.getScope().getLocation().getFile().inStdlib() } } + +/** Global taint-tracking for detecting "zip slip" vulnerabilities. */ +module ZipSlipFlow = TaintTracking::Global; diff --git a/python/ql/src/experimental/semmle/python/security/dataflow/ReflectedXSS.qll b/python/ql/src/experimental/semmle/python/security/dataflow/EmailXss.qll similarity index 51% rename from python/ql/src/experimental/semmle/python/security/dataflow/ReflectedXSS.qll rename to python/ql/src/experimental/semmle/python/security/dataflow/EmailXss.qll index b35cb405dc01e..88e9af89ba63b 100644 --- a/python/ql/src/experimental/semmle/python/security/dataflow/ReflectedXSS.qll +++ b/python/ql/src/experimental/semmle/python/security/dataflow/EmailXss.qll @@ -1,6 +1,5 @@ /** - * Provides a taint-tracking configuration for detecting reflected server-side - * cross-site scripting vulnerabilities. + * Provides a taint-tracking configuration for detecting "Email XSS" vulnerabilities. */ import python @@ -12,24 +11,18 @@ import experimental.semmle.python.Concepts import semmle.python.Concepts import semmle.python.ApiGraphs -/** - * A taint-tracking configuration for detecting reflected server-side cross-site - * scripting vulnerabilities. - */ -class ReflectedXssConfiguration extends TaintTracking::Configuration { - ReflectedXssConfiguration() { this = "ReflectedXssConfiguration" } +private module EmailXssConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + predicate isSink(DataFlow::Node sink) { sink = any(EmailSender email).getHtmlBody() } - override predicate isSink(DataFlow::Node sink) { sink = any(EmailSender email).getHtmlBody() } - - override predicate isSanitizer(DataFlow::Node sanitizer) { + predicate isBarrier(DataFlow::Node sanitizer) { sanitizer = any(HtmlEscaping esc).getOutput() or sanitizer instanceof StringConstCompareBarrier } - override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { exists(DataFlow::CallCfgNode htmlContentCall | htmlContentCall = API::moduleImport("sendgrid") @@ -42,3 +35,6 @@ class ReflectedXssConfiguration extends TaintTracking::Configuration { ) } } + +/** Global taint-tracking for detecting "Email XSS" vulnerabilities. */ +module EmailXssFlow = TaintTracking::Global; diff --git a/python/ql/src/experimental/semmle/python/security/injection/CookieInjection.qll b/python/ql/src/experimental/semmle/python/security/injection/CookieInjection.qll index 87f3b1fd76b64..5d31b9f8b511d 100644 --- a/python/ql/src/experimental/semmle/python/security/injection/CookieInjection.qll +++ b/python/ql/src/experimental/semmle/python/security/injection/CookieInjection.qll @@ -29,12 +29,13 @@ class CookieSink extends DataFlow::Node { /** * A taint-tracking configuration for detecting Cookie injections. */ -class CookieInjectionFlowConfig extends TaintTracking::Configuration { - CookieInjectionFlowConfig() { this = "CookieInjectionFlowConfig" } +private module CookieInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(Cookie c | sink in [c.getNameArg(), c.getValueArg()]) } } + +/** Global taint-tracking for detecting "Cookie injections" vulnerabilities. */ +module CookieInjectionFlow = TaintTracking::Global; diff --git a/python/ql/src/experimental/semmle/python/security/injection/CsvInjection.qll b/python/ql/src/experimental/semmle/python/security/injection/CsvInjection.qll index c6197222d91ec..316dd4d260358 100644 --- a/python/ql/src/experimental/semmle/python/security/injection/CsvInjection.qll +++ b/python/ql/src/experimental/semmle/python/security/injection/CsvInjection.qll @@ -8,14 +8,12 @@ import semmle.python.dataflow.new.RemoteFlowSources /** * A taint-tracking configuration for tracking untrusted user input used in file read. */ -class CsvInjectionFlowConfig extends TaintTracking::Configuration { - CsvInjectionFlowConfig() { this = "CsvInjectionFlowConfig" } +private module CsvInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + predicate isSink(DataFlow::Node sink) { sink = any(CsvWriter cw).getAnInput() } - override predicate isSink(DataFlow::Node sink) { sink = any(CsvWriter cw).getAnInput() } - - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { node = DataFlow::BarrierGuard::getABarrierNode() or node instanceof StringConstCompareBarrier } @@ -29,3 +27,6 @@ private predicate startsWithCheck(DataFlow::GuardNode g, ControlFlowNode node, b branch = true ) } + +/** Global taint-tracking for detecting "CSV injection" vulnerabilities. */ +module CsvInjectionFlow = TaintTracking::Global; diff --git a/python/ql/src/experimental/semmle/python/security/injection/HTTPHeaders.qll b/python/ql/src/experimental/semmle/python/security/injection/HTTPHeaders.qll index 4ba70cd37a27e..0768d7a84b2d8 100644 --- a/python/ql/src/experimental/semmle/python/security/injection/HTTPHeaders.qll +++ b/python/ql/src/experimental/semmle/python/security/injection/HTTPHeaders.qll @@ -7,14 +7,15 @@ import semmle.python.dataflow.new.RemoteFlowSources /** * A taint-tracking configuration for detecting HTTP Header injections. */ -class HeaderInjectionFlowConfig extends TaintTracking::Configuration { - HeaderInjectionFlowConfig() { this = "HeaderInjectionFlowConfig" } +private module HeaderInjectionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(HeaderDeclaration headerDeclaration | sink in [headerDeclaration.getNameArg(), headerDeclaration.getValueArg()] ) } } + +/** Global taint-tracking for detecting "HTTP Header injection" vulnerabilities. */ +module HeaderInjectionFlow = TaintTracking::Global; diff --git a/python/ql/src/semmle/python/functions/ModificationOfParameterWithDefault.qll b/python/ql/src/semmle/python/functions/ModificationOfParameterWithDefault.qll index 24103a33aceb8..a083877251537 100644 --- a/python/ql/src/semmle/python/functions/ModificationOfParameterWithDefault.qll +++ b/python/ql/src/semmle/python/functions/ModificationOfParameterWithDefault.qll @@ -16,9 +16,11 @@ module ModificationOfParameterWithDefault { import ModificationOfParameterWithDefaultCustomizations::ModificationOfParameterWithDefault /** + * DEPRECATED: Use `Flow` module instead. + * * A data-flow configuration for detecting modifications of a parameters default value. */ - class Configuration extends DataFlow::Configuration { + deprecated class Configuration extends DataFlow::Configuration { /** Record whether the default value being tracked is non-empty. */ boolean nonEmptyDefault; @@ -43,4 +45,33 @@ module ModificationOfParameterWithDefault { nonEmptyDefault = false and node instanceof MustBeNonEmpty } } + + private module Config implements DataFlow::StateConfigSig { + class FlowState = boolean; + + predicate isSource(DataFlow::Node source, FlowState state) { + source.(Source).isNonEmpty() = state + } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isSink(DataFlow::Node sink, FlowState state) { + // dummy implementation since this predicate is required, but actual logic is in + // the predicate above. + none() + } + + predicate isBarrier(DataFlow::Node node, FlowState state) { + // if we are tracking a non-empty default, then it is ok to modify empty values, + // so our tracking ends at those. + state = true and node instanceof MustBeEmpty + or + // if we are tracking a empty default, then it is ok to modify non-empty values, + // so our tracking ends at those. + state = false and node instanceof MustBeNonEmpty + } + } + + /** Global data-flow for detecting modifications of a parameters default value. */ + module Flow = DataFlow::GlobalWithState; } diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected index 52fd49e57b15d..a699a1bac5f4a 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected @@ -33,7 +33,8 @@ edges | TarSlipImprov.py:141:34:141:36 | GSSA Variable tar | TarSlipImprov.py:142:9:142:13 | GSSA Variable entry | | TarSlipImprov.py:142:9:142:13 | GSSA Variable entry | TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | | TarSlipImprov.py:159:9:159:14 | SSA variable tar_cm | TarSlipImprov.py:162:20:162:23 | SSA variable tarc | -| TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:159:9:159:14 | SSA variable tar_cm | +| TarSlipImprov.py:159:18:159:52 | ControlFlowNode for closing() | TarSlipImprov.py:159:9:159:14 | SSA variable tar_cm | +| TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:159:18:159:52 | ControlFlowNode for closing() | | TarSlipImprov.py:162:20:162:23 | SSA variable tarc | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | | TarSlipImprov.py:176:6:176:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:176:36:176:38 | GSSA Variable tar | | TarSlipImprov.py:176:36:176:38 | GSSA Variable tar | TarSlipImprov.py:177:9:177:13 | GSSA Variable entry | @@ -122,6 +123,7 @@ nodes | TarSlipImprov.py:142:9:142:13 | GSSA Variable entry | semmle.label | GSSA Variable entry | | TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry | | TarSlipImprov.py:159:9:159:14 | SSA variable tar_cm | semmle.label | SSA variable tar_cm | +| TarSlipImprov.py:159:18:159:52 | ControlFlowNode for closing() | semmle.label | ControlFlowNode for closing() | | TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:162:20:162:23 | SSA variable tarc | semmle.label | SSA variable tarc | | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | semmle.label | ControlFlowNode for tarc | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.expected index 04431311999c5..9ce23b4c553b8 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.ql b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.ql index 91a6cdaa14a6b..ed7d650f536d9 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.ql +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/DataflowQueryTest.ql @@ -1,4 +1,4 @@ import python import experimental.dataflow.TestUtil.DataflowQueryTest import experimental.Security.UnsafeUnpackQuery -import FromLegacyConfiguration +import FromTaintTrackingConfig diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected index b05f536c26d3c..f8921911e4f4f 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected @@ -1,43 +1,86 @@ edges | UnsafeUnpack.py:5:26:5:32 | ControlFlowNode for ImportMember | UnsafeUnpack.py:5:26:5:32 | GSSA Variable request | | UnsafeUnpack.py:5:26:5:32 | GSSA Variable request | UnsafeUnpack.py:11:18:11:24 | ControlFlowNode for request | -| UnsafeUnpack.py:11:7:11:14 | SSA variable filename | UnsafeUnpack.py:13:13:13:20 | SSA variable response | -| UnsafeUnpack.py:11:18:11:24 | ControlFlowNode for request | UnsafeUnpack.py:11:7:11:14 | SSA variable filename | +| UnsafeUnpack.py:11:7:11:14 | SSA variable filename | UnsafeUnpack.py:13:24:13:58 | ControlFlowNode for Attribute() | | UnsafeUnpack.py:11:18:11:24 | ControlFlowNode for request | UnsafeUnpack.py:11:18:11:29 | ControlFlowNode for Attribute | | UnsafeUnpack.py:11:18:11:29 | ControlFlowNode for Attribute | UnsafeUnpack.py:11:18:11:49 | ControlFlowNode for Attribute() | | UnsafeUnpack.py:11:18:11:49 | ControlFlowNode for Attribute() | UnsafeUnpack.py:11:7:11:14 | SSA variable filename | -| UnsafeUnpack.py:13:13:13:20 | SSA variable response | UnsafeUnpack.py:19:35:19:41 | ControlFlowNode for tarpath | +| UnsafeUnpack.py:13:13:13:20 | SSA variable response | UnsafeUnpack.py:17:27:17:34 | ControlFlowNode for response | +| UnsafeUnpack.py:13:24:13:58 | ControlFlowNode for Attribute() | UnsafeUnpack.py:13:13:13:20 | SSA variable response | +| UnsafeUnpack.py:16:23:16:29 | ControlFlowNode for tarpath | UnsafeUnpack.py:19:35:19:41 | ControlFlowNode for tarpath | +| UnsafeUnpack.py:17:19:17:19 | ControlFlowNode for f | UnsafeUnpack.py:16:23:16:29 | ControlFlowNode for tarpath | +| UnsafeUnpack.py:17:27:17:34 | ControlFlowNode for response | UnsafeUnpack.py:17:27:17:38 | ControlFlowNode for Attribute | +| UnsafeUnpack.py:17:27:17:38 | ControlFlowNode for Attribute | UnsafeUnpack.py:17:27:17:45 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:17:27:17:45 | ControlFlowNode for Attribute() | UnsafeUnpack.py:17:19:17:19 | ControlFlowNode for f | | UnsafeUnpack.py:33:50:33:65 | ControlFlowNode for local_ziped_path | UnsafeUnpack.py:34:23:34:38 | ControlFlowNode for local_ziped_path | | UnsafeUnpack.py:47:20:47:34 | ControlFlowNode for compressed_file | UnsafeUnpack.py:48:23:48:37 | ControlFlowNode for compressed_file | | UnsafeUnpack.py:51:1:51:15 | GSSA Variable compressed_file | UnsafeUnpack.py:52:23:52:37 | ControlFlowNode for compressed_file | | UnsafeUnpack.py:51:19:51:36 | ControlFlowNode for Attribute() | UnsafeUnpack.py:51:1:51:15 | GSSA Variable compressed_file | | UnsafeUnpack.py:65:1:65:15 | GSSA Variable compressed_file | UnsafeUnpack.py:66:23:66:37 | ControlFlowNode for compressed_file | | UnsafeUnpack.py:65:19:65:31 | ControlFlowNode for Attribute | UnsafeUnpack.py:65:1:65:15 | GSSA Variable compressed_file | -| UnsafeUnpack.py:79:1:79:12 | GSSA Variable url_filename | UnsafeUnpack.py:81:1:81:8 | GSSA Variable response | -| UnsafeUnpack.py:79:1:79:12 | GSSA Variable url_filename | UnsafeUnpack.py:171:1:171:8 | GSSA Variable response | +| UnsafeUnpack.py:79:1:79:12 | GSSA Variable url_filename | UnsafeUnpack.py:81:12:81:50 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:79:1:79:12 | GSSA Variable url_filename | UnsafeUnpack.py:171:12:171:50 | ControlFlowNode for Attribute() | | UnsafeUnpack.py:79:16:79:28 | ControlFlowNode for Attribute | UnsafeUnpack.py:79:1:79:12 | GSSA Variable url_filename | -| UnsafeUnpack.py:81:1:81:8 | GSSA Variable response | UnsafeUnpack.py:87:23:87:29 | ControlFlowNode for tarpath | -| UnsafeUnpack.py:103:23:103:27 | SSA variable chunk | UnsafeUnpack.py:105:35:105:42 | ControlFlowNode for savepath | -| UnsafeUnpack.py:103:32:103:44 | ControlFlowNode for Attribute | UnsafeUnpack.py:103:23:103:27 | SSA variable chunk | -| UnsafeUnpack.py:108:13:108:18 | SSA variable myfile | UnsafeUnpack.py:112:35:112:43 | ControlFlowNode for file_path | -| UnsafeUnpack.py:108:22:108:34 | ControlFlowNode for Attribute | UnsafeUnpack.py:108:13:108:18 | SSA variable myfile | +| UnsafeUnpack.py:81:1:81:8 | GSSA Variable response | UnsafeUnpack.py:85:15:85:22 | ControlFlowNode for response | +| UnsafeUnpack.py:81:12:81:50 | ControlFlowNode for Attribute() | UnsafeUnpack.py:81:1:81:8 | GSSA Variable response | +| UnsafeUnpack.py:84:11:84:17 | ControlFlowNode for tarpath | UnsafeUnpack.py:87:23:87:29 | ControlFlowNode for tarpath | +| UnsafeUnpack.py:85:7:85:7 | ControlFlowNode for f | UnsafeUnpack.py:84:11:84:17 | ControlFlowNode for tarpath | +| UnsafeUnpack.py:85:15:85:22 | ControlFlowNode for response | UnsafeUnpack.py:85:15:85:26 | ControlFlowNode for Attribute | +| UnsafeUnpack.py:85:15:85:26 | ControlFlowNode for Attribute | UnsafeUnpack.py:85:15:85:33 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:85:15:85:33 | ControlFlowNode for Attribute() | UnsafeUnpack.py:85:7:85:7 | ControlFlowNode for f | +| UnsafeUnpack.py:102:23:102:30 | ControlFlowNode for savepath | UnsafeUnpack.py:105:35:105:42 | ControlFlowNode for savepath | +| UnsafeUnpack.py:103:23:103:27 | SSA variable chunk | UnsafeUnpack.py:104:37:104:41 | ControlFlowNode for chunk | +| UnsafeUnpack.py:103:32:103:44 | ControlFlowNode for Attribute | UnsafeUnpack.py:103:32:103:54 | ControlFlowNode for Subscript | +| UnsafeUnpack.py:103:32:103:54 | ControlFlowNode for Subscript | UnsafeUnpack.py:103:32:103:63 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:103:32:103:63 | ControlFlowNode for Attribute() | UnsafeUnpack.py:103:23:103:27 | SSA variable chunk | +| UnsafeUnpack.py:104:25:104:29 | ControlFlowNode for wfile | UnsafeUnpack.py:102:23:102:30 | ControlFlowNode for savepath | +| UnsafeUnpack.py:104:37:104:41 | ControlFlowNode for chunk | UnsafeUnpack.py:104:25:104:29 | ControlFlowNode for wfile | +| UnsafeUnpack.py:108:13:108:18 | SSA variable myfile | UnsafeUnpack.py:111:27:111:32 | ControlFlowNode for myfile | | UnsafeUnpack.py:108:22:108:34 | ControlFlowNode for Attribute | UnsafeUnpack.py:108:22:108:48 | ControlFlowNode for Attribute() | | UnsafeUnpack.py:108:22:108:48 | ControlFlowNode for Attribute() | UnsafeUnpack.py:108:13:108:18 | SSA variable myfile | -| UnsafeUnpack.py:116:17:116:21 | SSA variable ufile | UnsafeUnpack.py:118:19:118:26 | SSA variable filename | -| UnsafeUnpack.py:116:27:116:39 | ControlFlowNode for Attribute | UnsafeUnpack.py:116:17:116:21 | SSA variable ufile | -| UnsafeUnpack.py:118:19:118:26 | SSA variable filename | UnsafeUnpack.py:119:19:119:36 | SSA variable uploaded_file_path | +| UnsafeUnpack.py:110:18:110:26 | ControlFlowNode for file_path | UnsafeUnpack.py:112:35:112:43 | ControlFlowNode for file_path | +| UnsafeUnpack.py:111:19:111:19 | ControlFlowNode for f | UnsafeUnpack.py:110:18:110:26 | ControlFlowNode for file_path | +| UnsafeUnpack.py:111:27:111:32 | ControlFlowNode for myfile | UnsafeUnpack.py:111:27:111:39 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:111:27:111:39 | ControlFlowNode for Attribute() | UnsafeUnpack.py:111:19:111:19 | ControlFlowNode for f | +| UnsafeUnpack.py:116:17:116:21 | SSA variable ufile | UnsafeUnpack.py:118:38:118:42 | ControlFlowNode for ufile | +| UnsafeUnpack.py:116:27:116:39 | ControlFlowNode for Attribute | UnsafeUnpack.py:116:27:116:49 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:116:27:116:49 | ControlFlowNode for Attribute() | UnsafeUnpack.py:116:17:116:21 | SSA variable ufile | +| UnsafeUnpack.py:118:19:118:26 | SSA variable filename | UnsafeUnpack.py:119:48:119:55 | ControlFlowNode for filename | +| UnsafeUnpack.py:118:30:118:55 | ControlFlowNode for Attribute() | UnsafeUnpack.py:118:19:118:26 | SSA variable filename | +| UnsafeUnpack.py:118:38:118:42 | ControlFlowNode for ufile | UnsafeUnpack.py:118:38:118:47 | ControlFlowNode for Attribute | +| UnsafeUnpack.py:118:38:118:47 | ControlFlowNode for Attribute | UnsafeUnpack.py:118:30:118:55 | ControlFlowNode for Attribute() | | UnsafeUnpack.py:119:19:119:36 | SSA variable uploaded_file_path | UnsafeUnpack.py:120:41:120:58 | ControlFlowNode for uploaded_file_path | -| UnsafeUnpack.py:140:1:140:19 | GSSA Variable unsafe_filename_tar | UnsafeUnpack.py:141:56:141:58 | GSSA Variable tar | +| UnsafeUnpack.py:119:40:119:56 | ControlFlowNode for Attribute() | UnsafeUnpack.py:119:19:119:36 | SSA variable uploaded_file_path | +| UnsafeUnpack.py:119:48:119:55 | ControlFlowNode for filename | UnsafeUnpack.py:119:40:119:56 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:140:1:140:19 | GSSA Variable unsafe_filename_tar | UnsafeUnpack.py:141:22:141:40 | ControlFlowNode for unsafe_filename_tar | | UnsafeUnpack.py:140:23:140:35 | ControlFlowNode for Attribute | UnsafeUnpack.py:140:1:140:19 | GSSA Variable unsafe_filename_tar | +| UnsafeUnpack.py:141:6:141:51 | ControlFlowNode for Attribute() | UnsafeUnpack.py:141:56:141:58 | GSSA Variable tar | +| UnsafeUnpack.py:141:22:141:40 | ControlFlowNode for unsafe_filename_tar | UnsafeUnpack.py:141:6:141:51 | ControlFlowNode for Attribute() | | UnsafeUnpack.py:141:56:141:58 | GSSA Variable tar | UnsafeUnpack.py:142:49:142:51 | ControlFlowNode for tar | -| UnsafeUnpack.py:158:23:158:27 | SSA variable chunk | UnsafeUnpack.py:161:19:161:21 | SSA variable tar | -| UnsafeUnpack.py:158:32:158:44 | ControlFlowNode for Attribute | UnsafeUnpack.py:158:23:158:27 | SSA variable chunk | -| UnsafeUnpack.py:161:19:161:21 | SSA variable tar | UnsafeUnpack.py:163:23:163:28 | SSA variable member | +| UnsafeUnpack.py:157:23:157:30 | ControlFlowNode for savepath | UnsafeUnpack.py:161:38:161:45 | ControlFlowNode for savepath | +| UnsafeUnpack.py:158:23:158:27 | SSA variable chunk | UnsafeUnpack.py:159:37:159:41 | ControlFlowNode for chunk | +| UnsafeUnpack.py:158:32:158:44 | ControlFlowNode for Attribute | UnsafeUnpack.py:158:32:158:54 | ControlFlowNode for Subscript | +| UnsafeUnpack.py:158:32:158:54 | ControlFlowNode for Subscript | UnsafeUnpack.py:158:32:158:63 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:158:32:158:63 | ControlFlowNode for Attribute() | UnsafeUnpack.py:158:23:158:27 | SSA variable chunk | +| UnsafeUnpack.py:159:25:159:29 | ControlFlowNode for wfile | UnsafeUnpack.py:157:23:157:30 | ControlFlowNode for savepath | +| UnsafeUnpack.py:159:37:159:41 | ControlFlowNode for chunk | UnsafeUnpack.py:159:25:159:29 | ControlFlowNode for wfile | +| UnsafeUnpack.py:161:19:161:21 | SSA variable tar | UnsafeUnpack.py:163:33:163:35 | ControlFlowNode for tar | +| UnsafeUnpack.py:161:25:161:46 | ControlFlowNode for Attribute() | UnsafeUnpack.py:161:19:161:21 | SSA variable tar | +| UnsafeUnpack.py:161:38:161:45 | ControlFlowNode for savepath | UnsafeUnpack.py:161:25:161:46 | ControlFlowNode for Attribute() | | UnsafeUnpack.py:163:23:163:28 | SSA variable member | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | +| UnsafeUnpack.py:163:33:163:35 | ControlFlowNode for tar | UnsafeUnpack.py:163:23:163:28 | SSA variable member | | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | -| UnsafeUnpack.py:171:1:171:8 | GSSA Variable response | UnsafeUnpack.py:176:1:176:34 | ControlFlowNode for Attribute() | -| UnsafeUnpack.py:194:53:194:55 | ControlFlowNode for tmp | UnsafeUnpack.py:201:29:201:36 | ControlFlowNode for Attribute | +| UnsafeUnpack.py:171:1:171:8 | GSSA Variable response | UnsafeUnpack.py:174:15:174:22 | ControlFlowNode for response | +| UnsafeUnpack.py:171:12:171:50 | ControlFlowNode for Attribute() | UnsafeUnpack.py:171:1:171:8 | GSSA Variable response | +| UnsafeUnpack.py:173:11:173:17 | ControlFlowNode for tarpath | UnsafeUnpack.py:176:17:176:23 | ControlFlowNode for tarpath | +| UnsafeUnpack.py:174:7:174:7 | ControlFlowNode for f | UnsafeUnpack.py:173:11:173:17 | ControlFlowNode for tarpath | +| UnsafeUnpack.py:174:15:174:22 | ControlFlowNode for response | UnsafeUnpack.py:174:15:174:26 | ControlFlowNode for Attribute | +| UnsafeUnpack.py:174:15:174:26 | ControlFlowNode for Attribute | UnsafeUnpack.py:174:15:174:33 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:174:15:174:33 | ControlFlowNode for Attribute() | UnsafeUnpack.py:174:7:174:7 | ControlFlowNode for f | +| UnsafeUnpack.py:176:17:176:23 | ControlFlowNode for tarpath | UnsafeUnpack.py:176:1:176:34 | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:194:53:194:55 | ControlFlowNode for tmp | UnsafeUnpack.py:201:29:201:31 | ControlFlowNode for tmp | +| UnsafeUnpack.py:201:29:201:31 | ControlFlowNode for tmp | UnsafeUnpack.py:201:29:201:36 | ControlFlowNode for Attribute | nodes | UnsafeUnpack.py:5:26:5:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | UnsafeUnpack.py:5:26:5:32 | GSSA Variable request | semmle.label | GSSA Variable request | @@ -46,6 +89,12 @@ nodes | UnsafeUnpack.py:11:18:11:29 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | UnsafeUnpack.py:11:18:11:49 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | UnsafeUnpack.py:13:13:13:20 | SSA variable response | semmle.label | SSA variable response | +| UnsafeUnpack.py:13:24:13:58 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:16:23:16:29 | ControlFlowNode for tarpath | semmle.label | ControlFlowNode for tarpath | +| UnsafeUnpack.py:17:19:17:19 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | +| UnsafeUnpack.py:17:27:17:34 | ControlFlowNode for response | semmle.label | ControlFlowNode for response | +| UnsafeUnpack.py:17:27:17:38 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| UnsafeUnpack.py:17:27:17:45 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | UnsafeUnpack.py:19:35:19:41 | ControlFlowNode for tarpath | semmle.label | ControlFlowNode for tarpath | | UnsafeUnpack.py:33:50:33:65 | ControlFlowNode for local_ziped_path | semmle.label | ControlFlowNode for local_ziped_path | | UnsafeUnpack.py:34:23:34:38 | ControlFlowNode for local_ziped_path | semmle.label | ControlFlowNode for local_ziped_path | @@ -60,33 +109,72 @@ nodes | UnsafeUnpack.py:79:1:79:12 | GSSA Variable url_filename | semmle.label | GSSA Variable url_filename | | UnsafeUnpack.py:79:16:79:28 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | UnsafeUnpack.py:81:1:81:8 | GSSA Variable response | semmle.label | GSSA Variable response | +| UnsafeUnpack.py:81:12:81:50 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:84:11:84:17 | ControlFlowNode for tarpath | semmle.label | ControlFlowNode for tarpath | +| UnsafeUnpack.py:85:7:85:7 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | +| UnsafeUnpack.py:85:15:85:22 | ControlFlowNode for response | semmle.label | ControlFlowNode for response | +| UnsafeUnpack.py:85:15:85:26 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| UnsafeUnpack.py:85:15:85:33 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | UnsafeUnpack.py:87:23:87:29 | ControlFlowNode for tarpath | semmle.label | ControlFlowNode for tarpath | +| UnsafeUnpack.py:102:23:102:30 | ControlFlowNode for savepath | semmle.label | ControlFlowNode for savepath | | UnsafeUnpack.py:103:23:103:27 | SSA variable chunk | semmle.label | SSA variable chunk | | UnsafeUnpack.py:103:32:103:44 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| UnsafeUnpack.py:103:32:103:54 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| UnsafeUnpack.py:103:32:103:63 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:104:25:104:29 | ControlFlowNode for wfile | semmle.label | ControlFlowNode for wfile | +| UnsafeUnpack.py:104:37:104:41 | ControlFlowNode for chunk | semmle.label | ControlFlowNode for chunk | | UnsafeUnpack.py:105:35:105:42 | ControlFlowNode for savepath | semmle.label | ControlFlowNode for savepath | | UnsafeUnpack.py:108:13:108:18 | SSA variable myfile | semmle.label | SSA variable myfile | | UnsafeUnpack.py:108:22:108:34 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | UnsafeUnpack.py:108:22:108:48 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:110:18:110:26 | ControlFlowNode for file_path | semmle.label | ControlFlowNode for file_path | +| UnsafeUnpack.py:111:19:111:19 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | +| UnsafeUnpack.py:111:27:111:32 | ControlFlowNode for myfile | semmle.label | ControlFlowNode for myfile | +| UnsafeUnpack.py:111:27:111:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | UnsafeUnpack.py:112:35:112:43 | ControlFlowNode for file_path | semmle.label | ControlFlowNode for file_path | | UnsafeUnpack.py:116:17:116:21 | SSA variable ufile | semmle.label | SSA variable ufile | | UnsafeUnpack.py:116:27:116:39 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| UnsafeUnpack.py:116:27:116:49 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | UnsafeUnpack.py:118:19:118:26 | SSA variable filename | semmle.label | SSA variable filename | +| UnsafeUnpack.py:118:30:118:55 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:118:38:118:42 | ControlFlowNode for ufile | semmle.label | ControlFlowNode for ufile | +| UnsafeUnpack.py:118:38:118:47 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | UnsafeUnpack.py:119:19:119:36 | SSA variable uploaded_file_path | semmle.label | SSA variable uploaded_file_path | +| UnsafeUnpack.py:119:40:119:56 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:119:48:119:55 | ControlFlowNode for filename | semmle.label | ControlFlowNode for filename | | UnsafeUnpack.py:120:41:120:58 | ControlFlowNode for uploaded_file_path | semmle.label | ControlFlowNode for uploaded_file_path | | UnsafeUnpack.py:140:1:140:19 | GSSA Variable unsafe_filename_tar | semmle.label | GSSA Variable unsafe_filename_tar | | UnsafeUnpack.py:140:23:140:35 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| UnsafeUnpack.py:141:6:141:51 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:141:22:141:40 | ControlFlowNode for unsafe_filename_tar | semmle.label | ControlFlowNode for unsafe_filename_tar | | UnsafeUnpack.py:141:56:141:58 | GSSA Variable tar | semmle.label | GSSA Variable tar | | UnsafeUnpack.py:142:49:142:51 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | +| UnsafeUnpack.py:157:23:157:30 | ControlFlowNode for savepath | semmle.label | ControlFlowNode for savepath | | UnsafeUnpack.py:158:23:158:27 | SSA variable chunk | semmle.label | SSA variable chunk | | UnsafeUnpack.py:158:32:158:44 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| UnsafeUnpack.py:158:32:158:54 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | +| UnsafeUnpack.py:158:32:158:63 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:159:25:159:29 | ControlFlowNode for wfile | semmle.label | ControlFlowNode for wfile | +| UnsafeUnpack.py:159:37:159:41 | ControlFlowNode for chunk | semmle.label | ControlFlowNode for chunk | | UnsafeUnpack.py:161:19:161:21 | SSA variable tar | semmle.label | SSA variable tar | +| UnsafeUnpack.py:161:25:161:46 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:161:38:161:45 | ControlFlowNode for savepath | semmle.label | ControlFlowNode for savepath | | UnsafeUnpack.py:163:23:163:28 | SSA variable member | semmle.label | SSA variable member | +| UnsafeUnpack.py:163:33:163:35 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | | UnsafeUnpack.py:171:1:171:8 | GSSA Variable response | semmle.label | GSSA Variable response | +| UnsafeUnpack.py:171:12:171:50 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:173:11:173:17 | ControlFlowNode for tarpath | semmle.label | ControlFlowNode for tarpath | +| UnsafeUnpack.py:174:7:174:7 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | +| UnsafeUnpack.py:174:15:174:22 | ControlFlowNode for response | semmle.label | ControlFlowNode for response | +| UnsafeUnpack.py:174:15:174:26 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | +| UnsafeUnpack.py:174:15:174:33 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | UnsafeUnpack.py:176:1:176:34 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| UnsafeUnpack.py:176:17:176:23 | ControlFlowNode for tarpath | semmle.label | ControlFlowNode for tarpath | | UnsafeUnpack.py:194:53:194:55 | ControlFlowNode for tmp | semmle.label | ControlFlowNode for tmp | +| UnsafeUnpack.py:201:29:201:31 | ControlFlowNode for tmp | semmle.label | ControlFlowNode for tmp | | UnsafeUnpack.py:201:29:201:36 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | subpaths #select diff --git a/python/ql/test/experimental/query-tests/Security/CWE-074-paramiko/paramiko.expected b/python/ql/test/experimental/query-tests/Security/CWE-074-paramiko/paramiko.expected index 85e1e7b326d42..b31006425a6b6 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-074-paramiko/paramiko.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-074-paramiko/paramiko.expected @@ -1,7 +1,8 @@ edges | paramiko.py:15:21:15:23 | ControlFlowNode for cmd | paramiko.py:16:62:16:64 | ControlFlowNode for cmd | | paramiko.py:20:21:20:23 | ControlFlowNode for cmd | paramiko.py:21:70:21:72 | ControlFlowNode for cmd | -| paramiko.py:25:21:25:23 | ControlFlowNode for cmd | paramiko.py:26:114:26:139 | ControlFlowNode for Attribute() | +| paramiko.py:25:21:25:23 | ControlFlowNode for cmd | paramiko.py:26:136:26:138 | ControlFlowNode for cmd | +| paramiko.py:26:136:26:138 | ControlFlowNode for cmd | paramiko.py:26:114:26:139 | ControlFlowNode for Attribute() | nodes | paramiko.py:15:21:15:23 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | paramiko.py:16:62:16:64 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | @@ -9,6 +10,7 @@ nodes | paramiko.py:21:70:21:72 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | paramiko.py:25:21:25:23 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | | paramiko.py:26:114:26:139 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| paramiko.py:26:136:26:138 | ControlFlowNode for cmd | semmle.label | ControlFlowNode for cmd | subpaths #select | paramiko.py:16:62:16:64 | ControlFlowNode for cmd | paramiko.py:15:21:15:23 | ControlFlowNode for cmd | paramiko.py:16:62:16:64 | ControlFlowNode for cmd | This code execution depends on a $@. | paramiko.py:15:21:15:23 | ControlFlowNode for cmd | a user-provided value | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-079/ReflectedXSS.expected b/python/ql/test/experimental/query-tests/Security/CWE-079/EmailXss.expected similarity index 97% rename from python/ql/test/experimental/query-tests/Security/CWE-079/ReflectedXSS.expected rename to python/ql/test/experimental/query-tests/Security/CWE-079/EmailXss.expected index 7f16b6dcdac32..02fed5424cc10 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-079/ReflectedXSS.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-079/EmailXss.expected @@ -12,7 +12,8 @@ edges | sendgrid_mail.py:1:19:1:25 | GSSA Variable request | sendgrid_mail.py:26:34:26:40 | ControlFlowNode for request | | sendgrid_mail.py:1:19:1:25 | GSSA Variable request | sendgrid_mail.py:37:41:37:47 | ControlFlowNode for request | | sendgrid_mail.py:14:22:14:28 | ControlFlowNode for request | sendgrid_mail.py:14:22:14:49 | ControlFlowNode for Subscript | -| sendgrid_mail.py:26:34:26:40 | ControlFlowNode for request | sendgrid_mail.py:26:22:26:62 | ControlFlowNode for HtmlContent() | +| sendgrid_mail.py:26:34:26:40 | ControlFlowNode for request | sendgrid_mail.py:26:34:26:61 | ControlFlowNode for Subscript | +| sendgrid_mail.py:26:34:26:61 | ControlFlowNode for Subscript | sendgrid_mail.py:26:22:26:62 | ControlFlowNode for HtmlContent() | | sendgrid_mail.py:37:41:37:47 | ControlFlowNode for request | sendgrid_mail.py:37:41:37:68 | ControlFlowNode for Subscript | | sendgrid_via_mail_send_post_request_body_bad.py:3:19:3:25 | ControlFlowNode for ImportMember | sendgrid_via_mail_send_post_request_body_bad.py:3:19:3:25 | GSSA Variable request | | sendgrid_via_mail_send_post_request_body_bad.py:3:19:3:25 | GSSA Variable request | sendgrid_via_mail_send_post_request_body_bad.py:16:51:16:57 | ControlFlowNode for request | @@ -52,6 +53,7 @@ nodes | sendgrid_mail.py:14:22:14:49 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | sendgrid_mail.py:26:22:26:62 | ControlFlowNode for HtmlContent() | semmle.label | ControlFlowNode for HtmlContent() | | sendgrid_mail.py:26:34:26:40 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| sendgrid_mail.py:26:34:26:61 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | sendgrid_mail.py:37:41:37:47 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | sendgrid_mail.py:37:41:37:68 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | sendgrid_via_mail_send_post_request_body_bad.py:3:19:3:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-079/EmailXss.qlref b/python/ql/test/experimental/query-tests/Security/CWE-079/EmailXss.qlref new file mode 100644 index 0000000000000..fcc132dd66c5f --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-079/EmailXss.qlref @@ -0,0 +1 @@ +experimental/Security/CWE-079/EmailXss.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-079/ReflectedXSS.qlref b/python/ql/test/experimental/query-tests/Security/CWE-079/ReflectedXSS.qlref deleted file mode 100644 index dec87309b2961..0000000000000 --- a/python/ql/test/experimental/query-tests/Security/CWE-079/ReflectedXSS.qlref +++ /dev/null @@ -1 +0,0 @@ -experimental/Security/CWE-079/ReflectedXSS.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.expected b/python/ql/test/experimental/query-tests/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.expected index 564398c25c31e..63d5e8ad8211f 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-208/TimingAttackAgainstSensitiveInfo/PossibleTimingAttackAgainstSensitiveInfo.expected @@ -1,27 +1,6 @@ edges -| TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | ControlFlowNode for ImportMember | TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | GSSA Variable request | -| TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | GSSA Variable request | TimingAttackAgainstSensitiveInfo.py:14:8:14:14 | ControlFlowNode for request | -| TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | GSSA Variable request | TimingAttackAgainstSensitiveInfo.py:15:20:15:26 | ControlFlowNode for request | -| TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | GSSA Variable request | TimingAttackAgainstSensitiveInfo.py:20:8:20:14 | ControlFlowNode for request | -| TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | GSSA Variable request | TimingAttackAgainstSensitiveInfo.py:21:20:21:26 | ControlFlowNode for request | -| TimingAttackAgainstSensitiveInfo.py:14:8:14:14 | ControlFlowNode for request | TimingAttackAgainstSensitiveInfo.py:15:9:15:16 | SSA variable password | -| TimingAttackAgainstSensitiveInfo.py:15:9:15:16 | SSA variable password | TimingAttackAgainstSensitiveInfo.py:16:16:16:23 | ControlFlowNode for password | -| TimingAttackAgainstSensitiveInfo.py:15:20:15:26 | ControlFlowNode for request | TimingAttackAgainstSensitiveInfo.py:15:9:15:16 | SSA variable password | -| TimingAttackAgainstSensitiveInfo.py:20:8:20:14 | ControlFlowNode for request | TimingAttackAgainstSensitiveInfo.py:21:9:21:16 | SSA variable password | -| TimingAttackAgainstSensitiveInfo.py:21:9:21:16 | SSA variable password | TimingAttackAgainstSensitiveInfo.py:22:38:22:45 | ControlFlowNode for password | -| TimingAttackAgainstSensitiveInfo.py:21:20:21:26 | ControlFlowNode for request | TimingAttackAgainstSensitiveInfo.py:21:9:21:16 | SSA variable password | nodes -| TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | -| TimingAttackAgainstSensitiveInfo.py:7:19:7:25 | GSSA Variable request | semmle.label | GSSA Variable request | -| TimingAttackAgainstSensitiveInfo.py:14:8:14:14 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| TimingAttackAgainstSensitiveInfo.py:15:9:15:16 | SSA variable password | semmle.label | SSA variable password | -| TimingAttackAgainstSensitiveInfo.py:15:20:15:26 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | TimingAttackAgainstSensitiveInfo.py:16:16:16:23 | ControlFlowNode for password | semmle.label | ControlFlowNode for password | -| TimingAttackAgainstSensitiveInfo.py:16:16:16:23 | ControlFlowNode for password | semmle.label | ControlFlowNode for password | -| TimingAttackAgainstSensitiveInfo.py:20:8:20:14 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| TimingAttackAgainstSensitiveInfo.py:21:9:21:16 | SSA variable password | semmle.label | SSA variable password | -| TimingAttackAgainstSensitiveInfo.py:21:20:21:26 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| TimingAttackAgainstSensitiveInfo.py:22:38:22:45 | ControlFlowNode for password | semmle.label | ControlFlowNode for password | subpaths #select | TimingAttackAgainstSensitiveInfo.py:16:16:16:23 | ControlFlowNode for password | TimingAttackAgainstSensitiveInfo.py:16:16:16:23 | ControlFlowNode for password | TimingAttackAgainstSensitiveInfo.py:16:16:16:23 | ControlFlowNode for password | Timing attack against $@ validation. | TimingAttackAgainstSensitiveInfo.py:16:16:16:23 | ControlFlowNode for password | client-supplied token | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LDAPInsecureAuth.qlref b/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LDAPInsecureAuth.qlref deleted file mode 100644 index 8bb2c1e9b52a1..0000000000000 --- a/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LDAPInsecureAuth.qlref +++ /dev/null @@ -1 +0,0 @@ -experimental/Security/CWE-522/LDAPInsecureAuth.ql \ No newline at end of file diff --git a/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LDAPInsecureAuth.expected b/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LdapInsecureAuth.expected similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LDAPInsecureAuth.expected rename to python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LdapInsecureAuth.expected diff --git a/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LdapInsecureAuth.qlref b/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LdapInsecureAuth.qlref new file mode 100644 index 0000000000000..7b867cb318678 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-522-global-option/LdapInsecureAuth.qlref @@ -0,0 +1 @@ +experimental/Security/CWE-522/LdapInsecureAuth.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-522/LDAPInsecureAuth.qlref b/python/ql/test/experimental/query-tests/Security/CWE-522/LDAPInsecureAuth.qlref deleted file mode 100644 index 8bb2c1e9b52a1..0000000000000 --- a/python/ql/test/experimental/query-tests/Security/CWE-522/LDAPInsecureAuth.qlref +++ /dev/null @@ -1 +0,0 @@ -experimental/Security/CWE-522/LDAPInsecureAuth.ql \ No newline at end of file diff --git a/python/ql/test/experimental/query-tests/Security/CWE-522/LDAPInsecureAuth.expected b/python/ql/test/experimental/query-tests/Security/CWE-522/LdapInsecureAuth.expected similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-522/LDAPInsecureAuth.expected rename to python/ql/test/experimental/query-tests/Security/CWE-522/LdapInsecureAuth.expected diff --git a/python/ql/test/experimental/query-tests/Security/CWE-522/LdapInsecureAuth.qlref b/python/ql/test/experimental/query-tests/Security/CWE-522/LdapInsecureAuth.qlref new file mode 100644 index 0000000000000..7b867cb318678 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-522/LdapInsecureAuth.qlref @@ -0,0 +1 @@ +experimental/Security/CWE-522/LdapInsecureAuth.ql diff --git a/python/ql/test/library-tests/frameworks/stdlib/SystemCommandExecution.py b/python/ql/test/library-tests/frameworks/stdlib/SystemCommandExecution.py index 7a9d91d52b9a0..593b66cb694da 100644 --- a/python/ql/test/library-tests/frameworks/stdlib/SystemCommandExecution.py +++ b/python/ql/test/library-tests/frameworks/stdlib/SystemCommandExecution.py @@ -158,3 +158,21 @@ def os_members(): wrong_use = shlex.quote("ls {}".format(tainted)) # still dangerous, for example cmd = "sh -c " + wrong_use + +######################################## +# Program/shell command execution via asyncio + +import asyncio +from asyncio import subprocess + +asyncio.run(asyncio.create_subprocess_exec("executable", "arg0")) # $getCommand="executable" getAPathArgument="executable" +asyncio.run(subprocess.create_subprocess_exec("executable", "arg0")) # $getCommand="executable" getAPathArgument="executable" + +loop = asyncio.new_event_loop() +loop.run_until_complete(loop.subprocess_exec(asyncio.SubprocessProtocol, "executable", "arg0")) # $getCommand="executable" getAPathArgument="executable" + +asyncio.run(asyncio.create_subprocess_shell("shell_command")) # $getCommand="shell_command" getAPathArgument="shell_command" +asyncio.run(subprocess.create_subprocess_shell("shell_command")) # $getCommand="shell_command" getAPathArgument="shell_command" + +loop = asyncio.get_running_loop() +loop.run_until_complete(loop.subprocess_shell(asyncio.SubprocessProtocol, "shell_command")) # $getCommand="shell_command" getAPathArgument="shell_command" diff --git a/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.ql b/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.ql index 97a01fd4b5f40..eaf935d573be2 100644 --- a/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.ql +++ b/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.ql @@ -8,7 +8,7 @@ module ModificationOfParameterWithDefaultTest implements TestSig { string getARelevantTag() { result = "modification" } private predicate relevant_node(DataFlow::Node sink) { - exists(ModificationOfParameterWithDefault::Configuration cfg | cfg.hasFlowTo(sink)) + ModificationOfParameterWithDefault::Flow::flowTo(sink) } predicate hasActualResult(Location location, string element, string tag, string value) { diff --git a/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.ql b/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.ql index 91ba1765724ee..90761391ce796 100644 --- a/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.ql +++ b/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.ql @@ -1,4 +1,4 @@ import python import experimental.dataflow.TestUtil.DataflowQueryTest import semmle.python.security.dataflow.PathInjectionQuery -import FromLegacyConfiguration +import FromTaintTrackingStateConfig diff --git a/python/ql/test/query-tests/Security/CWE-022-PathInjection/PathInjection.expected b/python/ql/test/query-tests/Security/CWE-022-PathInjection/PathInjection.expected index b0df9a02cc0db..b8bcf46ec1eef 100644 --- a/python/ql/test/query-tests/Security/CWE-022-PathInjection/PathInjection.expected +++ b/python/ql/test/query-tests/Security/CWE-022-PathInjection/PathInjection.expected @@ -53,7 +53,8 @@ edges | path_injection.py:84:16:84:22 | ControlFlowNode for request | path_injection.py:84:16:84:27 | ControlFlowNode for Attribute | | path_injection.py:84:16:84:27 | ControlFlowNode for Attribute | path_injection.py:84:16:84:47 | ControlFlowNode for Attribute() | | path_injection.py:84:16:84:47 | ControlFlowNode for Attribute() | path_injection.py:84:5:84:12 | SSA variable filename | -| path_injection.py:85:5:85:24 | SSA variable possibly_unsafe_path | path_injection.py:87:18:87:37 | ControlFlowNode for possibly_unsafe_path | +| path_injection.py:85:5:85:24 | SSA variable possibly_unsafe_path | path_injection.py:86:24:86:43 | ControlFlowNode for possibly_unsafe_path | +| path_injection.py:86:24:86:43 | ControlFlowNode for possibly_unsafe_path | path_injection.py:87:18:87:37 | ControlFlowNode for possibly_unsafe_path | | path_injection.py:91:20:91:25 | ControlFlowNode for foo_id | path_injection.py:93:5:93:8 | SSA variable path | | path_injection.py:93:5:93:8 | SSA variable path | path_injection.py:94:14:94:17 | ControlFlowNode for path | | path_injection.py:98:20:98:22 | ControlFlowNode for foo | path_injection.py:101:5:101:8 | SSA variable path | @@ -78,7 +79,8 @@ edges | path_injection.py:138:16:138:22 | ControlFlowNode for request | path_injection.py:138:16:138:27 | ControlFlowNode for Attribute | | path_injection.py:138:16:138:27 | ControlFlowNode for Attribute | path_injection.py:138:16:138:47 | ControlFlowNode for Attribute() | | path_injection.py:138:16:138:47 | ControlFlowNode for Attribute() | path_injection.py:138:5:138:12 | SSA variable filename | -| path_injection.py:139:5:139:8 | SSA variable path | path_injection.py:142:14:142:17 | ControlFlowNode for path | +| path_injection.py:139:5:139:8 | SSA variable path | path_injection.py:140:47:140:50 | ControlFlowNode for path | +| path_injection.py:140:47:140:50 | ControlFlowNode for path | path_injection.py:142:14:142:17 | ControlFlowNode for path | | path_injection.py:149:5:149:12 | SSA variable filename | path_injection.py:151:9:151:12 | SSA variable path | | path_injection.py:149:16:149:22 | ControlFlowNode for request | path_injection.py:149:16:149:27 | ControlFlowNode for Attribute | | path_injection.py:149:16:149:27 | ControlFlowNode for Attribute | path_injection.py:149:16:149:47 | ControlFlowNode for Attribute() | @@ -171,6 +173,7 @@ nodes | path_injection.py:84:16:84:27 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | path_injection.py:84:16:84:47 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | path_injection.py:85:5:85:24 | SSA variable possibly_unsafe_path | semmle.label | SSA variable possibly_unsafe_path | +| path_injection.py:86:24:86:43 | ControlFlowNode for possibly_unsafe_path | semmle.label | ControlFlowNode for possibly_unsafe_path | | path_injection.py:87:18:87:37 | ControlFlowNode for possibly_unsafe_path | semmle.label | ControlFlowNode for possibly_unsafe_path | | path_injection.py:91:20:91:25 | ControlFlowNode for foo_id | semmle.label | ControlFlowNode for foo_id | | path_injection.py:93:5:93:8 | SSA variable path | semmle.label | SSA variable path | @@ -202,6 +205,7 @@ nodes | path_injection.py:138:16:138:27 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | path_injection.py:138:16:138:47 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | path_injection.py:139:5:139:8 | SSA variable path | semmle.label | SSA variable path | +| path_injection.py:140:47:140:50 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | | path_injection.py:142:14:142:17 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | | path_injection.py:149:5:149:12 | SSA variable filename | semmle.label | SSA variable filename | | path_injection.py:149:16:149:22 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | diff --git a/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.ql b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.ql index ecb787218b13e..df745b4ee8c35 100644 --- a/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.ql +++ b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.ql @@ -1,4 +1,4 @@ import python import experimental.dataflow.TestUtil.DataflowQueryTest import semmle.python.security.dataflow.CommandInjectionQuery -import FromLegacyConfiguration +import FromTaintTrackingConfig diff --git a/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.ql b/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.ql index b00d364b85329..b2602b2b25c7b 100644 --- a/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.ql +++ b/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.ql @@ -1,4 +1,4 @@ import python import experimental.dataflow.TestUtil.DataflowQueryTest import semmle.python.security.dataflow.UnsafeShellCommandConstructionQuery -import FromLegacyConfiguration +import FromTaintTrackingConfig diff --git a/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected index 5cc3f3eef6da6..90b58f8e319d6 100644 --- a/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected +++ b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/StackTraceExposure.expected @@ -1,6 +1,7 @@ edges | test.py:23:25:23:25 | SSA variable e | test.py:24:16:24:16 | ControlFlowNode for e | -| test.py:31:25:31:25 | SSA variable e | test.py:32:16:32:30 | ControlFlowNode for Attribute | +| test.py:31:25:31:25 | SSA variable e | test.py:32:16:32:16 | ControlFlowNode for e | +| test.py:32:16:32:16 | ControlFlowNode for e | test.py:32:16:32:30 | ControlFlowNode for Attribute | | test.py:49:9:49:11 | SSA variable err | test.py:50:29:50:31 | ControlFlowNode for err | | test.py:49:15:49:36 | ControlFlowNode for Attribute() | test.py:49:9:49:11 | SSA variable err | | test.py:50:29:50:31 | ControlFlowNode for err | test.py:50:16:50:32 | ControlFlowNode for format_error() | @@ -12,6 +13,7 @@ nodes | test.py:23:25:23:25 | SSA variable e | semmle.label | SSA variable e | | test.py:24:16:24:16 | ControlFlowNode for e | semmle.label | ControlFlowNode for e | | test.py:31:25:31:25 | SSA variable e | semmle.label | SSA variable e | +| test.py:32:16:32:16 | ControlFlowNode for e | semmle.label | ControlFlowNode for e | | test.py:32:16:32:30 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | test.py:49:9:49:11 | SSA variable err | semmle.label | SSA variable err | | test.py:49:15:49:36 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | diff --git a/python/ql/test/query-tests/Security/CWE-285-PamAuthorization/PamAuthorization.expected b/python/ql/test/query-tests/Security/CWE-285-PamAuthorization/PamAuthorization.expected index f259cfab56110..9379464e1c100 100644 --- a/python/ql/test/query-tests/Security/CWE-285-PamAuthorization/PamAuthorization.expected +++ b/python/ql/test/query-tests/Security/CWE-285-PamAuthorization/PamAuthorization.expected @@ -1,10 +1,13 @@ edges | pam_test.py:4:26:4:32 | ControlFlowNode for ImportMember | pam_test.py:4:26:4:32 | GSSA Variable request | | pam_test.py:4:26:4:32 | GSSA Variable request | pam_test.py:71:16:71:22 | ControlFlowNode for request | -| pam_test.py:71:5:71:12 | SSA variable username | pam_test.py:76:14:76:40 | ControlFlowNode for pam_authenticate() | +| pam_test.py:71:5:71:12 | SSA variable username | pam_test.py:74:33:74:40 | ControlFlowNode for username | | pam_test.py:71:16:71:22 | ControlFlowNode for request | pam_test.py:71:16:71:27 | ControlFlowNode for Attribute | | pam_test.py:71:16:71:27 | ControlFlowNode for Attribute | pam_test.py:71:16:71:47 | ControlFlowNode for Attribute() | | pam_test.py:71:16:71:47 | ControlFlowNode for Attribute() | pam_test.py:71:5:71:12 | SSA variable username | +| pam_test.py:74:33:74:40 | ControlFlowNode for username | pam_test.py:74:62:74:67 | ControlFlowNode for handle | +| pam_test.py:74:62:74:67 | ControlFlowNode for handle | pam_test.py:76:31:76:36 | ControlFlowNode for handle | +| pam_test.py:76:31:76:36 | ControlFlowNode for handle | pam_test.py:76:14:76:40 | ControlFlowNode for pam_authenticate() | nodes | pam_test.py:4:26:4:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | pam_test.py:4:26:4:32 | GSSA Variable request | semmle.label | GSSA Variable request | @@ -12,7 +15,10 @@ nodes | pam_test.py:71:16:71:22 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | pam_test.py:71:16:71:27 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | pam_test.py:71:16:71:47 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | +| pam_test.py:74:33:74:40 | ControlFlowNode for username | semmle.label | ControlFlowNode for username | +| pam_test.py:74:62:74:67 | ControlFlowNode for handle | semmle.label | ControlFlowNode for handle | | pam_test.py:76:14:76:40 | ControlFlowNode for pam_authenticate() | semmle.label | ControlFlowNode for pam_authenticate() | +| pam_test.py:76:31:76:36 | ControlFlowNode for handle | semmle.label | ControlFlowNode for handle | subpaths #select | pam_test.py:76:14:76:40 | ControlFlowNode for pam_authenticate() | pam_test.py:4:26:4:32 | ControlFlowNode for ImportMember | pam_test.py:76:14:76:40 | ControlFlowNode for pam_authenticate() | This PAM authentication depends on a $@, and 'pam_acct_mgmt' is not called afterwards. | pam_test.py:4:26:4:32 | ControlFlowNode for ImportMember | user-provided value | diff --git a/python/ql/test/query-tests/Security/CWE-327-WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected b/python/ql/test/query-tests/Security/CWE-327-WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected index 30a04916e7f68..6be594dae63e3 100644 --- a/python/ql/test/query-tests/Security/CWE-327-WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected +++ b/python/ql/test/query-tests/Security/CWE-327-WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected @@ -5,13 +5,13 @@ edges | test_cryptodome.py:2:37:2:51 | ControlFlowNode for ImportMember | test_cryptodome.py:2:37:2:51 | GSSA Variable get_certificate | | test_cryptodome.py:2:37:2:51 | GSSA Variable get_certificate | test_cryptodome.py:6:17:6:31 | ControlFlowNode for get_certificate | | test_cryptodome.py:6:5:6:13 | SSA variable dangerous | test_cryptodome.py:8:19:8:27 | ControlFlowNode for dangerous | -| test_cryptodome.py:6:17:6:31 | ControlFlowNode for get_certificate | test_cryptodome.py:6:5:6:13 | SSA variable dangerous | +| test_cryptodome.py:6:17:6:31 | ControlFlowNode for get_certificate | test_cryptodome.py:6:17:6:33 | ControlFlowNode for get_certificate() | | test_cryptodome.py:6:17:6:33 | ControlFlowNode for get_certificate() | test_cryptodome.py:6:5:6:13 | SSA variable dangerous | | test_cryptodome.py:13:5:13:13 | SSA variable dangerous | test_cryptodome.py:15:19:15:27 | ControlFlowNode for dangerous | -| test_cryptodome.py:13:17:13:28 | ControlFlowNode for get_password | test_cryptodome.py:13:5:13:13 | SSA variable dangerous | +| test_cryptodome.py:13:17:13:28 | ControlFlowNode for get_password | test_cryptodome.py:13:17:13:30 | ControlFlowNode for get_password() | | test_cryptodome.py:13:17:13:30 | ControlFlowNode for get_password() | test_cryptodome.py:13:5:13:13 | SSA variable dangerous | | test_cryptodome.py:20:5:20:13 | SSA variable dangerous | test_cryptodome.py:24:19:24:27 | ControlFlowNode for dangerous | -| test_cryptodome.py:20:17:20:28 | ControlFlowNode for get_password | test_cryptodome.py:20:5:20:13 | SSA variable dangerous | +| test_cryptodome.py:20:17:20:28 | ControlFlowNode for get_password | test_cryptodome.py:20:17:20:30 | ControlFlowNode for get_password() | | test_cryptodome.py:20:17:20:30 | ControlFlowNode for get_password() | test_cryptodome.py:20:5:20:13 | SSA variable dangerous | | test_cryptography.py:3:23:3:34 | ControlFlowNode for ImportMember | test_cryptography.py:3:23:3:34 | GSSA Variable get_password | | test_cryptography.py:3:23:3:34 | GSSA Variable get_password | test_cryptography.py:15:17:15:28 | ControlFlowNode for get_password | @@ -19,13 +19,13 @@ edges | test_cryptography.py:3:37:3:51 | ControlFlowNode for ImportMember | test_cryptography.py:3:37:3:51 | GSSA Variable get_certificate | | test_cryptography.py:3:37:3:51 | GSSA Variable get_certificate | test_cryptography.py:7:17:7:31 | ControlFlowNode for get_certificate | | test_cryptography.py:7:5:7:13 | SSA variable dangerous | test_cryptography.py:9:19:9:27 | ControlFlowNode for dangerous | -| test_cryptography.py:7:17:7:31 | ControlFlowNode for get_certificate | test_cryptography.py:7:5:7:13 | SSA variable dangerous | +| test_cryptography.py:7:17:7:31 | ControlFlowNode for get_certificate | test_cryptography.py:7:17:7:33 | ControlFlowNode for get_certificate() | | test_cryptography.py:7:17:7:33 | ControlFlowNode for get_certificate() | test_cryptography.py:7:5:7:13 | SSA variable dangerous | | test_cryptography.py:15:5:15:13 | SSA variable dangerous | test_cryptography.py:17:19:17:27 | ControlFlowNode for dangerous | -| test_cryptography.py:15:17:15:28 | ControlFlowNode for get_password | test_cryptography.py:15:5:15:13 | SSA variable dangerous | +| test_cryptography.py:15:17:15:28 | ControlFlowNode for get_password | test_cryptography.py:15:17:15:30 | ControlFlowNode for get_password() | | test_cryptography.py:15:17:15:30 | ControlFlowNode for get_password() | test_cryptography.py:15:5:15:13 | SSA variable dangerous | | test_cryptography.py:23:5:23:13 | SSA variable dangerous | test_cryptography.py:27:19:27:27 | ControlFlowNode for dangerous | -| test_cryptography.py:23:17:23:28 | ControlFlowNode for get_password | test_cryptography.py:23:5:23:13 | SSA variable dangerous | +| test_cryptography.py:23:17:23:28 | ControlFlowNode for get_password | test_cryptography.py:23:17:23:30 | ControlFlowNode for get_password() | | test_cryptography.py:23:17:23:30 | ControlFlowNode for get_password() | test_cryptography.py:23:5:23:13 | SSA variable dangerous | nodes | test_cryptodome.py:2:23:2:34 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | diff --git a/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/FullServerSideRequestForgery.expected b/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/FullServerSideRequestForgery.expected index a5c9c706518b0..3db6c82b96c59 100644 --- a/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/FullServerSideRequestForgery.expected +++ b/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/FullServerSideRequestForgery.expected @@ -1,307 +1,111 @@ edges | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | full_partial_test.py:1:19:1:25 | GSSA Variable request | -| full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | full_partial_test.py:1:19:1:25 | GSSA Variable request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:8:17:8:23 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:38:17:38:23 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:58:17:58:23 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:72:17:72:23 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:86:18:86:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:92:18:92:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:98:18:98:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:104:18:104:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:110:18:110:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:119:18:119:24 | ControlFlowNode for request | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:12:5:12:7 | SSA variable url | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:12:5:12:7 | SSA variable url | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:18:5:18:7 | SSA variable url | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:18:5:18:7 | SSA variable url | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:22:5:22:7 | SSA variable url | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:22:5:22:7 | SSA variable url | | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | full_partial_test.py:7:5:7:14 | SSA variable user_input | -| full_partial_test.py:7:18:7:24 | ControlFlowNode for request | full_partial_test.py:7:5:7:14 | SSA variable user_input | -| full_partial_test.py:7:18:7:24 | ControlFlowNode for request | full_partial_test.py:8:5:8:13 | SSA variable query_val | -| full_partial_test.py:8:5:8:13 | SSA variable query_val | full_partial_test.py:22:5:22:7 | SSA variable url | -| full_partial_test.py:8:17:8:23 | ControlFlowNode for request | full_partial_test.py:8:5:8:13 | SSA variable query_val | -| full_partial_test.py:12:5:12:7 | SSA variable url | full_partial_test.py:13:18:13:20 | ControlFlowNode for url | | full_partial_test.py:12:5:12:7 | SSA variable url | full_partial_test.py:13:18:13:20 | ControlFlowNode for url | | full_partial_test.py:18:5:18:7 | SSA variable url | full_partial_test.py:19:18:19:20 | ControlFlowNode for url | -| full_partial_test.py:18:5:18:7 | SSA variable url | full_partial_test.py:19:18:19:20 | ControlFlowNode for url | -| full_partial_test.py:22:5:22:7 | SSA variable url | full_partial_test.py:23:18:23:20 | ControlFlowNode for url | | full_partial_test.py:22:5:22:7 | SSA variable url | full_partial_test.py:23:18:23:20 | ControlFlowNode for url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:41:5:41:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:41:5:41:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:44:5:44:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:44:5:44:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:47:5:47:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:47:5:47:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:50:5:50:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:50:5:50:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:53:5:53:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:53:5:53:7 | SSA variable url | | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | full_partial_test.py:37:5:37:14 | SSA variable user_input | -| full_partial_test.py:37:18:37:24 | ControlFlowNode for request | full_partial_test.py:37:5:37:14 | SSA variable user_input | -| full_partial_test.py:37:18:37:24 | ControlFlowNode for request | full_partial_test.py:38:5:38:13 | SSA variable query_val | -| full_partial_test.py:38:5:38:13 | SSA variable query_val | full_partial_test.py:47:5:47:7 | SSA variable url | -| full_partial_test.py:38:17:38:23 | ControlFlowNode for request | full_partial_test.py:38:5:38:13 | SSA variable query_val | -| full_partial_test.py:41:5:41:7 | SSA variable url | full_partial_test.py:42:18:42:20 | ControlFlowNode for url | | full_partial_test.py:41:5:41:7 | SSA variable url | full_partial_test.py:42:18:42:20 | ControlFlowNode for url | | full_partial_test.py:44:5:44:7 | SSA variable url | full_partial_test.py:45:18:45:20 | ControlFlowNode for url | -| full_partial_test.py:44:5:44:7 | SSA variable url | full_partial_test.py:45:18:45:20 | ControlFlowNode for url | | full_partial_test.py:47:5:47:7 | SSA variable url | full_partial_test.py:48:18:48:20 | ControlFlowNode for url | -| full_partial_test.py:47:5:47:7 | SSA variable url | full_partial_test.py:48:18:48:20 | ControlFlowNode for url | -| full_partial_test.py:50:5:50:7 | SSA variable url | full_partial_test.py:51:18:51:20 | ControlFlowNode for url | | full_partial_test.py:50:5:50:7 | SSA variable url | full_partial_test.py:51:18:51:20 | ControlFlowNode for url | | full_partial_test.py:53:5:53:7 | SSA variable url | full_partial_test.py:54:18:54:20 | ControlFlowNode for url | -| full_partial_test.py:53:5:53:7 | SSA variable url | full_partial_test.py:54:18:54:20 | ControlFlowNode for url | | full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:61:5:61:7 | SSA variable url | -| full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:61:5:61:7 | SSA variable url | -| full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:64:5:64:7 | SSA variable url | | full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:64:5:64:7 | SSA variable url | -| full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:67:5:67:7 | SSA variable url | -| full_partial_test.py:57:18:57:24 | ControlFlowNode for request | full_partial_test.py:57:5:57:14 | SSA variable user_input | | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | full_partial_test.py:57:5:57:14 | SSA variable user_input | -| full_partial_test.py:57:18:57:24 | ControlFlowNode for request | full_partial_test.py:58:5:58:13 | SSA variable query_val | -| full_partial_test.py:58:5:58:13 | SSA variable query_val | full_partial_test.py:67:5:67:7 | SSA variable url | -| full_partial_test.py:58:17:58:23 | ControlFlowNode for request | full_partial_test.py:58:5:58:13 | SSA variable query_val | | full_partial_test.py:61:5:61:7 | SSA variable url | full_partial_test.py:62:18:62:20 | ControlFlowNode for url | -| full_partial_test.py:61:5:61:7 | SSA variable url | full_partial_test.py:62:18:62:20 | ControlFlowNode for url | -| full_partial_test.py:64:5:64:7 | SSA variable url | full_partial_test.py:65:18:65:20 | ControlFlowNode for url | | full_partial_test.py:64:5:64:7 | SSA variable url | full_partial_test.py:65:18:65:20 | ControlFlowNode for url | -| full_partial_test.py:67:5:67:7 | SSA variable url | full_partial_test.py:68:18:68:20 | ControlFlowNode for url | | full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:75:5:75:7 | SSA variable url | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:75:5:75:7 | SSA variable url | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:78:5:78:7 | SSA variable url | | full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:78:5:78:7 | SSA variable url | | full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:81:5:81:7 | SSA variable url | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:81:5:81:7 | SSA variable url | -| full_partial_test.py:71:18:71:24 | ControlFlowNode for request | full_partial_test.py:71:5:71:14 | SSA variable user_input | | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | full_partial_test.py:71:5:71:14 | SSA variable user_input | -| full_partial_test.py:71:18:71:24 | ControlFlowNode for request | full_partial_test.py:72:5:72:13 | SSA variable query_val | -| full_partial_test.py:72:5:72:13 | SSA variable query_val | full_partial_test.py:81:5:81:7 | SSA variable url | -| full_partial_test.py:72:17:72:23 | ControlFlowNode for request | full_partial_test.py:72:5:72:13 | SSA variable query_val | -| full_partial_test.py:75:5:75:7 | SSA variable url | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | | full_partial_test.py:75:5:75:7 | SSA variable url | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | | full_partial_test.py:78:5:78:7 | SSA variable url | full_partial_test.py:79:18:79:20 | ControlFlowNode for url | -| full_partial_test.py:78:5:78:7 | SSA variable url | full_partial_test.py:79:18:79:20 | ControlFlowNode for url | -| full_partial_test.py:81:5:81:7 | SSA variable url | full_partial_test.py:82:18:82:20 | ControlFlowNode for url | | full_partial_test.py:81:5:81:7 | SSA variable url | full_partial_test.py:82:18:82:20 | ControlFlowNode for url | -| full_partial_test.py:86:5:86:14 | SSA variable user_input | full_partial_test.py:88:5:88:7 | SSA variable url | -| full_partial_test.py:86:18:86:24 | ControlFlowNode for request | full_partial_test.py:86:5:86:14 | SSA variable user_input | -| full_partial_test.py:88:5:88:7 | SSA variable url | full_partial_test.py:89:18:89:20 | ControlFlowNode for url | -| full_partial_test.py:92:5:92:14 | SSA variable user_input | full_partial_test.py:94:5:94:7 | SSA variable url | -| full_partial_test.py:92:18:92:24 | ControlFlowNode for request | full_partial_test.py:92:5:92:14 | SSA variable user_input | -| full_partial_test.py:94:5:94:7 | SSA variable url | full_partial_test.py:95:18:95:20 | ControlFlowNode for url | -| full_partial_test.py:98:5:98:14 | SSA variable user_input | full_partial_test.py:100:5:100:7 | SSA variable url | -| full_partial_test.py:98:18:98:24 | ControlFlowNode for request | full_partial_test.py:98:5:98:14 | SSA variable user_input | -| full_partial_test.py:100:5:100:7 | SSA variable url | full_partial_test.py:101:18:101:20 | ControlFlowNode for url | -| full_partial_test.py:104:5:104:14 | SSA variable user_input | full_partial_test.py:106:5:106:7 | SSA variable url | -| full_partial_test.py:104:18:104:24 | ControlFlowNode for request | full_partial_test.py:104:5:104:14 | SSA variable user_input | -| full_partial_test.py:106:5:106:7 | SSA variable url | full_partial_test.py:107:18:107:20 | ControlFlowNode for url | -| full_partial_test.py:110:5:110:14 | SSA variable user_input | full_partial_test.py:115:5:115:7 | SSA variable url | -| full_partial_test.py:110:18:110:24 | ControlFlowNode for request | full_partial_test.py:110:5:110:14 | SSA variable user_input | -| full_partial_test.py:115:5:115:7 | SSA variable url | full_partial_test.py:116:18:116:20 | ControlFlowNode for url | -| full_partial_test.py:119:5:119:14 | SSA variable user_input | full_partial_test.py:121:5:121:7 | SSA variable url | -| full_partial_test.py:119:18:119:24 | ControlFlowNode for request | full_partial_test.py:119:5:119:14 | SSA variable user_input | -| full_partial_test.py:121:5:121:7 | SSA variable url | full_partial_test.py:122:18:122:20 | ControlFlowNode for url | -| test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | test_http_client.py:1:26:1:32 | GSSA Variable request | | test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | test_http_client.py:1:26:1:32 | GSSA Variable request | | test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:9:19:9:25 | ControlFlowNode for request | -| test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:9:19:9:25 | ControlFlowNode for request | -| test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:10:19:10:25 | ControlFlowNode for request | | test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:10:19:10:25 | ControlFlowNode for request | -| test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:11:18:11:24 | ControlFlowNode for request | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | | test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | -| test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | -| test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | | test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | -| test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:11:5:11:14 | SSA variable user_input | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | | test_http_client.py:10:19:10:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | -| test_http_client.py:10:19:10:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | -| test_http_client.py:10:19:10:25 | ControlFlowNode for request | test_http_client.py:11:5:11:14 | SSA variable user_input | -| test_http_client.py:11:5:11:14 | SSA variable user_input | test_http_client.py:31:5:31:8 | SSA variable path | -| test_http_client.py:11:5:11:14 | SSA variable user_input | test_http_client.py:35:5:35:8 | SSA variable path | -| test_http_client.py:11:18:11:24 | ControlFlowNode for request | test_http_client.py:11:5:11:14 | SSA variable user_input | -| test_http_client.py:31:5:31:8 | SSA variable path | test_http_client.py:33:25:33:28 | ControlFlowNode for path | -| test_http_client.py:35:5:35:8 | SSA variable path | test_http_client.py:37:25:37:28 | ControlFlowNode for path | -| test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | test_requests.py:1:19:1:25 | GSSA Variable request | | test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | test_requests.py:1:19:1:25 | GSSA Variable request | | test_requests.py:1:19:1:25 | GSSA Variable request | test_requests.py:6:18:6:24 | ControlFlowNode for request | -| test_requests.py:1:19:1:25 | GSSA Variable request | test_requests.py:6:18:6:24 | ControlFlowNode for request | | test_requests.py:6:5:6:14 | SSA variable user_input | test_requests.py:8:18:8:27 | ControlFlowNode for user_input | -| test_requests.py:6:5:6:14 | SSA variable user_input | test_requests.py:8:18:8:27 | ControlFlowNode for user_input | -| test_requests.py:6:18:6:24 | ControlFlowNode for request | test_requests.py:6:5:6:14 | SSA variable user_input | | test_requests.py:6:18:6:24 | ControlFlowNode for request | test_requests.py:6:5:6:14 | SSA variable user_input | nodes | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | -| full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | full_partial_test.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:7:5:7:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:7:18:7:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:8:5:8:13 | SSA variable query_val | semmle.label | SSA variable query_val | -| full_partial_test.py:8:17:8:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | | full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | | full_partial_test.py:12:5:12:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:12:5:12:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:13:18:13:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:13:18:13:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:18:5:18:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:18:5:18:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:19:18:19:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:19:18:19:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:22:5:22:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:22:5:22:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:23:18:23:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:23:18:23:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:37:5:37:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:37:18:37:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:38:5:38:13 | SSA variable query_val | semmle.label | SSA variable query_val | -| full_partial_test.py:38:17:38:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:41:5:41:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:41:5:41:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:42:18:42:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:42:18:42:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:44:5:44:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:44:5:44:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:45:18:45:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:45:18:45:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:47:5:47:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:47:5:47:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:48:18:48:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:48:18:48:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:50:5:50:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:50:5:50:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:51:18:51:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:51:18:51:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:53:5:53:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:53:5:53:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:54:18:54:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:54:18:54:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:57:5:57:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:57:5:57:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:57:18:57:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:58:5:58:13 | SSA variable query_val | semmle.label | SSA variable query_val | -| full_partial_test.py:58:17:58:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:61:5:61:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:61:5:61:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:62:18:62:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:62:18:62:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:64:5:64:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:64:5:64:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:65:18:65:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:65:18:65:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:67:5:67:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:68:18:68:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:71:5:71:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:71:18:71:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:72:5:72:13 | SSA variable query_val | semmle.label | SSA variable query_val | -| full_partial_test.py:72:17:72:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:75:5:75:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:75:5:75:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:76:18:76:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:78:5:78:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:78:5:78:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:79:18:79:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:79:18:79:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:81:5:81:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:81:5:81:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:82:18:82:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:82:18:82:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:86:5:86:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:86:18:86:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:88:5:88:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:89:18:89:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:92:5:92:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:92:18:92:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:94:5:94:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:95:18:95:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:98:5:98:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:98:18:98:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:100:5:100:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:101:18:101:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:104:5:104:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:104:18:104:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:106:5:106:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:107:18:107:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:110:5:110:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:110:18:110:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:115:5:115:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:116:18:116:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:119:5:119:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:119:18:119:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:121:5:121:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:122:18:122:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | test_http_client.py:1:26:1:32 | GSSA Variable request | semmle.label | GSSA Variable request | -| test_http_client.py:1:26:1:32 | GSSA Variable request | semmle.label | GSSA Variable request | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | semmle.label | SSA variable unsafe_host | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | semmle.label | SSA variable unsafe_host | | test_http_client.py:9:19:9:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| test_http_client.py:9:19:9:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | semmle.label | SSA variable unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | semmle.label | SSA variable unsafe_path | -| test_http_client.py:10:19:10:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_http_client.py:10:19:10:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| test_http_client.py:11:5:11:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| test_http_client.py:11:18:11:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | | test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | -| test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | -| test_http_client.py:31:5:31:8 | SSA variable path | semmle.label | SSA variable path | -| test_http_client.py:33:25:33:28 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | -| test_http_client.py:35:5:35:8 | SSA variable path | semmle.label | SSA variable path | -| test_http_client.py:37:25:37:28 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | -| test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | test_requests.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | -| test_requests.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | | test_requests.py:6:5:6:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| test_requests.py:6:5:6:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| test_requests.py:6:18:6:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_requests.py:6:18:6:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_requests.py:8:18:8:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | -| test_requests.py:8:18:8:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | subpaths #select | full_partial_test.py:10:5:10:28 | ControlFlowNode for Attribute() | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | The full URL of this request depends on a $@. | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | user-provided value | diff --git a/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected b/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected index faa8560d19f70..aa983e62e0146 100644 --- a/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected +++ b/python/ql/test/query-tests/Security/CWE-918-ServerSideRequestForgery/PartialServerSideRequestForgery.expected @@ -1,17 +1,12 @@ edges | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | full_partial_test.py:1:19:1:25 | GSSA Variable request | -| full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | full_partial_test.py:1:19:1:25 | GSSA Variable request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:8:17:8:23 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:38:17:38:23 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:58:17:58:23 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:72:17:72:23 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:86:18:86:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:92:18:92:24 | ControlFlowNode for request | @@ -20,80 +15,49 @@ edges | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:110:18:110:24 | ControlFlowNode for request | | full_partial_test.py:1:19:1:25 | GSSA Variable request | full_partial_test.py:119:18:119:24 | ControlFlowNode for request | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:12:5:12:7 | SSA variable url | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:12:5:12:7 | SSA variable url | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:18:5:18:7 | SSA variable url | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:18:5:18:7 | SSA variable url | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:22:5:22:7 | SSA variable url | | full_partial_test.py:7:5:7:14 | SSA variable user_input | full_partial_test.py:22:5:22:7 | SSA variable url | | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | full_partial_test.py:7:5:7:14 | SSA variable user_input | -| full_partial_test.py:7:18:7:24 | ControlFlowNode for request | full_partial_test.py:7:5:7:14 | SSA variable user_input | | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | full_partial_test.py:8:5:8:13 | SSA variable query_val | | full_partial_test.py:8:5:8:13 | SSA variable query_val | full_partial_test.py:22:5:22:7 | SSA variable url | | full_partial_test.py:8:17:8:23 | ControlFlowNode for request | full_partial_test.py:8:5:8:13 | SSA variable query_val | | full_partial_test.py:12:5:12:7 | SSA variable url | full_partial_test.py:13:18:13:20 | ControlFlowNode for url | -| full_partial_test.py:12:5:12:7 | SSA variable url | full_partial_test.py:13:18:13:20 | ControlFlowNode for url | | full_partial_test.py:18:5:18:7 | SSA variable url | full_partial_test.py:19:18:19:20 | ControlFlowNode for url | -| full_partial_test.py:18:5:18:7 | SSA variable url | full_partial_test.py:19:18:19:20 | ControlFlowNode for url | -| full_partial_test.py:22:5:22:7 | SSA variable url | full_partial_test.py:23:18:23:20 | ControlFlowNode for url | | full_partial_test.py:22:5:22:7 | SSA variable url | full_partial_test.py:23:18:23:20 | ControlFlowNode for url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:41:5:41:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:41:5:41:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:44:5:44:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:44:5:44:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:47:5:47:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:47:5:47:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:50:5:50:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:50:5:50:7 | SSA variable url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:53:5:53:7 | SSA variable url | | full_partial_test.py:37:5:37:14 | SSA variable user_input | full_partial_test.py:53:5:53:7 | SSA variable url | | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | full_partial_test.py:37:5:37:14 | SSA variable user_input | -| full_partial_test.py:37:18:37:24 | ControlFlowNode for request | full_partial_test.py:37:5:37:14 | SSA variable user_input | | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | full_partial_test.py:38:5:38:13 | SSA variable query_val | | full_partial_test.py:38:5:38:13 | SSA variable query_val | full_partial_test.py:47:5:47:7 | SSA variable url | | full_partial_test.py:38:17:38:23 | ControlFlowNode for request | full_partial_test.py:38:5:38:13 | SSA variable query_val | | full_partial_test.py:41:5:41:7 | SSA variable url | full_partial_test.py:42:18:42:20 | ControlFlowNode for url | -| full_partial_test.py:41:5:41:7 | SSA variable url | full_partial_test.py:42:18:42:20 | ControlFlowNode for url | -| full_partial_test.py:44:5:44:7 | SSA variable url | full_partial_test.py:45:18:45:20 | ControlFlowNode for url | | full_partial_test.py:44:5:44:7 | SSA variable url | full_partial_test.py:45:18:45:20 | ControlFlowNode for url | | full_partial_test.py:47:5:47:7 | SSA variable url | full_partial_test.py:48:18:48:20 | ControlFlowNode for url | -| full_partial_test.py:47:5:47:7 | SSA variable url | full_partial_test.py:48:18:48:20 | ControlFlowNode for url | -| full_partial_test.py:50:5:50:7 | SSA variable url | full_partial_test.py:51:18:51:20 | ControlFlowNode for url | | full_partial_test.py:50:5:50:7 | SSA variable url | full_partial_test.py:51:18:51:20 | ControlFlowNode for url | | full_partial_test.py:53:5:53:7 | SSA variable url | full_partial_test.py:54:18:54:20 | ControlFlowNode for url | -| full_partial_test.py:53:5:53:7 | SSA variable url | full_partial_test.py:54:18:54:20 | ControlFlowNode for url | | full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:61:5:61:7 | SSA variable url | -| full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:61:5:61:7 | SSA variable url | -| full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:64:5:64:7 | SSA variable url | | full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:64:5:64:7 | SSA variable url | | full_partial_test.py:57:5:57:14 | SSA variable user_input | full_partial_test.py:67:5:67:7 | SSA variable url | | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | full_partial_test.py:57:5:57:14 | SSA variable user_input | -| full_partial_test.py:57:18:57:24 | ControlFlowNode for request | full_partial_test.py:57:5:57:14 | SSA variable user_input | | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | full_partial_test.py:58:5:58:13 | SSA variable query_val | | full_partial_test.py:58:5:58:13 | SSA variable query_val | full_partial_test.py:67:5:67:7 | SSA variable url | | full_partial_test.py:58:17:58:23 | ControlFlowNode for request | full_partial_test.py:58:5:58:13 | SSA variable query_val | | full_partial_test.py:61:5:61:7 | SSA variable url | full_partial_test.py:62:18:62:20 | ControlFlowNode for url | -| full_partial_test.py:61:5:61:7 | SSA variable url | full_partial_test.py:62:18:62:20 | ControlFlowNode for url | -| full_partial_test.py:64:5:64:7 | SSA variable url | full_partial_test.py:65:18:65:20 | ControlFlowNode for url | | full_partial_test.py:64:5:64:7 | SSA variable url | full_partial_test.py:65:18:65:20 | ControlFlowNode for url | | full_partial_test.py:67:5:67:7 | SSA variable url | full_partial_test.py:68:18:68:20 | ControlFlowNode for url | | full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:75:5:75:7 | SSA variable url | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:75:5:75:7 | SSA variable url | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:78:5:78:7 | SSA variable url | | full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:78:5:78:7 | SSA variable url | | full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:81:5:81:7 | SSA variable url | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | full_partial_test.py:81:5:81:7 | SSA variable url | -| full_partial_test.py:71:18:71:24 | ControlFlowNode for request | full_partial_test.py:71:5:71:14 | SSA variable user_input | | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | full_partial_test.py:71:5:71:14 | SSA variable user_input | | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | full_partial_test.py:72:5:72:13 | SSA variable query_val | | full_partial_test.py:72:5:72:13 | SSA variable query_val | full_partial_test.py:81:5:81:7 | SSA variable url | | full_partial_test.py:72:17:72:23 | ControlFlowNode for request | full_partial_test.py:72:5:72:13 | SSA variable query_val | | full_partial_test.py:75:5:75:7 | SSA variable url | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | -| full_partial_test.py:75:5:75:7 | SSA variable url | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | | full_partial_test.py:78:5:78:7 | SSA variable url | full_partial_test.py:79:18:79:20 | ControlFlowNode for url | -| full_partial_test.py:78:5:78:7 | SSA variable url | full_partial_test.py:79:18:79:20 | ControlFlowNode for url | -| full_partial_test.py:81:5:81:7 | SSA variable url | full_partial_test.py:82:18:82:20 | ControlFlowNode for url | | full_partial_test.py:81:5:81:7 | SSA variable url | full_partial_test.py:82:18:82:20 | ControlFlowNode for url | | full_partial_test.py:86:5:86:14 | SSA variable user_input | full_partial_test.py:88:5:88:7 | SSA variable url | | full_partial_test.py:86:18:86:24 | ControlFlowNode for request | full_partial_test.py:86:5:86:14 | SSA variable user_input | @@ -114,30 +78,18 @@ edges | full_partial_test.py:119:18:119:24 | ControlFlowNode for request | full_partial_test.py:119:5:119:14 | SSA variable user_input | | full_partial_test.py:121:5:121:7 | SSA variable url | full_partial_test.py:122:18:122:20 | ControlFlowNode for url | | test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | test_http_client.py:1:26:1:32 | GSSA Variable request | -| test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | test_http_client.py:1:26:1:32 | GSSA Variable request | | test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:9:19:9:25 | ControlFlowNode for request | -| test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:9:19:9:25 | ControlFlowNode for request | -| test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:10:19:10:25 | ControlFlowNode for request | | test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:10:19:10:25 | ControlFlowNode for request | | test_http_client.py:1:26:1:32 | GSSA Variable request | test_http_client.py:11:18:11:24 | ControlFlowNode for request | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | | test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | -| test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | -| test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | | test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | | test_http_client.py:9:19:9:25 | ControlFlowNode for request | test_http_client.py:11:5:11:14 | SSA variable user_input | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | -| test_http_client.py:10:19:10:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | | test_http_client.py:10:19:10:25 | ControlFlowNode for request | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | | test_http_client.py:10:19:10:25 | ControlFlowNode for request | test_http_client.py:11:5:11:14 | SSA variable user_input | | test_http_client.py:11:5:11:14 | SSA variable user_input | test_http_client.py:31:5:31:8 | SSA variable path | @@ -146,97 +98,56 @@ edges | test_http_client.py:31:5:31:8 | SSA variable path | test_http_client.py:33:25:33:28 | ControlFlowNode for path | | test_http_client.py:35:5:35:8 | SSA variable path | test_http_client.py:37:25:37:28 | ControlFlowNode for path | | test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | test_requests.py:1:19:1:25 | GSSA Variable request | -| test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | test_requests.py:1:19:1:25 | GSSA Variable request | -| test_requests.py:1:19:1:25 | GSSA Variable request | test_requests.py:6:18:6:24 | ControlFlowNode for request | | test_requests.py:1:19:1:25 | GSSA Variable request | test_requests.py:6:18:6:24 | ControlFlowNode for request | | test_requests.py:6:5:6:14 | SSA variable user_input | test_requests.py:8:18:8:27 | ControlFlowNode for user_input | -| test_requests.py:6:5:6:14 | SSA variable user_input | test_requests.py:8:18:8:27 | ControlFlowNode for user_input | -| test_requests.py:6:18:6:24 | ControlFlowNode for request | test_requests.py:6:5:6:14 | SSA variable user_input | | test_requests.py:6:18:6:24 | ControlFlowNode for request | test_requests.py:6:5:6:14 | SSA variable user_input | nodes | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | -| full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | full_partial_test.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | -| full_partial_test.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | -| full_partial_test.py:7:5:7:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:7:5:7:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:7:18:7:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:7:18:7:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:8:5:8:13 | SSA variable query_val | semmle.label | SSA variable query_val | | full_partial_test.py:8:17:8:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | -| full_partial_test.py:10:18:10:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | | full_partial_test.py:12:5:12:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:12:5:12:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:13:18:13:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:13:18:13:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:18:5:18:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:18:5:18:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:19:18:19:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:19:18:19:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:22:5:22:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:22:5:22:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:23:18:23:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:23:18:23:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:37:5:37:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:37:5:37:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:37:18:37:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:37:18:37:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:38:5:38:13 | SSA variable query_val | semmle.label | SSA variable query_val | | full_partial_test.py:38:17:38:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:41:5:41:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:41:5:41:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:42:18:42:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:42:18:42:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:44:5:44:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:44:5:44:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:45:18:45:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:45:18:45:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:47:5:47:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:47:5:47:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:48:18:48:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:48:18:48:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:50:5:50:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:50:5:50:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:51:18:51:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:51:18:51:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:53:5:53:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:53:5:53:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:54:18:54:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:54:18:54:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:57:5:57:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:57:5:57:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:57:18:57:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| full_partial_test.py:57:18:57:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:58:5:58:13 | SSA variable query_val | semmle.label | SSA variable query_val | | full_partial_test.py:58:17:58:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:61:5:61:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:61:5:61:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:62:18:62:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:62:18:62:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:64:5:64:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:64:5:64:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:65:18:65:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:65:18:65:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:67:5:67:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:68:18:68:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:71:5:71:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:71:5:71:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| full_partial_test.py:71:18:71:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:71:18:71:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:72:5:72:13 | SSA variable query_val | semmle.label | SSA variable query_val | | full_partial_test.py:72:17:72:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | full_partial_test.py:75:5:75:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:75:5:75:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:76:18:76:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:76:18:76:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:78:5:78:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:78:5:78:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:79:18:79:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | -| full_partial_test.py:79:18:79:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:81:5:81:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:81:5:81:7 | SSA variable url | semmle.label | SSA variable url | -| full_partial_test.py:82:18:82:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:82:18:82:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | full_partial_test.py:86:5:86:14 | SSA variable user_input | semmle.label | SSA variable user_input | | full_partial_test.py:86:18:86:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -263,45 +174,28 @@ nodes | full_partial_test.py:121:5:121:7 | SSA variable url | semmle.label | SSA variable url | | full_partial_test.py:122:18:122:20 | ControlFlowNode for url | semmle.label | ControlFlowNode for url | | test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | -| test_http_client.py:1:26:1:32 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | | test_http_client.py:1:26:1:32 | GSSA Variable request | semmle.label | GSSA Variable request | -| test_http_client.py:1:26:1:32 | GSSA Variable request | semmle.label | GSSA Variable request | -| test_http_client.py:9:5:9:15 | SSA variable unsafe_host | semmle.label | SSA variable unsafe_host | | test_http_client.py:9:5:9:15 | SSA variable unsafe_host | semmle.label | SSA variable unsafe_host | | test_http_client.py:9:19:9:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | -| test_http_client.py:9:19:9:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_http_client.py:10:5:10:15 | SSA variable unsafe_path | semmle.label | SSA variable unsafe_path | -| test_http_client.py:10:5:10:15 | SSA variable unsafe_path | semmle.label | SSA variable unsafe_path | -| test_http_client.py:10:19:10:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_http_client.py:10:19:10:25 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_http_client.py:11:5:11:14 | SSA variable user_input | semmle.label | SSA variable user_input | | test_http_client.py:11:18:11:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:13:27:13:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:14:25:14:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:18:27:18:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:19:25:19:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:25:27:25:37 | ControlFlowNode for unsafe_host | semmle.label | ControlFlowNode for unsafe_host | -| test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:29:25:29:35 | ControlFlowNode for unsafe_path | semmle.label | ControlFlowNode for unsafe_path | | test_http_client.py:31:5:31:8 | SSA variable path | semmle.label | SSA variable path | | test_http_client.py:33:25:33:28 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | | test_http_client.py:35:5:35:8 | SSA variable path | semmle.label | SSA variable path | | test_http_client.py:37:25:37:28 | ControlFlowNode for path | semmle.label | ControlFlowNode for path | | test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | -| test_requests.py:1:19:1:25 | ControlFlowNode for ImportMember | semmle.label | ControlFlowNode for ImportMember | -| test_requests.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | | test_requests.py:1:19:1:25 | GSSA Variable request | semmle.label | GSSA Variable request | | test_requests.py:6:5:6:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| test_requests.py:6:5:6:14 | SSA variable user_input | semmle.label | SSA variable user_input | -| test_requests.py:6:18:6:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_requests.py:6:18:6:24 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | test_requests.py:8:18:8:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | -| test_requests.py:8:18:8:27 | ControlFlowNode for user_input | semmle.label | ControlFlowNode for user_input | subpaths #select | full_partial_test.py:68:5:68:21 | ControlFlowNode for Attribute() | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | full_partial_test.py:68:18:68:20 | ControlFlowNode for url | Part of the URL of this request depends on a $@. | full_partial_test.py:1:19:1:25 | ControlFlowNode for ImportMember | user-provided value | diff --git a/ql/Cargo.lock b/ql/Cargo.lock index 2d7dc3814d7c3..e9b0aa0b57b5f 100644 --- a/ql/Cargo.lock +++ b/ql/Cargo.lock @@ -133,16 +133,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.28" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f" +checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", - "time", "wasm-bindgen", "windows-targets 0.48.0", ] @@ -601,9 +600,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "memoffset" @@ -712,14 +711,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.3" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick 1.0.1", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "regex-automata 0.3.8", + "regex-syntax 0.7.5", ] [[package]] @@ -733,13 +732,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick 1.0.1", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.7.5", ] [[package]] @@ -750,9 +749,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "rustix" @@ -879,17 +878,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi", - "winapi", -] - [[package]] name = "tracing" version = "0.1.38" @@ -1020,12 +1008,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasm-bindgen" version = "0.2.84" diff --git a/ql/buramu/Cargo.toml b/ql/buramu/Cargo.toml index e4781a42dc50b..59edbf224a8c1 100644 --- a/ql/buramu/Cargo.toml +++ b/ql/buramu/Cargo.toml @@ -7,6 +7,6 @@ edition = "2018" [dependencies] lazy_static = "1.4.0" -chrono = "0.4.28" +chrono = "0.4.30" rayon = "1.7.0" -regex = "1.9.3" +regex = "1.9.5" diff --git a/ql/extractor/Cargo.toml b/ql/extractor/Cargo.toml index f082d00f6f0c3..b90fc7ff61ee7 100644 --- a/ql/extractor/Cargo.toml +++ b/ql/extractor/Cargo.toml @@ -16,5 +16,5 @@ clap = { version = "4.2", features = ["derive"] } tracing = "0.1" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } rayon = "1.7.0" -regex = "1.9.3" +regex = "1.9.5" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index d0990b630637f..03fc2566fe5f5 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -558,9 +558,7 @@ import Cached /** Holds if `n` should be hidden from path explanations. */ predicate nodeIsHidden(Node n) { - exists(SsaImpl::DefinitionExt def | def = n.(SsaDefinitionExtNode).getDefinitionExt() | - not def instanceof Ssa::WriteDefinition - ) + n.(SsaDefinitionExtNode).isHidden() or n = LocalFlow::getParameterDefNode(_) or @@ -593,6 +591,13 @@ class SsaDefinitionExtNode extends NodeImpl, TSsaDefinitionExtNode { /** Gets the underlying variable. */ Variable getVariable() { result = def.getSourceVariable() } + /** Holds if this node should be hidden from path explanations. */ + predicate isHidden() { + not def instanceof Ssa::WriteDefinition + or + isDesugarNode(def.(Ssa::WriteDefinition).getWriteAccess().getExpr()) + } + override CfgScope getCfgScope() { result = def.getBasicBlock().getScope() } override Location getLocationImpl() { result = def.getLocation() } @@ -1593,7 +1598,11 @@ class CastNode extends Node { */ predicate neverSkipInPathGraph(Node n) { // ensure that all variable assignments are included in the path graph - n.(SsaDefinitionExtNode).getDefinitionExt() instanceof Ssa::WriteDefinition + n = + any(SsaDefinitionExtNode def | + def.getDefinitionExt() instanceof Ssa::WriteDefinition and + not def.isHidden() + ) } class DataFlowExpr = CfgNodes::ExprCfgNode; diff --git a/ruby/ql/src/experimental/cwe-208/UnsafeHmacComparison.ql b/ruby/ql/src/experimental/cwe-208/UnsafeHmacComparison.ql new file mode 100644 index 0000000000000..65907b0f88592 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-208/UnsafeHmacComparison.ql @@ -0,0 +1,45 @@ +/** + * @name Unsafe HMAC Comparison + * @description An HMAC is being compared using the equality operator. This may be vulnerable to a cryptographic timing attack + * because the equality operation does not occur in constant time." + * @kind path-problem + * @problem.severity error + * @security-severity 6.0 + * @precision high + * @id rb/unsafe-hmac-comparison + * @tags security + * external/cwe/cwe-208 + */ + +private import codeql.ruby.AST +private import codeql.ruby.DataFlow +private import codeql.ruby.ApiGraphs + +private class OpenSslHmacSource extends DataFlow::Node { + OpenSslHmacSource() { + exists(API::Node hmacNode | hmacNode = API::getTopLevelMember("OpenSSL").getMember("HMAC") | + this = hmacNode.getAMethodCall(["hexdigest", "to_s", "digest", "base64digest"]) + or + this = hmacNode.getAnInstantiation() + ) + } +} + +private module UnsafeHmacComparison { + private module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof OpenSslHmacSource } + + // Holds if a given sink is an Equality Operation (== or !=) + predicate isSink(DataFlow::Node sink) { + any(EqualityOperation eqOp).getAnOperand() = sink.asExpr().getExpr() + } + } + + import DataFlow::Global +} + +private import UnsafeHmacComparison::PathGraph + +from UnsafeHmacComparison::PathNode source, UnsafeHmacComparison::PathNode sink +where UnsafeHmacComparison::flowPath(source, sink) +select sink.getNode(), source, sink, "This comparison is potentially vulnerable to a timing attack." diff --git a/ruby/ql/src/experimental/cwe-208/UnsafeHmacComparison.qlhelp b/ruby/ql/src/experimental/cwe-208/UnsafeHmacComparison.qlhelp new file mode 100644 index 0000000000000..5c589466cc183 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-208/UnsafeHmacComparison.qlhelp @@ -0,0 +1,21 @@ + + + +

+ Using the `==` or `!=` operator to compare a known valid HMAC with a user-supplied HMAC digest could lead to a timing attack, as these operations do not occur in constant time. +

+
+ +

+ Instead of using `==` or `!=` to compare a known valid HMAC with a user-supplied HMAC digest use Rack::Utils#secure_compare, ActiveSupport::SecurityUtils#secure_compare or OpenSSL.secure_compare +

+
+ +

+ In this example, the HMAC is validated using the `==` operation. +

+ +
+
diff --git a/ruby/ql/src/experimental/cwe-208/examples/unsafe_hmac_comparison.rb b/ruby/ql/src/experimental/cwe-208/examples/unsafe_hmac_comparison.rb new file mode 100644 index 0000000000000..b3b07012a3727 --- /dev/null +++ b/ruby/ql/src/experimental/cwe-208/examples/unsafe_hmac_comparison.rb @@ -0,0 +1,11 @@ +class UnsafeHmacComparison + def verify_hmac(host, hmac, salt) + sha1 = OpenSSL::Digest.new('sha1') + if OpenSSL::HMAC.digest(sha1, salt, host) == hmac + puts "HMAC verified" + else + puts "HMAC not verified" + end + end + end + \ No newline at end of file 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 cc720fde1f8d7..c52399b3914af 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,8756 +1,4361 @@ testFailures edges | array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:3:10:3:10 | a [element 0] | -| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:3:10:3:10 | a [element 0] | -| array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:5:10:5:10 | a [element 0] | | array_flow.rb:2:5:2:5 | a [element 0] | array_flow.rb:5:10:5:10 | a [element 0] | | array_flow.rb:2:9:2:20 | * ... [element 0] | array_flow.rb:2:5:2:5 | a [element 0] | -| array_flow.rb:2:9:2:20 | * ... [element 0] | array_flow.rb:2:5:2:5 | a [element 0] | | array_flow.rb:2:10:2:20 | call to source | array_flow.rb:2:9:2:20 | * ... [element 0] | -| array_flow.rb:2:10:2:20 | call to source | array_flow.rb:2:9:2:20 | * ... [element 0] | -| array_flow.rb:3:10:3:10 | a [element 0] | array_flow.rb:3:10:3:13 | ...[...] | | array_flow.rb:3:10:3:10 | a [element 0] | array_flow.rb:3:10:3:13 | ...[...] | | array_flow.rb:5:10:5:10 | a [element 0] | array_flow.rb:5:10:5:13 | ...[...] | -| array_flow.rb:5:10:5:10 | a [element 0] | array_flow.rb:5:10:5:13 | ...[...] | -| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:11:10:11:10 | a [element 1] | | array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:11:10:11:10 | a [element 1] | | array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:13:10:13:10 | a [element 1] | -| array_flow.rb:9:5:9:5 | a [element 1] | array_flow.rb:13:10:13:10 | a [element 1] | -| array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:5:9:5 | a [element 1] | | array_flow.rb:9:13:9:21 | call to source | array_flow.rb:9:5:9:5 | a [element 1] | | array_flow.rb:11:10:11:10 | a [element 1] | array_flow.rb:11:10:11:13 | ...[...] | -| array_flow.rb:11:10:11:10 | a [element 1] | array_flow.rb:11:10:11:13 | ...[...] | -| array_flow.rb:13:10:13:10 | a [element 1] | array_flow.rb:13:10:13:13 | ...[...] | | array_flow.rb:13:10:13:10 | a [element 1] | array_flow.rb:13:10:13:13 | ...[...] | | array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:18:10:18:10 | a [element] | -| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:18:10:18:10 | a [element] | -| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:19:10:19:10 | a [element] | | array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:19:10:19:10 | a [element] | | array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:21:19:21:19 | a [element] | -| array_flow.rb:17:5:17:5 | a [element] | array_flow.rb:21:19:21:19 | a [element] | -| array_flow.rb:17:9:17:33 | call to new [element] | array_flow.rb:17:5:17:5 | a [element] | | array_flow.rb:17:9:17:33 | call to new [element] | array_flow.rb:17:5:17:5 | a [element] | | array_flow.rb:17:22:17:32 | call to source | array_flow.rb:17:9:17:33 | call to new [element] | -| array_flow.rb:17:22:17:32 | call to source | array_flow.rb:17:9:17:33 | call to new [element] | -| array_flow.rb:18:10:18:10 | a [element] | array_flow.rb:18:10:18:13 | ...[...] | | array_flow.rb:18:10:18:10 | a [element] | array_flow.rb:18:10:18:13 | ...[...] | | array_flow.rb:19:10:19:10 | a [element] | array_flow.rb:19:10:19:13 | ...[...] | -| array_flow.rb:19:10:19:10 | a [element] | array_flow.rb:19:10:19:13 | ...[...] | -| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:22:10:22:10 | b [element] | | array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:22:10:22:10 | b [element] | | array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:23:10:23:10 | b [element] | -| array_flow.rb:21:5:21:5 | b [element] | array_flow.rb:23:10:23:10 | b [element] | -| array_flow.rb:21:9:21:20 | call to new [element] | array_flow.rb:21:5:21:5 | b [element] | | array_flow.rb:21:9:21:20 | call to new [element] | array_flow.rb:21:5:21:5 | b [element] | | array_flow.rb:21:19:21:19 | a [element] | array_flow.rb:21:9:21:20 | call to new [element] | -| array_flow.rb:21:19:21:19 | a [element] | array_flow.rb:21:9:21:20 | call to new [element] | -| array_flow.rb:22:10:22:10 | b [element] | array_flow.rb:22:10:22:13 | ...[...] | | array_flow.rb:22:10:22:10 | b [element] | array_flow.rb:22:10:22:13 | ...[...] | | array_flow.rb:23:10:23:10 | b [element] | array_flow.rb:23:10:23:13 | ...[...] | -| array_flow.rb:23:10:23:10 | b [element] | array_flow.rb:23:10:23:13 | ...[...] | -| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:28:10:28:10 | c [element] | | array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:28:10:28:10 | c [element] | | array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:29:10:29:10 | c [element] | -| array_flow.rb:25:5:25:5 | c [element] | array_flow.rb:29:10:29:10 | c [element] | -| array_flow.rb:25:9:27:7 | call to new [element] | array_flow.rb:25:5:25:5 | c [element] | | array_flow.rb:25:9:27:7 | call to new [element] | array_flow.rb:25:5:25:5 | c [element] | | array_flow.rb:26:9:26:19 | call to source | array_flow.rb:25:9:27:7 | call to new [element] | -| array_flow.rb:26:9:26:19 | call to source | array_flow.rb:25:9:27:7 | call to new [element] | -| array_flow.rb:28:10:28:10 | c [element] | array_flow.rb:28:10:28:13 | ...[...] | | array_flow.rb:28:10:28:10 | c [element] | array_flow.rb:28:10:28:13 | ...[...] | | array_flow.rb:29:10:29:10 | c [element] | array_flow.rb:29:10:29:13 | ...[...] | -| array_flow.rb:29:10:29:10 | c [element] | array_flow.rb:29:10:29:13 | ...[...] | -| array_flow.rb:33:5:33:5 | a [element 0] | array_flow.rb:34:27:34:27 | a [element 0] | | array_flow.rb:33:5:33:5 | a [element 0] | array_flow.rb:34:27:34:27 | a [element 0] | | array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:5:33:5 | a [element 0] | -| array_flow.rb:33:10:33:18 | call to source | array_flow.rb:33:5:33:5 | a [element 0] | -| array_flow.rb:34:5:34:5 | b [element 0] | array_flow.rb:35:10:35:10 | b [element 0] | | array_flow.rb:34:5:34:5 | b [element 0] | array_flow.rb:35:10:35:10 | b [element 0] | | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | array_flow.rb:34:5:34:5 | b [element 0] | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | array_flow.rb:34:5:34:5 | b [element 0] | -| array_flow.rb:34:27:34:27 | a [element 0] | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | | array_flow.rb:34:27:34:27 | a [element 0] | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | | array_flow.rb:35:10:35:10 | b [element 0] | array_flow.rb:35:10:35:13 | ...[...] | -| array_flow.rb:35:10:35:10 | b [element 0] | array_flow.rb:35:10:35:13 | ...[...] | -| array_flow.rb:40:5:40:5 | a [element 0] | array_flow.rb:42:9:42:9 | a [element 0] | | array_flow.rb:40:5:40:5 | a [element 0] | array_flow.rb:42:9:42:9 | a [element 0] | | array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:5:40:5 | a [element 0] | -| array_flow.rb:40:10:40:20 | call to source | array_flow.rb:40:5:40:5 | a [element 0] | -| array_flow.rb:41:5:41:5 | b [element 2] | array_flow.rb:42:13:42:13 | b [element 2] | | array_flow.rb:41:5:41:5 | b [element 2] | array_flow.rb:42:13:42:13 | b [element 2] | | array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:5:41:5 | b [element 2] | -| array_flow.rb:41:16:41:26 | call to source | array_flow.rb:41:5:41:5 | b [element 2] | -| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:43:10:43:10 | c [element] | | array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:43:10:43:10 | c [element] | | array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:44:10:44:10 | c [element] | -| array_flow.rb:42:5:42:5 | c [element] | array_flow.rb:44:10:44:10 | c [element] | -| array_flow.rb:42:9:42:9 | a [element 0] | array_flow.rb:42:9:42:13 | ... & ... [element] | | array_flow.rb:42:9:42:9 | a [element 0] | array_flow.rb:42:9:42:13 | ... & ... [element] | | array_flow.rb:42:9:42:13 | ... & ... [element] | array_flow.rb:42:5:42:5 | c [element] | -| array_flow.rb:42:9:42:13 | ... & ... [element] | array_flow.rb:42:5:42:5 | c [element] | -| array_flow.rb:42:13:42:13 | b [element 2] | array_flow.rb:42:9:42:13 | ... & ... [element] | | array_flow.rb:42:13:42:13 | b [element 2] | array_flow.rb:42:9:42:13 | ... & ... [element] | | array_flow.rb:43:10:43:10 | c [element] | array_flow.rb:43:10:43:13 | ...[...] | -| array_flow.rb:43:10:43:10 | c [element] | array_flow.rb:43:10:43:13 | ...[...] | -| array_flow.rb:44:10:44:10 | c [element] | array_flow.rb:44:10:44:13 | ...[...] | | array_flow.rb:44:10:44:10 | c [element] | array_flow.rb:44:10:44:13 | ...[...] | | array_flow.rb:48:5:48:5 | a [element 0] | array_flow.rb:49:9:49:9 | a [element 0] | -| array_flow.rb:48:5:48:5 | a [element 0] | array_flow.rb:49:9:49:9 | a [element 0] | -| array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:5:48:5 | a [element 0] | | array_flow.rb:48:10:48:18 | call to source | array_flow.rb:48:5:48:5 | a [element 0] | | array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:50:10:50:10 | b [element] | -| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:50:10:50:10 | b [element] | -| array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:51:10:51:10 | b [element] | | array_flow.rb:49:5:49:5 | b [element] | array_flow.rb:51:10:51:10 | b [element] | | array_flow.rb:49:9:49:9 | a [element 0] | array_flow.rb:49:9:49:13 | ... * ... [element] | -| array_flow.rb:49:9:49:9 | a [element 0] | array_flow.rb:49:9:49:13 | ... * ... [element] | -| array_flow.rb:49:9:49:13 | ... * ... [element] | array_flow.rb:49:5:49:5 | b [element] | | array_flow.rb:49:9:49:13 | ... * ... [element] | array_flow.rb:49:5:49:5 | b [element] | | array_flow.rb:50:10:50:10 | b [element] | array_flow.rb:50:10:50:13 | ...[...] | -| array_flow.rb:50:10:50:10 | b [element] | array_flow.rb:50:10:50:13 | ...[...] | -| array_flow.rb:51:10:51:10 | b [element] | array_flow.rb:51:10:51:13 | ...[...] | | array_flow.rb:51:10:51:10 | b [element] | array_flow.rb:51:10:51:13 | ...[...] | | array_flow.rb:55:5:55:5 | a [element 0] | array_flow.rb:57:9:57:9 | a [element 0] | -| array_flow.rb:55:5:55:5 | a [element 0] | array_flow.rb:57:9:57:9 | a [element 0] | -| array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:5:55:5 | a [element 0] | | array_flow.rb:55:10:55:20 | call to source | array_flow.rb:55:5:55:5 | a [element 0] | | array_flow.rb:56:5:56:5 | b [element 1] | array_flow.rb:57:13:57:13 | b [element 1] | -| array_flow.rb:56:5:56:5 | b [element 1] | array_flow.rb:57:13:57:13 | b [element 1] | -| array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:5:56:5 | b [element 1] | | array_flow.rb:56:13:56:23 | call to source | array_flow.rb:56:5:56:5 | b [element 1] | | array_flow.rb:57:5:57:5 | c [element 0] | array_flow.rb:58:10:58:10 | c [element 0] | -| array_flow.rb:57:5:57:5 | c [element 0] | array_flow.rb:58:10:58:10 | c [element 0] | -| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:58:10:58:10 | c [element] | | array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:58:10:58:10 | c [element] | | array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:59:10:59:10 | c [element] | -| array_flow.rb:57:5:57:5 | c [element] | array_flow.rb:59:10:59:10 | c [element] | -| array_flow.rb:57:9:57:9 | a [element 0] | array_flow.rb:57:9:57:13 | ... + ... [element 0] | | array_flow.rb:57:9:57:9 | a [element 0] | array_flow.rb:57:9:57:13 | ... + ... [element 0] | | array_flow.rb:57:9:57:13 | ... + ... [element 0] | array_flow.rb:57:5:57:5 | c [element 0] | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] | array_flow.rb:57:5:57:5 | c [element 0] | -| array_flow.rb:57:9:57:13 | ... + ... [element] | array_flow.rb:57:5:57:5 | c [element] | | array_flow.rb:57:9:57:13 | ... + ... [element] | array_flow.rb:57:5:57:5 | c [element] | | array_flow.rb:57:13:57:13 | b [element 1] | array_flow.rb:57:9:57:13 | ... + ... [element] | -| array_flow.rb:57:13:57:13 | b [element 1] | array_flow.rb:57:9:57:13 | ... + ... [element] | -| array_flow.rb:58:10:58:10 | c [element 0] | array_flow.rb:58:10:58:13 | ...[...] | | array_flow.rb:58:10:58:10 | c [element 0] | array_flow.rb:58:10:58:13 | ...[...] | | array_flow.rb:58:10:58:10 | c [element] | array_flow.rb:58:10:58:13 | ...[...] | -| array_flow.rb:58:10:58:10 | c [element] | array_flow.rb:58:10:58:13 | ...[...] | | array_flow.rb:59:10:59:10 | c [element] | array_flow.rb:59:10:59:13 | ...[...] | -| array_flow.rb:59:10:59:10 | c [element] | array_flow.rb:59:10:59:13 | ...[...] | -| array_flow.rb:63:5:63:5 | a [element 0] | array_flow.rb:65:9:65:9 | a [element 0] | | array_flow.rb:63:5:63:5 | a [element 0] | array_flow.rb:65:9:65:9 | a [element 0] | | array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:5:63:5 | a [element 0] | -| array_flow.rb:63:10:63:20 | call to source | array_flow.rb:63:5:63:5 | a [element 0] | -| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:66:10:66:10 | c [element] | | array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:66:10:66:10 | c [element] | | array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:67:10:67:10 | c [element] | -| array_flow.rb:65:5:65:5 | c [element] | array_flow.rb:67:10:67:10 | c [element] | -| array_flow.rb:65:9:65:9 | a [element 0] | array_flow.rb:65:9:65:13 | ... - ... [element] | | array_flow.rb:65:9:65:9 | a [element 0] | array_flow.rb:65:9:65:13 | ... - ... [element] | | array_flow.rb:65:9:65:13 | ... - ... [element] | array_flow.rb:65:5:65:5 | c [element] | -| array_flow.rb:65:9:65:13 | ... - ... [element] | array_flow.rb:65:5:65:5 | c [element] | -| array_flow.rb:66:10:66:10 | c [element] | array_flow.rb:66:10:66:13 | ...[...] | | array_flow.rb:66:10:66:10 | c [element] | array_flow.rb:66:10:66:13 | ...[...] | | array_flow.rb:67:10:67:10 | c [element] | array_flow.rb:67:10:67:13 | ...[...] | -| array_flow.rb:67:10:67:10 | c [element] | array_flow.rb:67:10:67:13 | ...[...] | -| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:72:9:72:9 | a [element 0] | | array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:72:9:72:9 | a [element 0] | | array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:73:10:73:10 | a [element 0] | -| array_flow.rb:71:5:71:5 | a [element 0] | array_flow.rb:73:10:73:10 | a [element 0] | -| array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:5:71:5 | a [element 0] | | array_flow.rb:71:10:71:20 | call to source | array_flow.rb:71:5:71:5 | a [element 0] | -| array_flow.rb:72:5:72:5 | b | array_flow.rb:75:10:75:10 | b | -| array_flow.rb:72:5:72:5 | b | array_flow.rb:76:10:76:10 | b | | array_flow.rb:72:5:72:5 | b [element 0] | array_flow.rb:75:10:75:10 | b [element 0] | -| array_flow.rb:72:5:72:5 | b [element 0] | array_flow.rb:75:10:75:10 | b [element 0] | -| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:75:10:75:10 | b [element] | | array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:75:10:75:10 | b [element] | | array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:76:10:76:10 | b [element] | -| array_flow.rb:72:5:72:5 | b [element] | array_flow.rb:76:10:76:10 | b [element] | -| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:73:10:73:10 | a [element] | | array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:73:10:73:10 | a [element] | | array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:74:10:74:10 | a [element] | -| array_flow.rb:72:9:72:9 | [post] a [element] | array_flow.rb:74:10:74:10 | a [element] | -| array_flow.rb:72:9:72:9 | a [element 0] | array_flow.rb:72:9:72:24 | ... << ... [element 0] | | array_flow.rb:72:9:72:9 | a [element 0] | array_flow.rb:72:9:72:24 | ... << ... [element 0] | | array_flow.rb:72:9:72:24 | ... << ... [element 0] | array_flow.rb:72:5:72:5 | b [element 0] | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] | array_flow.rb:72:5:72:5 | b [element 0] | -| array_flow.rb:72:9:72:24 | ... << ... [element] | array_flow.rb:72:5:72:5 | b [element] | | array_flow.rb:72:9:72:24 | ... << ... [element] | array_flow.rb:72:5:72:5 | b [element] | -| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:5:72:5 | b | | array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:9 | [post] a [element] | -| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:9 | [post] a [element] | -| array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:24 | ... << ... [element] | | array_flow.rb:72:14:72:24 | call to source | array_flow.rb:72:9:72:24 | ... << ... [element] | | array_flow.rb:73:10:73:10 | a [element 0] | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:73:10:73:10 | a [element 0] | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:73:10:73:10 | a [element] | array_flow.rb:73:10:73:13 | ...[...] | | array_flow.rb:73:10:73:10 | a [element] | array_flow.rb:73:10:73:13 | ...[...] | | array_flow.rb:74:10:74:10 | a [element] | array_flow.rb:74:10:74:13 | ...[...] | -| array_flow.rb:74:10:74:10 | a [element] | array_flow.rb:74:10:74:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b [element 0] | array_flow.rb:75:10:75:13 | ...[...] | | array_flow.rb:75:10:75:10 | b [element 0] | array_flow.rb:75:10:75:13 | ...[...] | | array_flow.rb:75:10:75:10 | b [element] | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:75:10:75:10 | b [element] | array_flow.rb:75:10:75:13 | ...[...] | -| array_flow.rb:76:10:76:10 | b | array_flow.rb:76:10:76:13 | ...[...] | -| array_flow.rb:76:10:76:10 | b [element] | array_flow.rb:76:10:76:13 | ...[...] | | array_flow.rb:76:10:76:10 | b [element] | array_flow.rb:76:10:76:13 | ...[...] | | array_flow.rb:80:5:80:5 | a [element 1] | array_flow.rb:81:15:81:15 | a [element 1] | -| array_flow.rb:80:5:80:5 | a [element 1] | array_flow.rb:81:15:81:15 | a [element 1] | -| array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:5:80:5 | a [element 1] | | array_flow.rb:80:13:80:21 | call to source | array_flow.rb:80:5:80:5 | a [element 1] | | array_flow.rb:81:8:81:8 | c | array_flow.rb:83:10:83:10 | c | -| array_flow.rb:81:8:81:8 | c | array_flow.rb:83:10:83:10 | c | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | array_flow.rb:81:8:81:8 | c | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | array_flow.rb:81:8:81:8 | c | -| array_flow.rb:81:15:81:15 | a [element 1] | array_flow.rb:81:15:81:15 | __synth__3 [element 1] | -| array_flow.rb:81:15:81:15 | a [element 1] | array_flow.rb:81:15:81:15 | __synth__3 [element 1] | -| array_flow.rb:88:5:88:5 | a [element 1] | array_flow.rb:89:9:89:9 | a [element 1] | +| array_flow.rb:81:15:81:15 | a [element 1] | array_flow.rb:81:8:81:8 | c | | array_flow.rb:88:5:88:5 | a [element 1] | array_flow.rb:89:9:89:9 | a [element 1] | | array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:5:88:5 | a [element 1] | -| array_flow.rb:88:13:88:22 | call to source | array_flow.rb:88:5:88:5 | a [element 1] | -| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:91:10:91:10 | b [element 1] | | array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:91:10:91:10 | b [element 1] | | array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:92:10:92:10 | b [element 1] | -| array_flow.rb:89:5:89:5 | b [element 1] | array_flow.rb:92:10:92:10 | b [element 1] | -| array_flow.rb:89:9:89:9 | a [element 1] | array_flow.rb:89:9:89:15 | ...[...] [element 1] | | array_flow.rb:89:9:89:9 | a [element 1] | array_flow.rb:89:9:89:15 | ...[...] [element 1] | | array_flow.rb:89:9:89:15 | ...[...] [element 1] | array_flow.rb:89:5:89:5 | b [element 1] | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] | array_flow.rb:89:5:89:5 | b [element 1] | -| array_flow.rb:91:10:91:10 | b [element 1] | array_flow.rb:91:10:91:13 | ...[...] | | array_flow.rb:91:10:91:10 | b [element 1] | array_flow.rb:91:10:91:13 | ...[...] | | array_flow.rb:92:10:92:10 | b [element 1] | array_flow.rb:92:10:92:13 | ...[...] | -| array_flow.rb:92:10:92:10 | b [element 1] | array_flow.rb:92:10:92:13 | ...[...] | -| array_flow.rb:96:5:96:5 | a [element 1] | array_flow.rb:97:9:97:9 | a [element 1] | | array_flow.rb:96:5:96:5 | a [element 1] | array_flow.rb:97:9:97:9 | a [element 1] | | array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:5:96:5 | a [element 1] | -| array_flow.rb:96:13:96:22 | call to source | array_flow.rb:96:5:96:5 | a [element 1] | -| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:99:10:99:10 | b [element 1] | | array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:99:10:99:10 | b [element 1] | | array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:101:10:101:10 | b [element 1] | -| array_flow.rb:97:5:97:5 | b [element 1] | array_flow.rb:101:10:101:10 | b [element 1] | -| array_flow.rb:97:9:97:9 | a [element 1] | array_flow.rb:97:9:97:15 | ...[...] [element 1] | | array_flow.rb:97:9:97:9 | a [element 1] | array_flow.rb:97:9:97:15 | ...[...] [element 1] | | array_flow.rb:97:9:97:15 | ...[...] [element 1] | array_flow.rb:97:5:97:5 | b [element 1] | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] | array_flow.rb:97:5:97:5 | b [element 1] | -| array_flow.rb:99:10:99:10 | b [element 1] | array_flow.rb:99:10:99:13 | ...[...] | | array_flow.rb:99:10:99:10 | b [element 1] | array_flow.rb:99:10:99:13 | ...[...] | | array_flow.rb:101:10:101:10 | b [element 1] | array_flow.rb:101:10:101:13 | ...[...] | -| array_flow.rb:101:10:101:10 | b [element 1] | array_flow.rb:101:10:101:13 | ...[...] | -| array_flow.rb:103:5:103:5 | a [element 1] | array_flow.rb:104:9:104:9 | a [element 1] | | array_flow.rb:103:5:103:5 | a [element 1] | array_flow.rb:104:9:104:9 | a [element 1] | | array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:5:103:5 | a [element 1] | -| array_flow.rb:103:13:103:24 | call to source | array_flow.rb:103:5:103:5 | a [element 1] | -| array_flow.rb:104:5:104:5 | b [element 1] | array_flow.rb:106:10:106:10 | b [element 1] | | array_flow.rb:104:5:104:5 | b [element 1] | array_flow.rb:106:10:106:10 | b [element 1] | | array_flow.rb:104:9:104:9 | a [element 1] | array_flow.rb:104:9:104:16 | ...[...] [element 1] | -| array_flow.rb:104:9:104:9 | a [element 1] | array_flow.rb:104:9:104:16 | ...[...] [element 1] | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] | array_flow.rb:104:5:104:5 | b [element 1] | | array_flow.rb:104:9:104:16 | ...[...] [element 1] | array_flow.rb:104:5:104:5 | b [element 1] | | array_flow.rb:106:10:106:10 | b [element 1] | array_flow.rb:106:10:106:13 | ...[...] | -| array_flow.rb:106:10:106:10 | b [element 1] | array_flow.rb:106:10:106:13 | ...[...] | -| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:110:9:110:9 | a [element 1] | | array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:110:9:110:9 | a [element 1] | | array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:114:9:114:9 | a [element 1] | -| array_flow.rb:109:5:109:5 | a [element 1] | array_flow.rb:114:9:114:9 | a [element 1] | -| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:110:9:110:9 | a [element 3] | | array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:110:9:110:9 | a [element 3] | | array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:114:9:114:9 | a [element 3] | -| array_flow.rb:109:5:109:5 | a [element 3] | array_flow.rb:114:9:114:9 | a [element 3] | -| array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:5:109:5 | a [element 1] | | array_flow.rb:109:13:109:24 | call to source | array_flow.rb:109:5:109:5 | a [element 1] | | array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:5:109:5 | a [element 3] | -| array_flow.rb:109:30:109:41 | call to source | array_flow.rb:109:5:109:5 | a [element 3] | -| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:111:10:111:10 | b [element] | | array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:111:10:111:10 | b [element] | | array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:112:10:112:10 | b [element] | -| array_flow.rb:110:5:110:5 | b [element] | array_flow.rb:112:10:112:10 | b [element] | -| array_flow.rb:110:9:110:9 | a [element 1] | array_flow.rb:110:9:110:18 | ...[...] [element] | | array_flow.rb:110:9:110:9 | a [element 1] | array_flow.rb:110:9:110:18 | ...[...] [element] | | array_flow.rb:110:9:110:9 | a [element 3] | array_flow.rb:110:9:110:18 | ...[...] [element] | -| array_flow.rb:110:9:110:9 | a [element 3] | array_flow.rb:110:9:110:18 | ...[...] [element] | -| array_flow.rb:110:9:110:18 | ...[...] [element] | array_flow.rb:110:5:110:5 | b [element] | | array_flow.rb:110:9:110:18 | ...[...] [element] | array_flow.rb:110:5:110:5 | b [element] | | array_flow.rb:111:10:111:10 | b [element] | array_flow.rb:111:10:111:13 | ...[...] | -| array_flow.rb:111:10:111:10 | b [element] | array_flow.rb:111:10:111:13 | ...[...] | | array_flow.rb:112:10:112:10 | b [element] | array_flow.rb:112:10:112:13 | ...[...] | -| array_flow.rb:112:10:112:10 | b [element] | array_flow.rb:112:10:112:13 | ...[...] | -| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:115:10:115:10 | b [element] | | array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:115:10:115:10 | b [element] | | array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:116:10:116:10 | b [element] | -| array_flow.rb:114:5:114:5 | b [element] | array_flow.rb:116:10:116:10 | b [element] | -| array_flow.rb:114:9:114:9 | a [element 1] | array_flow.rb:114:9:114:19 | ...[...] [element] | | array_flow.rb:114:9:114:9 | a [element 1] | array_flow.rb:114:9:114:19 | ...[...] [element] | | array_flow.rb:114:9:114:9 | a [element 3] | array_flow.rb:114:9:114:19 | ...[...] [element] | -| array_flow.rb:114:9:114:9 | a [element 3] | array_flow.rb:114:9:114:19 | ...[...] [element] | -| array_flow.rb:114:9:114:19 | ...[...] [element] | array_flow.rb:114:5:114:5 | b [element] | | array_flow.rb:114:9:114:19 | ...[...] [element] | array_flow.rb:114:5:114:5 | b [element] | | array_flow.rb:115:10:115:10 | b [element] | array_flow.rb:115:10:115:13 | ...[...] | -| array_flow.rb:115:10:115:10 | b [element] | array_flow.rb:115:10:115:13 | ...[...] | -| array_flow.rb:116:10:116:10 | b [element] | array_flow.rb:116:10:116:13 | ...[...] | | array_flow.rb:116:10:116:10 | b [element] | array_flow.rb:116:10:116:13 | ...[...] | | array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:122:10:122:10 | a [element] | -| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:122:10:122:10 | a [element] | -| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:123:10:123:10 | a [element] | | array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:123:10:123:10 | a [element] | | array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:124:10:124:10 | a [element] | -| array_flow.rb:121:5:121:5 | [post] a [element] | array_flow.rb:124:10:124:10 | a [element] | -| array_flow.rb:121:15:121:24 | call to source | array_flow.rb:121:5:121:5 | [post] a [element] | | array_flow.rb:121:15:121:24 | call to source | array_flow.rb:121:5:121:5 | [post] a [element] | | array_flow.rb:122:10:122:10 | a [element] | array_flow.rb:122:10:122:13 | ...[...] | -| array_flow.rb:122:10:122:10 | a [element] | array_flow.rb:122:10:122:13 | ...[...] | -| array_flow.rb:123:10:123:10 | a [element] | array_flow.rb:123:10:123:13 | ...[...] | | array_flow.rb:123:10:123:10 | a [element] | array_flow.rb:123:10:123:13 | ...[...] | | array_flow.rb:124:10:124:10 | a [element] | array_flow.rb:124:10:124:13 | ...[...] | -| array_flow.rb:124:10:124:10 | a [element] | array_flow.rb:124:10:124:13 | ...[...] | -| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:130:10:130:10 | a [element] | | array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:130:10:130:10 | a [element] | | array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:131:10:131:10 | a [element] | -| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:131:10:131:10 | a [element] | -| array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:132:10:132:10 | a [element] | | array_flow.rb:129:5:129:5 | [post] a [element] | array_flow.rb:132:10:132:10 | a [element] | | array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:5:129:5 | [post] a [element] | -| array_flow.rb:129:19:129:28 | call to source | array_flow.rb:129:5:129:5 | [post] a [element] | -| array_flow.rb:130:10:130:10 | a [element] | array_flow.rb:130:10:130:13 | ...[...] | | array_flow.rb:130:10:130:10 | a [element] | array_flow.rb:130:10:130:13 | ...[...] | | array_flow.rb:131:10:131:10 | a [element] | array_flow.rb:131:10:131:13 | ...[...] | -| array_flow.rb:131:10:131:10 | a [element] | array_flow.rb:131:10:131:13 | ...[...] | -| array_flow.rb:132:10:132:10 | a [element] | array_flow.rb:132:10:132:13 | ...[...] | | array_flow.rb:132:10:132:10 | a [element] | array_flow.rb:132:10:132:13 | ...[...] | | array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:138:10:138:10 | a [element] | -| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:138:10:138:10 | a [element] | -| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:139:10:139:10 | a [element] | | array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:139:10:139:10 | a [element] | | array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:140:10:140:10 | a [element] | -| array_flow.rb:137:5:137:5 | [post] a [element] | array_flow.rb:140:10:140:10 | a [element] | -| array_flow.rb:137:15:137:24 | call to source | array_flow.rb:137:5:137:5 | [post] a [element] | | array_flow.rb:137:15:137:24 | call to source | array_flow.rb:137:5:137:5 | [post] a [element] | | array_flow.rb:138:10:138:10 | a [element] | array_flow.rb:138:10:138:13 | ...[...] | -| array_flow.rb:138:10:138:10 | a [element] | array_flow.rb:138:10:138:13 | ...[...] | -| array_flow.rb:139:10:139:10 | a [element] | array_flow.rb:139:10:139:13 | ...[...] | | array_flow.rb:139:10:139:10 | a [element] | array_flow.rb:139:10:139:13 | ...[...] | | array_flow.rb:140:10:140:10 | a [element] | array_flow.rb:140:10:140:13 | ...[...] | -| array_flow.rb:140:10:140:10 | a [element] | array_flow.rb:140:10:140:13 | ...[...] | -| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:146:10:146:10 | a [element] | | array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:146:10:146:10 | a [element] | | array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:147:10:147:10 | a [element] | -| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:147:10:147:10 | a [element] | -| array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:148:10:148:10 | a [element] | | array_flow.rb:145:5:145:5 | [post] a [element] | array_flow.rb:148:10:148:10 | a [element] | | array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:5:145:5 | [post] a [element] | -| array_flow.rb:145:19:145:28 | call to source | array_flow.rb:145:5:145:5 | [post] a [element] | -| array_flow.rb:146:10:146:10 | a [element] | array_flow.rb:146:10:146:13 | ...[...] | | array_flow.rb:146:10:146:10 | a [element] | array_flow.rb:146:10:146:13 | ...[...] | | array_flow.rb:147:10:147:10 | a [element] | array_flow.rb:147:10:147:13 | ...[...] | -| array_flow.rb:147:10:147:10 | a [element] | array_flow.rb:147:10:147:13 | ...[...] | -| array_flow.rb:148:10:148:10 | a [element] | array_flow.rb:148:10:148:13 | ...[...] | | array_flow.rb:148:10:148:10 | a [element] | array_flow.rb:148:10:148:13 | ...[...] | | array_flow.rb:152:5:152:5 | a [element 2] | array_flow.rb:153:5:153:5 | a [element 2] | -| array_flow.rb:152:5:152:5 | a [element 2] | array_flow.rb:153:5:153:5 | a [element 2] | -| array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:5:152:5 | a [element 2] | | array_flow.rb:152:16:152:25 | call to source | array_flow.rb:152:5:152:5 | a [element 2] | | array_flow.rb:153:5:153:5 | a [element 2] | array_flow.rb:153:16:153:16 | x | -| array_flow.rb:153:5:153:5 | a [element 2] | array_flow.rb:153:16:153:16 | x | -| array_flow.rb:153:16:153:16 | x | array_flow.rb:154:14:154:14 | x | | array_flow.rb:153:16:153:16 | x | array_flow.rb:154:14:154:14 | x | | array_flow.rb:159:5:159:5 | a [element 2] | array_flow.rb:160:5:160:5 | a [element 2] | -| array_flow.rb:159:5:159:5 | a [element 2] | array_flow.rb:160:5:160:5 | a [element 2] | -| array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:5:159:5 | a [element 2] | | array_flow.rb:159:16:159:25 | call to source | array_flow.rb:159:5:159:5 | a [element 2] | | array_flow.rb:160:5:160:5 | a [element 2] | array_flow.rb:160:16:160:16 | x | -| array_flow.rb:160:5:160:5 | a [element 2] | array_flow.rb:160:16:160:16 | x | -| array_flow.rb:160:16:160:16 | x | array_flow.rb:161:14:161:14 | x | | array_flow.rb:160:16:160:16 | x | array_flow.rb:161:14:161:14 | x | | array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:167:9:167:9 | a [element 0] | -| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:167:9:167:9 | a [element 0] | -| array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:168:10:168:10 | a [element 0] | | array_flow.rb:166:5:166:5 | a [element 0] | array_flow.rb:168:10:168:10 | a [element 0] | | array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:5:166:5 | a [element 0] | -| array_flow.rb:166:10:166:21 | call to source | array_flow.rb:166:5:166:5 | a [element 0] | -| array_flow.rb:167:5:167:5 | b [element 0] | array_flow.rb:170:10:170:10 | b [element 0] | | array_flow.rb:167:5:167:5 | b [element 0] | array_flow.rb:170:10:170:10 | b [element 0] | | array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:170:10:170:10 | b [element] | -| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:170:10:170:10 | b [element] | -| array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:171:10:171:10 | b [element] | | array_flow.rb:167:5:167:5 | b [element] | array_flow.rb:171:10:171:10 | b [element] | | array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:168:10:168:10 | a [element] | -| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:168:10:168:10 | a [element] | -| array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:169:10:169:10 | a [element] | | array_flow.rb:167:9:167:9 | [post] a [element] | array_flow.rb:169:10:169:10 | a [element] | | array_flow.rb:167:9:167:9 | a [element 0] | array_flow.rb:167:9:167:44 | call to append [element 0] | -| array_flow.rb:167:9:167:9 | a [element 0] | array_flow.rb:167:9:167:44 | call to append [element 0] | -| array_flow.rb:167:9:167:44 | call to append [element 0] | array_flow.rb:167:5:167:5 | b [element 0] | | array_flow.rb:167:9:167:44 | call to append [element 0] | array_flow.rb:167:5:167:5 | b [element 0] | | array_flow.rb:167:9:167:44 | call to append [element] | array_flow.rb:167:5:167:5 | b [element] | -| array_flow.rb:167:9:167:44 | call to append [element] | array_flow.rb:167:5:167:5 | b [element] | -| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | | array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | | array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | -| array_flow.rb:167:18:167:29 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | -| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | | array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:9 | [post] a [element] | | array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | -| array_flow.rb:167:32:167:43 | call to source | array_flow.rb:167:9:167:44 | call to append [element] | -| array_flow.rb:168:10:168:10 | a [element 0] | array_flow.rb:168:10:168:13 | ...[...] | | array_flow.rb:168:10:168:10 | a [element 0] | array_flow.rb:168:10:168:13 | ...[...] | | array_flow.rb:168:10:168:10 | a [element] | array_flow.rb:168:10:168:13 | ...[...] | -| array_flow.rb:168:10:168:10 | a [element] | array_flow.rb:168:10:168:13 | ...[...] | -| array_flow.rb:169:10:169:10 | a [element] | array_flow.rb:169:10:169:13 | ...[...] | | array_flow.rb:169:10:169:10 | a [element] | array_flow.rb:169:10:169:13 | ...[...] | | array_flow.rb:170:10:170:10 | b [element 0] | array_flow.rb:170:10:170:13 | ...[...] | -| array_flow.rb:170:10:170:10 | b [element 0] | array_flow.rb:170:10:170:13 | ...[...] | -| array_flow.rb:170:10:170:10 | b [element] | array_flow.rb:170:10:170:13 | ...[...] | | array_flow.rb:170:10:170:10 | b [element] | array_flow.rb:170:10:170:13 | ...[...] | | array_flow.rb:171:10:171:10 | b [element] | array_flow.rb:171:10:171:13 | ...[...] | -| array_flow.rb:171:10:171:10 | b [element] | array_flow.rb:171:10:171:13 | ...[...] | -| array_flow.rb:177:5:177:5 | c [element 1] | array_flow.rb:178:16:178:16 | c [element 1] | | array_flow.rb:177:5:177:5 | c [element 1] | array_flow.rb:178:16:178:16 | c [element 1] | | array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:5:177:5 | c [element 1] | -| array_flow.rb:177:15:177:24 | call to source | array_flow.rb:177:5:177:5 | c [element 1] | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:179:11:179:11 | d [element 2, element 1] | | array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:179:11:179:11 | d [element 2, element 1] | | array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:180:11:180:11 | d [element 2, element 1] | -| array_flow.rb:178:5:178:5 | d [element 2, element 1] | array_flow.rb:180:11:180:11 | d [element 2, element 1] | -| array_flow.rb:178:16:178:16 | c [element 1] | array_flow.rb:178:5:178:5 | d [element 2, element 1] | | array_flow.rb:178:16:178:16 | c [element 1] | array_flow.rb:178:5:178:5 | d [element 2, element 1] | | array_flow.rb:179:11:179:11 | d [element 2, element 1] | array_flow.rb:179:11:179:22 | call to assoc [element 1] | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] | array_flow.rb:179:11:179:22 | call to assoc [element 1] | -| array_flow.rb:179:11:179:22 | call to assoc [element 1] | array_flow.rb:179:11:179:25 | ...[...] | | array_flow.rb:179:11:179:22 | call to assoc [element 1] | array_flow.rb:179:11:179:25 | ...[...] | | array_flow.rb:179:11:179:25 | ...[...] | array_flow.rb:179:10:179:26 | ( ... ) | -| array_flow.rb:179:11:179:25 | ...[...] | array_flow.rb:179:10:179:26 | ( ... ) | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] | array_flow.rb:180:11:180:22 | call to assoc [element 1] | | array_flow.rb:180:11:180:11 | d [element 2, element 1] | array_flow.rb:180:11:180:22 | call to assoc [element 1] | | array_flow.rb:180:11:180:22 | call to assoc [element 1] | array_flow.rb:180:11:180:25 | ...[...] | -| array_flow.rb:180:11:180:22 | call to assoc [element 1] | array_flow.rb:180:11:180:25 | ...[...] | -| array_flow.rb:180:11:180:25 | ...[...] | array_flow.rb:180:10:180:26 | ( ... ) | | array_flow.rb:180:11:180:25 | ...[...] | array_flow.rb:180:10:180:26 | ( ... ) | | array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:186:10:186:10 | a [element 1] | -| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:186:10:186:10 | a [element 1] | -| array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:188:10:188:10 | a [element 1] | | array_flow.rb:184:5:184:5 | a [element 1] | array_flow.rb:188:10:188:10 | a [element 1] | | array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:5:184:5 | a [element 1] | -| array_flow.rb:184:13:184:22 | call to source | array_flow.rb:184:5:184:5 | a [element 1] | -| array_flow.rb:186:10:186:10 | a [element 1] | array_flow.rb:186:10:186:16 | call to at | | array_flow.rb:186:10:186:10 | a [element 1] | array_flow.rb:186:10:186:16 | call to at | | array_flow.rb:188:10:188:10 | a [element 1] | array_flow.rb:188:10:188:16 | call to at | -| array_flow.rb:188:10:188:10 | a [element 1] | array_flow.rb:188:10:188:16 | call to at | -| array_flow.rb:192:5:192:5 | a [element 2] | array_flow.rb:193:9:193:9 | a [element 2] | | array_flow.rb:192:5:192:5 | a [element 2] | array_flow.rb:193:9:193:9 | a [element 2] | | array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:5:192:5 | a [element 2] | -| array_flow.rb:192:16:192:25 | call to source | array_flow.rb:192:5:192:5 | a [element 2] | -| array_flow.rb:193:5:193:5 | b | array_flow.rb:196:10:196:10 | b | | array_flow.rb:193:5:193:5 | b | array_flow.rb:196:10:196:10 | b | | array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:9:195:7 | call to bsearch | -| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:9:195:7 | call to bsearch | -| array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:23:193:23 | x | | array_flow.rb:193:9:193:9 | a [element 2] | array_flow.rb:193:23:193:23 | x | | array_flow.rb:193:9:195:7 | call to bsearch | array_flow.rb:193:5:193:5 | b | -| array_flow.rb:193:9:195:7 | call to bsearch | array_flow.rb:193:5:193:5 | b | -| array_flow.rb:193:23:193:23 | x | array_flow.rb:194:14:194:14 | x | | array_flow.rb:193:23:193:23 | x | array_flow.rb:194:14:194:14 | x | | array_flow.rb:200:5:200:5 | a [element 2] | array_flow.rb:201:9:201:9 | a [element 2] | -| array_flow.rb:200:5:200:5 | a [element 2] | array_flow.rb:201:9:201:9 | a [element 2] | -| array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:5:200:5 | a [element 2] | | array_flow.rb:200:16:200:25 | call to source | array_flow.rb:200:5:200:5 | a [element 2] | | array_flow.rb:201:9:201:9 | a [element 2] | array_flow.rb:201:29:201:29 | x | -| array_flow.rb:201:9:201:9 | a [element 2] | array_flow.rb:201:29:201:29 | x | -| array_flow.rb:201:29:201:29 | x | array_flow.rb:202:14:202:14 | x | | array_flow.rb:201:29:201:29 | x | array_flow.rb:202:14:202:14 | x | | array_flow.rb:208:5:208:5 | a [element 2] | array_flow.rb:209:5:209:5 | a [element 2] | -| array_flow.rb:208:5:208:5 | a [element 2] | array_flow.rb:209:5:209:5 | a [element 2] | -| array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:5:208:5 | a [element 2] | | array_flow.rb:208:16:208:25 | call to source | array_flow.rb:208:5:208:5 | a [element 2] | | array_flow.rb:209:5:209:5 | a [element 2] | array_flow.rb:209:17:209:17 | x | -| array_flow.rb:209:5:209:5 | a [element 2] | array_flow.rb:209:17:209:17 | x | -| array_flow.rb:209:17:209:17 | x | array_flow.rb:210:14:210:14 | x | | array_flow.rb:209:17:209:17 | x | array_flow.rb:210:14:210:14 | x | | array_flow.rb:215:5:215:5 | a [element 2] | array_flow.rb:216:9:216:9 | a [element 2] | -| array_flow.rb:215:5:215:5 | a [element 2] | array_flow.rb:216:9:216:9 | a [element 2] | -| array_flow.rb:215:5:215:5 | a [element 3] | array_flow.rb:216:9:216:9 | a [element 3] | | array_flow.rb:215:5:215:5 | a [element 3] | array_flow.rb:216:9:216:9 | a [element 3] | | array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:5:215:5 | a [element 2] | -| array_flow.rb:215:16:215:27 | call to source | array_flow.rb:215:5:215:5 | a [element 2] | -| array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:5:215:5 | a [element 3] | | array_flow.rb:215:30:215:41 | call to source | array_flow.rb:215:5:215:5 | a [element 3] | | array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:27:216:27 | x | -| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:27:216:27 | x | -| array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:30:216:30 | y | | array_flow.rb:216:9:216:9 | a [element 2] | array_flow.rb:216:30:216:30 | y | | array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:27:216:27 | x | -| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:27:216:27 | x | -| array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:30:216:30 | y | | array_flow.rb:216:9:216:9 | a [element 3] | array_flow.rb:216:30:216:30 | y | | array_flow.rb:216:27:216:27 | x | array_flow.rb:217:14:217:14 | x | -| array_flow.rb:216:27:216:27 | x | array_flow.rb:217:14:217:14 | x | -| array_flow.rb:216:30:216:30 | y | array_flow.rb:218:14:218:14 | y | | array_flow.rb:216:30:216:30 | y | array_flow.rb:218:14:218:14 | y | | array_flow.rb:231:5:231:5 | a [element 2] | array_flow.rb:232:9:232:9 | a [element 2] | -| array_flow.rb:231:5:231:5 | a [element 2] | array_flow.rb:232:9:232:9 | a [element 2] | -| array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:5:231:5 | a [element 2] | | array_flow.rb:231:16:231:27 | call to source | array_flow.rb:231:5:231:5 | a [element 2] | | array_flow.rb:232:5:232:5 | b [element] | array_flow.rb:236:10:236:10 | b [element] | -| array_flow.rb:232:5:232:5 | b [element] | array_flow.rb:236:10:236:10 | b [element] | -| array_flow.rb:232:9:232:9 | a [element 2] | array_flow.rb:232:23:232:23 | x | | array_flow.rb:232:9:232:9 | a [element 2] | array_flow.rb:232:23:232:23 | x | | array_flow.rb:232:9:235:7 | call to collect [element] | array_flow.rb:232:5:232:5 | b [element] | -| array_flow.rb:232:9:235:7 | call to collect [element] | array_flow.rb:232:5:232:5 | b [element] | -| array_flow.rb:232:23:232:23 | x | array_flow.rb:233:14:233:14 | x | | array_flow.rb:232:23:232:23 | x | array_flow.rb:233:14:233:14 | x | | array_flow.rb:234:9:234:19 | call to source | array_flow.rb:232:9:235:7 | call to collect [element] | -| array_flow.rb:234:9:234:19 | call to source | array_flow.rb:232:9:235:7 | call to collect [element] | -| array_flow.rb:236:10:236:10 | b [element] | array_flow.rb:236:10:236:13 | ...[...] | | array_flow.rb:236:10:236:10 | b [element] | array_flow.rb:236:10:236:13 | ...[...] | | array_flow.rb:240:5:240:5 | a [element 2] | array_flow.rb:241:9:241:9 | a [element 2] | -| array_flow.rb:240:5:240:5 | a [element 2] | array_flow.rb:241:9:241:9 | a [element 2] | -| array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:5:240:5 | a [element 2] | | array_flow.rb:240:16:240:27 | call to source | array_flow.rb:240:5:240:5 | a [element 2] | | array_flow.rb:241:5:241:5 | b [element] | array_flow.rb:246:10:246:10 | b [element] | -| array_flow.rb:241:5:241:5 | b [element] | array_flow.rb:246:10:246:10 | b [element] | -| array_flow.rb:241:9:241:9 | [post] a [element] | array_flow.rb:245:10:245:10 | a [element] | | array_flow.rb:241:9:241:9 | [post] a [element] | array_flow.rb:245:10:245:10 | a [element] | | array_flow.rb:241:9:241:9 | a [element 2] | array_flow.rb:241:24:241:24 | x | -| array_flow.rb:241:9:241:9 | a [element 2] | array_flow.rb:241:24:241:24 | x | -| array_flow.rb:241:9:244:7 | call to collect! [element] | array_flow.rb:241:5:241:5 | b [element] | | array_flow.rb:241:9:244:7 | call to collect! [element] | array_flow.rb:241:5:241:5 | b [element] | | array_flow.rb:241:24:241:24 | x | array_flow.rb:242:14:242:14 | x | -| array_flow.rb:241:24:241:24 | x | array_flow.rb:242:14:242:14 | x | -| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:241:9 | [post] a [element] | | array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:241:9 | [post] a [element] | | array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:244:7 | call to collect! [element] | -| array_flow.rb:243:9:243:19 | call to source | array_flow.rb:241:9:244:7 | call to collect! [element] | -| array_flow.rb:245:10:245:10 | a [element] | array_flow.rb:245:10:245:13 | ...[...] | | array_flow.rb:245:10:245:10 | a [element] | array_flow.rb:245:10:245:13 | ...[...] | | array_flow.rb:246:10:246:10 | b [element] | array_flow.rb:246:10:246:13 | ...[...] | -| array_flow.rb:246:10:246:10 | b [element] | array_flow.rb:246:10:246:13 | ...[...] | -| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:251:9:251:9 | a [element 2] | | array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:251:9:251:9 | a [element 2] | | array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:256:9:256:9 | a [element 2] | -| array_flow.rb:250:5:250:5 | a [element 2] | array_flow.rb:256:9:256:9 | a [element 2] | -| array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:5:250:5 | a [element 2] | | array_flow.rb:250:16:250:27 | call to source | array_flow.rb:250:5:250:5 | a [element 2] | | array_flow.rb:251:5:251:5 | b [element] | array_flow.rb:255:10:255:10 | b [element] | -| array_flow.rb:251:5:251:5 | b [element] | array_flow.rb:255:10:255:10 | b [element] | -| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | | array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:9:254:7 | call to collect_concat [element] | | array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:30:251:30 | x | -| array_flow.rb:251:9:251:9 | a [element 2] | array_flow.rb:251:30:251:30 | x | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] | array_flow.rb:251:5:251:5 | b [element] | | array_flow.rb:251:9:254:7 | call to collect_concat [element] | array_flow.rb:251:5:251:5 | b [element] | | array_flow.rb:251:30:251:30 | x | array_flow.rb:252:14:252:14 | x | -| array_flow.rb:251:30:251:30 | x | array_flow.rb:252:14:252:14 | x | -| array_flow.rb:253:13:253:24 | call to source | array_flow.rb:251:9:254:7 | call to collect_concat [element] | | array_flow.rb:253:13:253:24 | call to source | array_flow.rb:251:9:254:7 | call to collect_concat [element] | | array_flow.rb:255:10:255:10 | b [element] | array_flow.rb:255:10:255:13 | ...[...] | -| array_flow.rb:255:10:255:10 | b [element] | array_flow.rb:255:10:255:13 | ...[...] | -| array_flow.rb:256:5:256:5 | b [element] | array_flow.rb:260:10:260:10 | b [element] | | array_flow.rb:256:5:256:5 | b [element] | array_flow.rb:260:10:260:10 | b [element] | | array_flow.rb:256:9:256:9 | a [element 2] | array_flow.rb:256:30:256:30 | x | -| array_flow.rb:256:9:256:9 | a [element 2] | array_flow.rb:256:30:256:30 | x | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] | array_flow.rb:256:5:256:5 | b [element] | | array_flow.rb:256:9:259:7 | call to collect_concat [element] | array_flow.rb:256:5:256:5 | b [element] | | array_flow.rb:256:30:256:30 | x | array_flow.rb:257:14:257:14 | x | -| array_flow.rb:256:30:256:30 | x | array_flow.rb:257:14:257:14 | x | -| array_flow.rb:258:9:258:20 | call to source | array_flow.rb:256:9:259:7 | call to collect_concat [element] | | array_flow.rb:258:9:258:20 | call to source | array_flow.rb:256:9:259:7 | call to collect_concat [element] | | array_flow.rb:260:10:260:10 | b [element] | array_flow.rb:260:10:260:13 | ...[...] | -| array_flow.rb:260:10:260:10 | b [element] | array_flow.rb:260:10:260:13 | ...[...] | -| array_flow.rb:264:5:264:5 | a [element 2] | array_flow.rb:265:9:265:9 | a [element 2] | | array_flow.rb:264:5:264:5 | a [element 2] | array_flow.rb:265:9:265:9 | a [element 2] | | array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:5:264:5 | a [element 2] | -| array_flow.rb:264:16:264:25 | call to source | array_flow.rb:264:5:264:5 | a [element 2] | -| array_flow.rb:265:5:265:5 | b [element 2] | array_flow.rb:269:10:269:10 | b [element 2] | | array_flow.rb:265:5:265:5 | b [element 2] | array_flow.rb:269:10:269:10 | b [element 2] | | array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:9:267:7 | call to combination [element 2] | -| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:9:267:7 | call to combination [element 2] | -| array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:30:265:30 | x [element] | | array_flow.rb:265:9:265:9 | a [element 2] | array_flow.rb:265:30:265:30 | x [element] | | array_flow.rb:265:9:267:7 | call to combination [element 2] | array_flow.rb:265:5:265:5 | b [element 2] | -| array_flow.rb:265:9:267:7 | call to combination [element 2] | array_flow.rb:265:5:265:5 | b [element 2] | -| array_flow.rb:265:30:265:30 | x [element] | array_flow.rb:266:14:266:14 | x [element] | | array_flow.rb:265:30:265:30 | x [element] | array_flow.rb:266:14:266:14 | x [element] | | array_flow.rb:266:14:266:14 | x [element] | array_flow.rb:266:14:266:17 | ...[...] | -| array_flow.rb:266:14:266:14 | x [element] | array_flow.rb:266:14:266:17 | ...[...] | -| array_flow.rb:269:10:269:10 | b [element 2] | array_flow.rb:269:10:269:13 | ...[...] | | array_flow.rb:269:10:269:10 | b [element 2] | array_flow.rb:269:10:269:13 | ...[...] | | array_flow.rb:273:5:273:5 | a [element 2] | array_flow.rb:274:9:274:9 | a [element 2] | -| array_flow.rb:273:5:273:5 | a [element 2] | array_flow.rb:274:9:274:9 | a [element 2] | -| array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:5:273:5 | a [element 2] | | array_flow.rb:273:16:273:25 | call to source | array_flow.rb:273:5:273:5 | a [element 2] | | array_flow.rb:274:5:274:5 | b [element] | array_flow.rb:275:10:275:10 | b [element] | -| array_flow.rb:274:5:274:5 | b [element] | array_flow.rb:275:10:275:10 | b [element] | -| array_flow.rb:274:9:274:9 | a [element 2] | array_flow.rb:274:9:274:17 | call to compact [element] | | array_flow.rb:274:9:274:9 | a [element 2] | array_flow.rb:274:9:274:17 | call to compact [element] | | array_flow.rb:274:9:274:17 | call to compact [element] | array_flow.rb:274:5:274:5 | b [element] | -| array_flow.rb:274:9:274:17 | call to compact [element] | array_flow.rb:274:5:274:5 | b [element] | -| array_flow.rb:275:10:275:10 | b [element] | array_flow.rb:275:10:275:13 | ...[...] | | array_flow.rb:275:10:275:10 | b [element] | array_flow.rb:275:10:275:13 | ...[...] | | array_flow.rb:279:5:279:5 | a [element 2] | array_flow.rb:280:9:280:9 | a [element 2] | -| array_flow.rb:279:5:279:5 | a [element 2] | array_flow.rb:280:9:280:9 | a [element 2] | -| array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:5:279:5 | a [element 2] | | array_flow.rb:279:16:279:25 | call to source | array_flow.rb:279:5:279:5 | a [element 2] | | array_flow.rb:280:5:280:5 | b [element] | array_flow.rb:282:10:282:10 | b [element] | -| array_flow.rb:280:5:280:5 | b [element] | array_flow.rb:282:10:282:10 | b [element] | -| array_flow.rb:280:9:280:9 | [post] a [element] | array_flow.rb:281:10:281:10 | a [element] | | array_flow.rb:280:9:280:9 | [post] a [element] | array_flow.rb:281:10:281:10 | a [element] | | array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:9 | [post] a [element] | -| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:9 | [post] a [element] | -| array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:18 | call to compact! [element] | | array_flow.rb:280:9:280:9 | a [element 2] | array_flow.rb:280:9:280:18 | call to compact! [element] | | array_flow.rb:280:9:280:18 | call to compact! [element] | array_flow.rb:280:5:280:5 | b [element] | -| array_flow.rb:280:9:280:18 | call to compact! [element] | array_flow.rb:280:5:280:5 | b [element] | -| array_flow.rb:281:10:281:10 | a [element] | array_flow.rb:281:10:281:13 | ...[...] | | array_flow.rb:281:10:281:10 | a [element] | array_flow.rb:281:10:281:13 | ...[...] | | array_flow.rb:282:10:282:10 | b [element] | array_flow.rb:282:10:282:13 | ...[...] | -| array_flow.rb:282:10:282:10 | b [element] | array_flow.rb:282:10:282:13 | ...[...] | -| array_flow.rb:286:5:286:5 | a [element 2] | array_flow.rb:290:10:290:10 | a [element 2] | | array_flow.rb:286:5:286:5 | a [element 2] | array_flow.rb:290:10:290:10 | a [element 2] | | array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:5:286:5 | a [element 2] | -| array_flow.rb:286:16:286:27 | call to source | array_flow.rb:286:5:286:5 | a [element 2] | -| array_flow.rb:287:5:287:5 | b [element 2] | array_flow.rb:288:14:288:14 | b [element 2] | | array_flow.rb:287:5:287:5 | b [element 2] | array_flow.rb:288:14:288:14 | b [element 2] | | array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:5:287:5 | b [element 2] | -| array_flow.rb:287:16:287:27 | call to source | array_flow.rb:287:5:287:5 | b [element 2] | -| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:289:10:289:10 | a [element] | | array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:289:10:289:10 | a [element] | | array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:290:10:290:10 | a [element] | -| array_flow.rb:288:5:288:5 | [post] a [element] | array_flow.rb:290:10:290:10 | a [element] | -| array_flow.rb:288:14:288:14 | b [element 2] | array_flow.rb:288:5:288:5 | [post] a [element] | | array_flow.rb:288:14:288:14 | b [element 2] | array_flow.rb:288:5:288:5 | [post] a [element] | | array_flow.rb:289:10:289:10 | a [element] | array_flow.rb:289:10:289:13 | ...[...] | -| array_flow.rb:289:10:289:10 | a [element] | array_flow.rb:289:10:289:13 | ...[...] | -| array_flow.rb:290:10:290:10 | a [element 2] | array_flow.rb:290:10:290:13 | ...[...] | | array_flow.rb:290:10:290:10 | a [element 2] | array_flow.rb:290:10:290:13 | ...[...] | | array_flow.rb:290:10:290:10 | a [element] | array_flow.rb:290:10:290:13 | ...[...] | -| array_flow.rb:290:10:290:10 | a [element] | array_flow.rb:290:10:290:13 | ...[...] | -| array_flow.rb:294:5:294:5 | a [element 2] | array_flow.rb:295:5:295:5 | a [element 2] | | array_flow.rb:294:5:294:5 | a [element 2] | array_flow.rb:295:5:295:5 | a [element 2] | | array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:5:294:5 | a [element 2] | -| array_flow.rb:294:16:294:25 | call to source | array_flow.rb:294:5:294:5 | a [element 2] | -| array_flow.rb:295:5:295:5 | a [element 2] | array_flow.rb:295:17:295:17 | x | | array_flow.rb:295:5:295:5 | a [element 2] | array_flow.rb:295:17:295:17 | x | | array_flow.rb:295:17:295:17 | x | array_flow.rb:296:14:296:14 | x | -| array_flow.rb:295:17:295:17 | x | array_flow.rb:296:14:296:14 | x | -| array_flow.rb:301:5:301:5 | a [element 2] | array_flow.rb:302:5:302:5 | a [element 2] | | array_flow.rb:301:5:301:5 | a [element 2] | array_flow.rb:302:5:302:5 | a [element 2] | | array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:5:301:5 | a [element 2] | -| array_flow.rb:301:16:301:25 | call to source | array_flow.rb:301:5:301:5 | a [element 2] | -| array_flow.rb:302:5:302:5 | a [element 2] | array_flow.rb:302:20:302:20 | x | | array_flow.rb:302:5:302:5 | a [element 2] | array_flow.rb:302:20:302:20 | x | | array_flow.rb:302:20:302:20 | x | array_flow.rb:303:14:303:14 | x | -| array_flow.rb:302:20:302:20 | x | array_flow.rb:303:14:303:14 | x | -| array_flow.rb:308:5:308:5 | a [element 2] | array_flow.rb:309:9:309:9 | a [element 2] | | array_flow.rb:308:5:308:5 | a [element 2] | array_flow.rb:309:9:309:9 | a [element 2] | | array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:5:308:5 | a [element 2] | -| array_flow.rb:308:16:308:25 | call to source | array_flow.rb:308:5:308:5 | a [element 2] | -| array_flow.rb:309:5:309:5 | b [element 2] | array_flow.rb:312:10:312:10 | b [element 2] | | array_flow.rb:309:5:309:5 | b [element 2] | array_flow.rb:312:10:312:10 | b [element 2] | | array_flow.rb:309:9:309:9 | a [element 2] | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | -| array_flow.rb:309:9:309:9 | a [element 2] | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | array_flow.rb:309:5:309:5 | b [element 2] | | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | array_flow.rb:309:5:309:5 | b [element 2] | | array_flow.rb:312:10:312:10 | b [element 2] | array_flow.rb:312:10:312:13 | ...[...] | -| array_flow.rb:312:10:312:10 | b [element 2] | array_flow.rb:312:10:312:13 | ...[...] | -| array_flow.rb:316:5:316:5 | a [element 2] | array_flow.rb:317:9:317:9 | a [element 2] | | array_flow.rb:316:5:316:5 | a [element 2] | array_flow.rb:317:9:317:9 | a [element 2] | | array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:5:316:5 | a [element 2] | -| array_flow.rb:316:16:316:27 | call to source | array_flow.rb:316:5:316:5 | a [element 2] | -| array_flow.rb:317:5:317:5 | b | array_flow.rb:318:10:318:10 | b | | array_flow.rb:317:5:317:5 | b | array_flow.rb:318:10:318:10 | b | | array_flow.rb:317:9:317:9 | a [element 2] | array_flow.rb:317:9:317:36 | call to delete | -| array_flow.rb:317:9:317:9 | a [element 2] | array_flow.rb:317:9:317:36 | call to delete | -| array_flow.rb:317:9:317:36 | call to delete | array_flow.rb:317:5:317:5 | b | | array_flow.rb:317:9:317:36 | call to delete | array_flow.rb:317:5:317:5 | b | | array_flow.rb:317:23:317:34 | call to source | array_flow.rb:317:9:317:36 | call to delete | -| array_flow.rb:317:23:317:34 | call to source | array_flow.rb:317:9:317:36 | call to delete | -| array_flow.rb:325:5:325:5 | a [element 2] | array_flow.rb:326:9:326:9 | a [element 2] | | array_flow.rb:325:5:325:5 | a [element 2] | array_flow.rb:326:9:326:9 | a [element 2] | | array_flow.rb:325:5:325:5 | a [element 3] | array_flow.rb:326:9:326:9 | a [element 3] | -| array_flow.rb:325:5:325:5 | a [element 3] | array_flow.rb:326:9:326:9 | a [element 3] | -| array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:5:325:5 | a [element 2] | | array_flow.rb:325:16:325:27 | call to source | array_flow.rb:325:5:325:5 | a [element 2] | | array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:5:325:5 | a [element 3] | -| array_flow.rb:325:30:325:41 | call to source | array_flow.rb:325:5:325:5 | a [element 3] | -| array_flow.rb:326:5:326:5 | b | array_flow.rb:327:10:327:10 | b | | array_flow.rb:326:5:326:5 | b | array_flow.rb:327:10:327:10 | b | | array_flow.rb:326:9:326:9 | [post] a [element 2] | array_flow.rb:328:10:328:10 | a [element 2] | -| array_flow.rb:326:9:326:9 | [post] a [element 2] | array_flow.rb:328:10:328:10 | a [element 2] | -| array_flow.rb:326:9:326:9 | a [element 2] | array_flow.rb:326:9:326:22 | call to delete_at | | array_flow.rb:326:9:326:9 | a [element 2] | array_flow.rb:326:9:326:22 | call to delete_at | | array_flow.rb:326:9:326:9 | a [element 3] | array_flow.rb:326:9:326:9 | [post] a [element 2] | -| array_flow.rb:326:9:326:9 | a [element 3] | array_flow.rb:326:9:326:9 | [post] a [element 2] | -| array_flow.rb:326:9:326:22 | call to delete_at | array_flow.rb:326:5:326:5 | b | | array_flow.rb:326:9:326:22 | call to delete_at | array_flow.rb:326:5:326:5 | b | | array_flow.rb:328:10:328:10 | a [element 2] | array_flow.rb:328:10:328:13 | ...[...] | -| array_flow.rb:328:10:328:10 | a [element 2] | array_flow.rb:328:10:328:13 | ...[...] | -| array_flow.rb:330:5:330:5 | a [element 2] | array_flow.rb:331:9:331:9 | a [element 2] | | array_flow.rb:330:5:330:5 | a [element 2] | array_flow.rb:331:9:331:9 | a [element 2] | | array_flow.rb:330:5:330:5 | a [element 3] | array_flow.rb:331:9:331:9 | a [element 3] | -| array_flow.rb:330:5:330:5 | a [element 3] | array_flow.rb:331:9:331:9 | a [element 3] | -| array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:5:330:5 | a [element 2] | | array_flow.rb:330:16:330:27 | call to source | array_flow.rb:330:5:330:5 | a [element 2] | | array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:5:330:5 | a [element 3] | -| array_flow.rb:330:30:330:41 | call to source | array_flow.rb:330:5:330:5 | a [element 3] | -| array_flow.rb:331:5:331:5 | b | array_flow.rb:332:10:332:10 | b | | array_flow.rb:331:5:331:5 | b | array_flow.rb:332:10:332:10 | b | | array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:333:10:333:10 | a [element] | -| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:333:10:333:10 | a [element] | -| array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:334:10:334:10 | a [element] | | array_flow.rb:331:9:331:9 | [post] a [element] | array_flow.rb:334:10:334:10 | a [element] | | array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:9 | [post] a [element] | -| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:9 | [post] a [element] | -| array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:22 | call to delete_at | | array_flow.rb:331:9:331:9 | a [element 2] | array_flow.rb:331:9:331:22 | call to delete_at | | array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:9 | [post] a [element] | -| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:9 | [post] a [element] | -| array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:22 | call to delete_at | | array_flow.rb:331:9:331:9 | a [element 3] | array_flow.rb:331:9:331:22 | call to delete_at | | array_flow.rb:331:9:331:22 | call to delete_at | array_flow.rb:331:5:331:5 | b | -| array_flow.rb:331:9:331:22 | call to delete_at | array_flow.rb:331:5:331:5 | b | -| array_flow.rb:333:10:333:10 | a [element] | array_flow.rb:333:10:333:13 | ...[...] | | array_flow.rb:333:10:333:10 | a [element] | array_flow.rb:333:10:333:13 | ...[...] | | array_flow.rb:334:10:334:10 | a [element] | array_flow.rb:334:10:334:13 | ...[...] | -| array_flow.rb:334:10:334:10 | a [element] | array_flow.rb:334:10:334:13 | ...[...] | -| array_flow.rb:338:5:338:5 | a [element 2] | array_flow.rb:339:9:339:9 | a [element 2] | | array_flow.rb:338:5:338:5 | a [element 2] | array_flow.rb:339:9:339:9 | a [element 2] | | array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:5:338:5 | a [element 2] | -| array_flow.rb:338:16:338:25 | call to source | array_flow.rb:338:5:338:5 | a [element 2] | -| array_flow.rb:339:5:339:5 | b [element] | array_flow.rb:342:10:342:10 | b [element] | | array_flow.rb:339:5:339:5 | b [element] | array_flow.rb:342:10:342:10 | b [element] | | array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:343:10:343:10 | a [element] | -| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:343:10:343:10 | a [element] | -| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:344:10:344:10 | a [element] | | array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:344:10:344:10 | a [element] | | array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:345:10:345:10 | a [element] | -| array_flow.rb:339:9:339:9 | [post] a [element] | array_flow.rb:345:10:345:10 | a [element] | -| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:339:9 | [post] a [element] | | array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:339:9 | [post] a [element] | | array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:341:7 | call to delete_if [element] | -| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:9:341:7 | call to delete_if [element] | -| array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:25:339:25 | x | | array_flow.rb:339:9:339:9 | a [element 2] | array_flow.rb:339:25:339:25 | x | | array_flow.rb:339:9:341:7 | call to delete_if [element] | array_flow.rb:339:5:339:5 | b [element] | -| array_flow.rb:339:9:341:7 | call to delete_if [element] | array_flow.rb:339:5:339:5 | b [element] | -| array_flow.rb:339:25:339:25 | x | array_flow.rb:340:14:340:14 | x | | array_flow.rb:339:25:339:25 | x | array_flow.rb:340:14:340:14 | x | | array_flow.rb:342:10:342:10 | b [element] | array_flow.rb:342:10:342:13 | ...[...] | -| array_flow.rb:342:10:342:10 | b [element] | array_flow.rb:342:10:342:13 | ...[...] | -| array_flow.rb:343:10:343:10 | a [element] | array_flow.rb:343:10:343:13 | ...[...] | | array_flow.rb:343:10:343:10 | a [element] | array_flow.rb:343:10:343:13 | ...[...] | | array_flow.rb:344:10:344:10 | a [element] | array_flow.rb:344:10:344:13 | ...[...] | -| array_flow.rb:344:10:344:10 | a [element] | array_flow.rb:344:10:344:13 | ...[...] | -| array_flow.rb:345:10:345:10 | a [element] | array_flow.rb:345:10:345:13 | ...[...] | | array_flow.rb:345:10:345:10 | a [element] | array_flow.rb:345:10:345:13 | ...[...] | | array_flow.rb:349:5:349:5 | a [element 2] | array_flow.rb:350:9:350:9 | a [element 2] | -| array_flow.rb:349:5:349:5 | a [element 2] | array_flow.rb:350:9:350:9 | a [element 2] | -| array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:5:349:5 | a [element 2] | | array_flow.rb:349:16:349:25 | call to source | array_flow.rb:349:5:349:5 | a [element 2] | | array_flow.rb:350:5:350:5 | b [element] | array_flow.rb:351:10:351:10 | b [element] | -| array_flow.rb:350:5:350:5 | b [element] | array_flow.rb:351:10:351:10 | b [element] | -| array_flow.rb:350:9:350:9 | a [element 2] | array_flow.rb:350:9:350:25 | call to difference [element] | | array_flow.rb:350:9:350:9 | a [element 2] | array_flow.rb:350:9:350:25 | call to difference [element] | | array_flow.rb:350:9:350:25 | call to difference [element] | array_flow.rb:350:5:350:5 | b [element] | -| array_flow.rb:350:9:350:25 | call to difference [element] | array_flow.rb:350:5:350:5 | b [element] | -| array_flow.rb:351:10:351:10 | b [element] | array_flow.rb:351:10:351:13 | ...[...] | | array_flow.rb:351:10:351:10 | b [element] | array_flow.rb:351:10:351:13 | ...[...] | | array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:357:10:357:10 | a [element 2] | -| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:357:10:357:10 | a [element 2] | -| array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:358:10:358:10 | a [element 2] | | array_flow.rb:355:5:355:5 | a [element 2] | array_flow.rb:358:10:358:10 | a [element 2] | | array_flow.rb:355:5:355:5 | a [element 3, element 1] | array_flow.rb:360:10:360:10 | a [element 3, element 1] | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] | array_flow.rb:360:10:360:10 | a [element 3, element 1] | -| array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:5:355:5 | a [element 2] | | array_flow.rb:355:16:355:27 | call to source | array_flow.rb:355:5:355:5 | a [element 2] | | array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:5:355:5 | a [element 3, element 1] | -| array_flow.rb:355:34:355:45 | call to source | array_flow.rb:355:5:355:5 | a [element 3, element 1] | -| array_flow.rb:357:10:357:10 | a [element 2] | array_flow.rb:357:10:357:17 | call to dig | | array_flow.rb:357:10:357:10 | a [element 2] | array_flow.rb:357:10:357:17 | call to dig | | array_flow.rb:358:10:358:10 | a [element 2] | array_flow.rb:358:10:358:17 | call to dig | -| array_flow.rb:358:10:358:10 | a [element 2] | array_flow.rb:358:10:358:17 | call to dig | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] | array_flow.rb:360:10:360:19 | call to dig | | array_flow.rb:360:10:360:10 | a [element 3, element 1] | array_flow.rb:360:10:360:19 | call to dig | | array_flow.rb:364:5:364:5 | a [element 2] | array_flow.rb:365:9:365:9 | a [element 2] | -| array_flow.rb:364:5:364:5 | a [element 2] | array_flow.rb:365:9:365:9 | a [element 2] | -| array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:5:364:5 | a [element 2] | | array_flow.rb:364:16:364:27 | call to source | array_flow.rb:364:5:364:5 | a [element 2] | | array_flow.rb:365:5:365:5 | b | array_flow.rb:368:10:368:10 | b | -| array_flow.rb:365:5:365:5 | b | array_flow.rb:368:10:368:10 | b | -| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:9:367:7 | call to detect | | array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:9:367:7 | call to detect | | array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:43:365:43 | x | -| array_flow.rb:365:9:365:9 | a [element 2] | array_flow.rb:365:43:365:43 | x | -| array_flow.rb:365:9:367:7 | call to detect | array_flow.rb:365:5:365:5 | b | | array_flow.rb:365:9:367:7 | call to detect | array_flow.rb:365:5:365:5 | b | | array_flow.rb:365:23:365:34 | call to source | array_flow.rb:365:9:367:7 | call to detect | -| array_flow.rb:365:23:365:34 | call to source | array_flow.rb:365:9:367:7 | call to detect | -| array_flow.rb:365:43:365:43 | x | array_flow.rb:366:14:366:14 | x | | array_flow.rb:365:43:365:43 | x | array_flow.rb:366:14:366:14 | x | | array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:373:9:373:9 | a [element 2] | -| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:373:9:373:9 | a [element 2] | -| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:375:9:375:9 | a [element 2] | | array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:375:9:375:9 | a [element 2] | | array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:380:9:380:9 | a [element 2] | -| array_flow.rb:372:5:372:5 | a [element 2] | array_flow.rb:380:9:380:9 | a [element 2] | -| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:373:9:373:9 | a [element 3] | | array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:373:9:373:9 | a [element 3] | | array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:375:9:375:9 | a [element 3] | -| array_flow.rb:372:5:372:5 | a [element 3] | array_flow.rb:375:9:375:9 | a [element 3] | -| array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:5:372:5 | a [element 2] | | array_flow.rb:372:16:372:27 | call to source | array_flow.rb:372:5:372:5 | a [element 2] | | array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:5:372:5 | a [element 3] | -| array_flow.rb:372:30:372:41 | call to source | array_flow.rb:372:5:372:5 | a [element 3] | -| array_flow.rb:373:5:373:5 | b [element] | array_flow.rb:374:10:374:10 | b [element] | | array_flow.rb:373:5:373:5 | b [element] | array_flow.rb:374:10:374:10 | b [element] | | array_flow.rb:373:9:373:9 | a [element 2] | array_flow.rb:373:9:373:17 | call to drop [element] | -| array_flow.rb:373:9:373:9 | a [element 2] | array_flow.rb:373:9:373:17 | call to drop [element] | -| array_flow.rb:373:9:373:9 | a [element 3] | array_flow.rb:373:9:373:17 | call to drop [element] | | array_flow.rb:373:9:373:9 | a [element 3] | array_flow.rb:373:9:373:17 | call to drop [element] | | array_flow.rb:373:9:373:17 | call to drop [element] | array_flow.rb:373:5:373:5 | b [element] | -| array_flow.rb:373:9:373:17 | call to drop [element] | array_flow.rb:373:5:373:5 | b [element] | -| array_flow.rb:374:10:374:10 | b [element] | array_flow.rb:374:10:374:13 | ...[...] | | array_flow.rb:374:10:374:10 | b [element] | array_flow.rb:374:10:374:13 | ...[...] | | array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:377:10:377:10 | b [element 1] | -| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:377:10:377:10 | b [element 1] | -| array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:378:10:378:10 | b [element 1] | | array_flow.rb:375:5:375:5 | b [element 1] | array_flow.rb:378:10:378:10 | b [element 1] | | array_flow.rb:375:5:375:5 | b [element 2] | array_flow.rb:378:10:378:10 | b [element 2] | -| array_flow.rb:375:5:375:5 | b [element 2] | array_flow.rb:378:10:378:10 | b [element 2] | -| array_flow.rb:375:9:375:9 | a [element 2] | array_flow.rb:375:9:375:17 | call to drop [element 1] | | array_flow.rb:375:9:375:9 | a [element 2] | array_flow.rb:375:9:375:17 | call to drop [element 1] | | array_flow.rb:375:9:375:9 | a [element 3] | array_flow.rb:375:9:375:17 | call to drop [element 2] | -| array_flow.rb:375:9:375:9 | a [element 3] | array_flow.rb:375:9:375:17 | call to drop [element 2] | -| array_flow.rb:375:9:375:17 | call to drop [element 1] | array_flow.rb:375:5:375:5 | b [element 1] | | array_flow.rb:375:9:375:17 | call to drop [element 1] | array_flow.rb:375:5:375:5 | b [element 1] | | array_flow.rb:375:9:375:17 | call to drop [element 2] | array_flow.rb:375:5:375:5 | b [element 2] | -| array_flow.rb:375:9:375:17 | call to drop [element 2] | array_flow.rb:375:5:375:5 | b [element 2] | -| array_flow.rb:377:10:377:10 | b [element 1] | array_flow.rb:377:10:377:13 | ...[...] | | array_flow.rb:377:10:377:10 | b [element 1] | array_flow.rb:377:10:377:13 | ...[...] | | array_flow.rb:378:10:378:10 | b [element 1] | array_flow.rb:378:10:378:13 | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 1] | array_flow.rb:378:10:378:13 | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 2] | array_flow.rb:378:10:378:13 | ...[...] | | array_flow.rb:378:10:378:10 | b [element 2] | array_flow.rb:378:10:378:13 | ...[...] | | array_flow.rb:379:5:379:5 | [post] a [element] | array_flow.rb:380:9:380:9 | a [element] | -| array_flow.rb:379:5:379:5 | [post] a [element] | array_flow.rb:380:9:380:9 | a [element] | -| array_flow.rb:379:12:379:23 | call to source | array_flow.rb:379:5:379:5 | [post] a [element] | | array_flow.rb:379:12:379:23 | call to source | array_flow.rb:379:5:379:5 | [post] a [element] | | array_flow.rb:380:5:380:5 | b [element 1] | array_flow.rb:381:10:381:10 | b [element 1] | -| array_flow.rb:380:5:380:5 | b [element 1] | array_flow.rb:381:10:381:10 | b [element 1] | -| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:381:10:381:10 | b [element] | | array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:381:10:381:10 | b [element] | | array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:382:9:382:9 | b [element] | -| array_flow.rb:380:5:380:5 | b [element] | array_flow.rb:382:9:382:9 | b [element] | -| array_flow.rb:380:9:380:9 | a [element 2] | array_flow.rb:380:9:380:17 | call to drop [element 1] | | array_flow.rb:380:9:380:9 | a [element 2] | array_flow.rb:380:9:380:17 | call to drop [element 1] | | array_flow.rb:380:9:380:9 | a [element] | array_flow.rb:380:9:380:17 | call to drop [element] | -| array_flow.rb:380:9:380:9 | a [element] | array_flow.rb:380:9:380:17 | call to drop [element] | -| array_flow.rb:380:9:380:17 | call to drop [element 1] | array_flow.rb:380:5:380:5 | b [element 1] | | array_flow.rb:380:9:380:17 | call to drop [element 1] | array_flow.rb:380:5:380:5 | b [element 1] | | array_flow.rb:380:9:380:17 | call to drop [element] | array_flow.rb:380:5:380:5 | b [element] | -| array_flow.rb:380:9:380:17 | call to drop [element] | array_flow.rb:380:5:380:5 | b [element] | -| array_flow.rb:381:10:381:10 | b [element 1] | array_flow.rb:381:10:381:13 | ...[...] | | array_flow.rb:381:10:381:10 | b [element 1] | array_flow.rb:381:10:381:13 | ...[...] | | array_flow.rb:381:10:381:10 | b [element] | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:381:10:381:10 | b [element] | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:382:5:382:5 | c [element] | array_flow.rb:383:10:383:10 | c [element] | | array_flow.rb:382:5:382:5 | c [element] | array_flow.rb:383:10:383:10 | c [element] | | array_flow.rb:382:9:382:9 | b [element] | array_flow.rb:382:9:382:19 | call to drop [element] | -| array_flow.rb:382:9:382:9 | b [element] | array_flow.rb:382:9:382:19 | call to drop [element] | -| array_flow.rb:382:9:382:19 | call to drop [element] | array_flow.rb:382:5:382:5 | c [element] | | array_flow.rb:382:9:382:19 | call to drop [element] | array_flow.rb:382:5:382:5 | c [element] | | array_flow.rb:383:10:383:10 | c [element] | array_flow.rb:383:10:383:13 | ...[...] | -| array_flow.rb:383:10:383:10 | c [element] | array_flow.rb:383:10:383:13 | ...[...] | -| array_flow.rb:387:5:387:5 | a [element 2] | array_flow.rb:388:9:388:9 | a [element 2] | | array_flow.rb:387:5:387:5 | a [element 2] | array_flow.rb:388:9:388:9 | a [element 2] | | array_flow.rb:387:5:387:5 | a [element 3] | array_flow.rb:388:9:388:9 | a [element 3] | -| array_flow.rb:387:5:387:5 | a [element 3] | array_flow.rb:388:9:388:9 | a [element 3] | -| array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:5:387:5 | a [element 2] | | array_flow.rb:387:16:387:27 | call to source | array_flow.rb:387:5:387:5 | a [element 2] | | array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:5:387:5 | a [element 3] | -| array_flow.rb:387:30:387:41 | call to source | array_flow.rb:387:5:387:5 | a [element 3] | -| array_flow.rb:388:5:388:5 | b [element] | array_flow.rb:391:10:391:10 | b [element] | | array_flow.rb:388:5:388:5 | b [element] | array_flow.rb:391:10:391:10 | b [element] | | array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:9:390:7 | call to drop_while [element] | -| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:9:390:7 | call to drop_while [element] | -| array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:26:388:26 | x | | array_flow.rb:388:9:388:9 | a [element 2] | array_flow.rb:388:26:388:26 | x | | array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:9:390:7 | call to drop_while [element] | -| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:9:390:7 | call to drop_while [element] | -| array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:26:388:26 | x | | array_flow.rb:388:9:388:9 | a [element 3] | array_flow.rb:388:26:388:26 | x | | array_flow.rb:388:9:390:7 | call to drop_while [element] | array_flow.rb:388:5:388:5 | b [element] | -| array_flow.rb:388:9:390:7 | call to drop_while [element] | array_flow.rb:388:5:388:5 | b [element] | -| array_flow.rb:388:26:388:26 | x | array_flow.rb:389:14:389:14 | x | | array_flow.rb:388:26:388:26 | x | array_flow.rb:389:14:389:14 | x | | array_flow.rb:391:10:391:10 | b [element] | array_flow.rb:391:10:391:13 | ...[...] | -| array_flow.rb:391:10:391:10 | b [element] | array_flow.rb:391:10:391:13 | ...[...] | -| array_flow.rb:395:5:395:5 | a [element 2] | array_flow.rb:396:9:396:9 | a [element 2] | | array_flow.rb:395:5:395:5 | a [element 2] | array_flow.rb:396:9:396:9 | a [element 2] | | array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:5:395:5 | a [element 2] | -| array_flow.rb:395:16:395:25 | call to source | array_flow.rb:395:5:395:5 | a [element 2] | -| array_flow.rb:396:5:396:5 | b [element 2] | array_flow.rb:399:10:399:10 | b [element 2] | | array_flow.rb:396:5:396:5 | b [element 2] | array_flow.rb:399:10:399:10 | b [element 2] | | array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:9:398:7 | call to each [element 2] | -| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:9:398:7 | call to each [element 2] | -| array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:20:396:20 | x | | array_flow.rb:396:9:396:9 | a [element 2] | array_flow.rb:396:20:396:20 | x | | array_flow.rb:396:9:398:7 | call to each [element 2] | array_flow.rb:396:5:396:5 | b [element 2] | -| array_flow.rb:396:9:398:7 | call to each [element 2] | array_flow.rb:396:5:396:5 | b [element 2] | -| array_flow.rb:396:20:396:20 | x | array_flow.rb:397:14:397:14 | x | | array_flow.rb:396:20:396:20 | x | array_flow.rb:397:14:397:14 | x | | array_flow.rb:399:10:399:10 | b [element 2] | array_flow.rb:399:10:399:13 | ...[...] | -| array_flow.rb:399:10:399:10 | b [element 2] | array_flow.rb:399:10:399:13 | ...[...] | -| array_flow.rb:403:5:403:5 | a [element 2] | array_flow.rb:404:18:404:18 | a [element 2] | | array_flow.rb:403:5:403:5 | a [element 2] | array_flow.rb:404:18:404:18 | a [element 2] | | array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:5:403:5 | a [element 2] | -| array_flow.rb:403:16:403:25 | call to source | array_flow.rb:403:5:403:5 | a [element 2] | -| array_flow.rb:404:5:404:5 | b [element 2] | array_flow.rb:408:10:408:10 | b [element 2] | | array_flow.rb:404:5:404:5 | b [element 2] | array_flow.rb:408:10:408:10 | b [element 2] | | array_flow.rb:404:9:406:7 | __synth__0__1 | array_flow.rb:404:13:404:13 | x | -| array_flow.rb:404:9:406:7 | __synth__0__1 | array_flow.rb:404:13:404:13 | x | -| array_flow.rb:404:13:404:13 | x | array_flow.rb:405:14:405:14 | x | | array_flow.rb:404:13:404:13 | x | array_flow.rb:405:14:405:14 | x | | array_flow.rb:404:13:404:13 | x | array_flow.rb:407:10:407:10 | x | -| array_flow.rb:404:13:404:13 | x | array_flow.rb:407:10:407:10 | x | -| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:5:404:5 | b [element 2] | | array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:5:404:5 | b [element 2] | | array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:9:406:7 | __synth__0__1 | -| array_flow.rb:404:18:404:18 | a [element 2] | array_flow.rb:404:9:406:7 | __synth__0__1 | -| array_flow.rb:408:10:408:10 | b [element 2] | array_flow.rb:408:10:408:13 | ...[...] | | array_flow.rb:408:10:408:10 | b [element 2] | array_flow.rb:408:10:408:13 | ...[...] | | array_flow.rb:412:5:412:5 | a [element 2] | array_flow.rb:413:5:413:5 | a [element 2] | -| array_flow.rb:412:5:412:5 | a [element 2] | array_flow.rb:413:5:413:5 | a [element 2] | -| array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:5:412:5 | a [element 2] | | array_flow.rb:412:16:412:25 | call to source | array_flow.rb:412:5:412:5 | a [element 2] | | array_flow.rb:413:5:413:5 | a [element 2] | array_flow.rb:413:24:413:24 | x [element] | -| array_flow.rb:413:5:413:5 | a [element 2] | array_flow.rb:413:24:413:24 | x [element] | -| array_flow.rb:413:24:413:24 | x [element] | array_flow.rb:414:15:414:15 | x [element] | | array_flow.rb:413:24:413:24 | x [element] | array_flow.rb:414:15:414:15 | x [element] | | array_flow.rb:414:15:414:15 | x [element] | array_flow.rb:414:15:414:18 | ...[...] | -| array_flow.rb:414:15:414:15 | x [element] | array_flow.rb:414:15:414:18 | ...[...] | -| array_flow.rb:414:15:414:18 | ...[...] | array_flow.rb:414:14:414:19 | ( ... ) | | array_flow.rb:414:15:414:18 | ...[...] | array_flow.rb:414:14:414:19 | ( ... ) | | array_flow.rb:419:5:419:5 | a [element 2] | array_flow.rb:420:9:420:9 | a [element 2] | -| array_flow.rb:419:5:419:5 | a [element 2] | array_flow.rb:420:9:420:9 | a [element 2] | -| array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:5:419:5 | a [element 2] | | array_flow.rb:419:16:419:25 | call to source | array_flow.rb:419:5:419:5 | a [element 2] | | array_flow.rb:420:5:420:5 | b [element 2] | array_flow.rb:423:10:423:10 | b [element 2] | -| array_flow.rb:420:5:420:5 | b [element 2] | array_flow.rb:423:10:423:10 | b [element 2] | -| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | | array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | | array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:26:420:26 | x | -| array_flow.rb:420:9:420:9 | a [element 2] | array_flow.rb:420:26:420:26 | x | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | array_flow.rb:420:5:420:5 | b [element 2] | | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | array_flow.rb:420:5:420:5 | b [element 2] | | array_flow.rb:420:26:420:26 | x | array_flow.rb:421:14:421:14 | x | -| array_flow.rb:420:26:420:26 | x | array_flow.rb:421:14:421:14 | x | -| array_flow.rb:423:10:423:10 | b [element 2] | array_flow.rb:423:10:423:13 | ...[...] | | array_flow.rb:423:10:423:10 | b [element 2] | array_flow.rb:423:10:423:13 | ...[...] | | array_flow.rb:427:5:427:5 | a [element 2] | array_flow.rb:428:9:428:9 | a [element 2] | -| array_flow.rb:427:5:427:5 | a [element 2] | array_flow.rb:428:9:428:9 | a [element 2] | -| array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:5:427:5 | a [element 2] | | array_flow.rb:427:16:427:25 | call to source | array_flow.rb:427:5:427:5 | a [element 2] | | array_flow.rb:428:5:428:5 | b [element 2] | array_flow.rb:431:10:431:10 | b [element 2] | -| array_flow.rb:428:5:428:5 | b [element 2] | array_flow.rb:431:10:431:10 | b [element 2] | -| array_flow.rb:428:9:428:9 | a [element 2] | array_flow.rb:428:9:430:7 | call to each_index [element 2] | | array_flow.rb:428:9:428:9 | a [element 2] | array_flow.rb:428:9:430:7 | call to each_index [element 2] | | array_flow.rb:428:9:430:7 | call to each_index [element 2] | array_flow.rb:428:5:428:5 | b [element 2] | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] | array_flow.rb:428:5:428:5 | b [element 2] | -| array_flow.rb:431:10:431:10 | b [element 2] | array_flow.rb:431:10:431:13 | ...[...] | | array_flow.rb:431:10:431:10 | b [element 2] | array_flow.rb:431:10:431:13 | ...[...] | | array_flow.rb:435:5:435:5 | a [element 3] | array_flow.rb:436:5:436:5 | a [element 3] | -| array_flow.rb:435:5:435:5 | a [element 3] | array_flow.rb:436:5:436:5 | a [element 3] | -| array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:5:435:5 | a [element 3] | | array_flow.rb:435:19:435:28 | call to source | array_flow.rb:435:5:435:5 | a [element 3] | | array_flow.rb:436:5:436:5 | a [element 3] | array_flow.rb:436:25:436:25 | x [element] | -| array_flow.rb:436:5:436:5 | a [element 3] | array_flow.rb:436:25:436:25 | x [element] | -| array_flow.rb:436:25:436:25 | x [element] | array_flow.rb:437:14:437:14 | x [element] | | array_flow.rb:436:25:436:25 | x [element] | array_flow.rb:437:14:437:14 | x [element] | | array_flow.rb:437:14:437:14 | x [element] | array_flow.rb:437:14:437:17 | ...[...] | -| array_flow.rb:437:14:437:14 | x [element] | array_flow.rb:437:14:437:17 | ...[...] | -| array_flow.rb:442:5:442:5 | a [element 3] | array_flow.rb:443:9:443:9 | a [element 3] | | array_flow.rb:442:5:442:5 | a [element 3] | array_flow.rb:443:9:443:9 | a [element 3] | | array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:5:442:5 | a [element 3] | -| array_flow.rb:442:19:442:28 | call to source | array_flow.rb:442:5:442:5 | a [element 3] | -| array_flow.rb:443:5:443:5 | b [element 3] | array_flow.rb:447:10:447:10 | b [element 3] | | array_flow.rb:443:5:443:5 | b [element 3] | array_flow.rb:447:10:447:10 | b [element 3] | | array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | -| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | -| array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:31:443:31 | x | | array_flow.rb:443:9:443:9 | a [element 3] | array_flow.rb:443:31:443:31 | x | | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | array_flow.rb:443:5:443:5 | b [element 3] | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | array_flow.rb:443:5:443:5 | b [element 3] | -| array_flow.rb:443:31:443:31 | x | array_flow.rb:444:14:444:14 | x | | array_flow.rb:443:31:443:31 | x | array_flow.rb:444:14:444:14 | x | | array_flow.rb:447:10:447:10 | b [element 3] | array_flow.rb:447:10:447:13 | ...[...] | -| array_flow.rb:447:10:447:10 | b [element 3] | array_flow.rb:447:10:447:13 | ...[...] | -| array_flow.rb:451:5:451:5 | a [element 3] | array_flow.rb:452:9:452:9 | a [element 3] | | array_flow.rb:451:5:451:5 | a [element 3] | array_flow.rb:452:9:452:9 | a [element 3] | | array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:5:451:5 | a [element 3] | -| array_flow.rb:451:19:451:30 | call to source | array_flow.rb:451:5:451:5 | a [element 3] | -| array_flow.rb:452:5:452:5 | b | array_flow.rb:456:10:456:10 | b | | array_flow.rb:452:5:452:5 | b | array_flow.rb:456:10:456:10 | b | | array_flow.rb:452:9:452:9 | a [element 3] | array_flow.rb:452:46:452:46 | x | -| array_flow.rb:452:9:452:9 | a [element 3] | array_flow.rb:452:46:452:46 | x | -| array_flow.rb:452:9:455:7 | call to each_with_object | array_flow.rb:452:5:452:5 | b | | array_flow.rb:452:9:455:7 | call to each_with_object | array_flow.rb:452:5:452:5 | b | | array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:9:455:7 | call to each_with_object | -| array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:9:455:7 | call to each_with_object | -| array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:48:452:48 | a | | array_flow.rb:452:28:452:39 | call to source | array_flow.rb:452:48:452:48 | a | | array_flow.rb:452:46:452:46 | x | array_flow.rb:453:14:453:14 | x | -| array_flow.rb:452:46:452:46 | x | array_flow.rb:453:14:453:14 | x | -| array_flow.rb:452:48:452:48 | a | array_flow.rb:454:14:454:14 | a | | array_flow.rb:452:48:452:48 | a | array_flow.rb:454:14:454:14 | a | | array_flow.rb:460:5:460:5 | a [element 3] | array_flow.rb:461:9:461:9 | a [element 3] | -| array_flow.rb:460:5:460:5 | a [element 3] | array_flow.rb:461:9:461:9 | a [element 3] | -| array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:5:460:5 | a [element 3] | | array_flow.rb:460:19:460:28 | call to source | array_flow.rb:460:5:460:5 | a [element 3] | | array_flow.rb:461:5:461:5 | b [element 3] | array_flow.rb:462:10:462:10 | b [element 3] | -| array_flow.rb:461:5:461:5 | b [element 3] | array_flow.rb:462:10:462:10 | b [element 3] | -| array_flow.rb:461:9:461:9 | a [element 3] | array_flow.rb:461:9:461:17 | call to entries [element 3] | | array_flow.rb:461:9:461:9 | a [element 3] | array_flow.rb:461:9:461:17 | call to entries [element 3] | | array_flow.rb:461:9:461:17 | call to entries [element 3] | array_flow.rb:461:5:461:5 | b [element 3] | -| array_flow.rb:461:9:461:17 | call to entries [element 3] | array_flow.rb:461:5:461:5 | b [element 3] | -| array_flow.rb:462:10:462:10 | b [element 3] | array_flow.rb:462:10:462:13 | ...[...] | | array_flow.rb:462:10:462:10 | b [element 3] | array_flow.rb:462:10:462:13 | ...[...] | | array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:467:9:467:9 | a [element 3] | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:467:9:467:9 | a [element 3] | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:471:9:471:9 | a [element 3] | | array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:471:9:471:9 | a [element 3] | | array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:473:9:473:9 | a [element 3] | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:473:9:473:9 | a [element 3] | -| array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:477:9:477:9 | a [element 3] | | array_flow.rb:466:5:466:5 | a [element 3] | array_flow.rb:477:9:477:9 | a [element 3] | | array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:467:9:467:9 | a [element 4] | -| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:467:9:467:9 | a [element 4] | -| array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:477:9:477:9 | a [element 4] | | array_flow.rb:466:5:466:5 | a [element 4] | array_flow.rb:477:9:477:9 | a [element 4] | | array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:5:466:5 | a [element 3] | -| array_flow.rb:466:19:466:30 | call to source | array_flow.rb:466:5:466:5 | a [element 3] | -| array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:5:466:5 | a [element 4] | | array_flow.rb:466:33:466:44 | call to source | array_flow.rb:466:5:466:5 | a [element 4] | | array_flow.rb:467:5:467:5 | b | array_flow.rb:470:10:470:10 | b | -| array_flow.rb:467:5:467:5 | b | array_flow.rb:470:10:470:10 | b | -| array_flow.rb:467:9:467:9 | a [element 3] | array_flow.rb:467:9:469:7 | call to fetch | | array_flow.rb:467:9:467:9 | a [element 3] | array_flow.rb:467:9:469:7 | call to fetch | | array_flow.rb:467:9:467:9 | a [element 4] | array_flow.rb:467:9:469:7 | call to fetch | -| array_flow.rb:467:9:467:9 | a [element 4] | array_flow.rb:467:9:469:7 | call to fetch | -| array_flow.rb:467:9:469:7 | call to fetch | array_flow.rb:467:5:467:5 | b | | array_flow.rb:467:9:469:7 | call to fetch | array_flow.rb:467:5:467:5 | b | | array_flow.rb:467:17:467:28 | call to source | array_flow.rb:467:35:467:35 | x | -| array_flow.rb:467:17:467:28 | call to source | array_flow.rb:467:35:467:35 | x | -| array_flow.rb:467:35:467:35 | x | array_flow.rb:468:14:468:14 | x | | array_flow.rb:467:35:467:35 | x | array_flow.rb:468:14:468:14 | x | | array_flow.rb:471:5:471:5 | b | array_flow.rb:472:10:472:10 | b | -| array_flow.rb:471:5:471:5 | b | array_flow.rb:472:10:472:10 | b | -| array_flow.rb:471:9:471:9 | a [element 3] | array_flow.rb:471:9:471:18 | call to fetch | | array_flow.rb:471:9:471:9 | a [element 3] | array_flow.rb:471:9:471:18 | call to fetch | | array_flow.rb:471:9:471:18 | call to fetch | array_flow.rb:471:5:471:5 | b | -| array_flow.rb:471:9:471:18 | call to fetch | array_flow.rb:471:5:471:5 | b | -| array_flow.rb:473:5:473:5 | b | array_flow.rb:474:10:474:10 | b | | array_flow.rb:473:5:473:5 | b | array_flow.rb:474:10:474:10 | b | | array_flow.rb:473:9:473:9 | a [element 3] | array_flow.rb:473:9:473:32 | call to fetch | -| array_flow.rb:473:9:473:9 | a [element 3] | array_flow.rb:473:9:473:32 | call to fetch | -| array_flow.rb:473:9:473:32 | call to fetch | array_flow.rb:473:5:473:5 | b | | array_flow.rb:473:9:473:32 | call to fetch | array_flow.rb:473:5:473:5 | b | | array_flow.rb:473:20:473:31 | call to source | array_flow.rb:473:9:473:32 | call to fetch | -| array_flow.rb:473:20:473:31 | call to source | array_flow.rb:473:9:473:32 | call to fetch | -| array_flow.rb:475:5:475:5 | b | array_flow.rb:476:10:476:10 | b | | array_flow.rb:475:5:475:5 | b | array_flow.rb:476:10:476:10 | b | | array_flow.rb:475:9:475:34 | call to fetch | array_flow.rb:475:5:475:5 | b | -| array_flow.rb:475:9:475:34 | call to fetch | array_flow.rb:475:5:475:5 | b | -| array_flow.rb:475:22:475:33 | call to source | array_flow.rb:475:9:475:34 | call to fetch | | array_flow.rb:475:22:475:33 | call to source | array_flow.rb:475:9:475:34 | call to fetch | | array_flow.rb:477:5:477:5 | b | array_flow.rb:478:10:478:10 | b | -| array_flow.rb:477:5:477:5 | b | array_flow.rb:478:10:478:10 | b | -| array_flow.rb:477:9:477:9 | a [element 3] | array_flow.rb:477:9:477:32 | call to fetch | | array_flow.rb:477:9:477:9 | a [element 3] | array_flow.rb:477:9:477:32 | call to fetch | | array_flow.rb:477:9:477:9 | a [element 4] | array_flow.rb:477:9:477:32 | call to fetch | -| array_flow.rb:477:9:477:9 | a [element 4] | array_flow.rb:477:9:477:32 | call to fetch | -| array_flow.rb:477:9:477:32 | call to fetch | array_flow.rb:477:5:477:5 | b | | array_flow.rb:477:9:477:32 | call to fetch | array_flow.rb:477:5:477:5 | b | | array_flow.rb:477:20:477:31 | call to source | array_flow.rb:477:9:477:32 | call to fetch | -| array_flow.rb:477:20:477:31 | call to source | array_flow.rb:477:9:477:32 | call to fetch | -| array_flow.rb:482:5:482:5 | a [element 3] | array_flow.rb:484:10:484:10 | a [element 3] | | array_flow.rb:482:5:482:5 | a [element 3] | array_flow.rb:484:10:484:10 | a [element 3] | | array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:5:482:5 | a [element 3] | -| array_flow.rb:482:19:482:30 | call to source | array_flow.rb:482:5:482:5 | a [element 3] | -| array_flow.rb:483:5:483:5 | [post] a [element] | array_flow.rb:484:10:484:10 | a [element] | | array_flow.rb:483:5:483:5 | [post] a [element] | array_flow.rb:484:10:484:10 | a [element] | | array_flow.rb:483:12:483:23 | call to source | array_flow.rb:483:5:483:5 | [post] a [element] | -| array_flow.rb:483:12:483:23 | call to source | array_flow.rb:483:5:483:5 | [post] a [element] | -| array_flow.rb:484:10:484:10 | a [element 3] | array_flow.rb:484:10:484:13 | ...[...] | | array_flow.rb:484:10:484:10 | a [element 3] | array_flow.rb:484:10:484:13 | ...[...] | | array_flow.rb:484:10:484:10 | a [element] | array_flow.rb:484:10:484:13 | ...[...] | -| array_flow.rb:484:10:484:10 | a [element] | array_flow.rb:484:10:484:13 | ...[...] | -| array_flow.rb:485:5:485:5 | [post] a [element] | array_flow.rb:486:10:486:10 | a [element] | | array_flow.rb:485:5:485:5 | [post] a [element] | array_flow.rb:486:10:486:10 | a [element] | | array_flow.rb:485:12:485:23 | call to source | array_flow.rb:485:5:485:5 | [post] a [element] | -| array_flow.rb:485:12:485:23 | call to source | array_flow.rb:485:5:485:5 | [post] a [element] | -| array_flow.rb:486:10:486:10 | a [element] | array_flow.rb:486:10:486:13 | ...[...] | | array_flow.rb:486:10:486:10 | a [element] | array_flow.rb:486:10:486:13 | ...[...] | | array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:490:10:490:10 | a [element] | -| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:490:10:490:10 | a [element] | -| array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | | array_flow.rb:487:5:487:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | | array_flow.rb:488:9:488:20 | call to source | array_flow.rb:487:5:487:5 | [post] a [element] | -| array_flow.rb:488:9:488:20 | call to source | array_flow.rb:487:5:487:5 | [post] a [element] | -| array_flow.rb:490:10:490:10 | a [element] | array_flow.rb:490:10:490:13 | ...[...] | | array_flow.rb:490:10:490:10 | a [element] | array_flow.rb:490:10:490:13 | ...[...] | | array_flow.rb:491:5:491:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | -| array_flow.rb:491:5:491:5 | [post] a [element] | array_flow.rb:494:10:494:10 | a [element] | -| array_flow.rb:492:9:492:20 | call to source | array_flow.rb:491:5:491:5 | [post] a [element] | | array_flow.rb:492:9:492:20 | call to source | array_flow.rb:491:5:491:5 | [post] a [element] | | array_flow.rb:494:10:494:10 | a [element] | array_flow.rb:494:10:494:13 | ...[...] | -| array_flow.rb:494:10:494:10 | a [element] | array_flow.rb:494:10:494:13 | ...[...] | -| array_flow.rb:498:5:498:5 | a [element 3] | array_flow.rb:499:9:499:9 | a [element 3] | | array_flow.rb:498:5:498:5 | a [element 3] | array_flow.rb:499:9:499:9 | a [element 3] | | array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:5:498:5 | a [element 3] | -| array_flow.rb:498:19:498:28 | call to source | array_flow.rb:498:5:498:5 | a [element 3] | -| array_flow.rb:499:5:499:5 | b [element] | array_flow.rb:502:10:502:10 | b [element] | | array_flow.rb:499:5:499:5 | b [element] | array_flow.rb:502:10:502:10 | b [element] | | array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:9:501:7 | call to filter [element] | -| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:9:501:7 | call to filter [element] | -| array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:22:499:22 | x | | array_flow.rb:499:9:499:9 | a [element 3] | array_flow.rb:499:22:499:22 | x | | array_flow.rb:499:9:501:7 | call to filter [element] | array_flow.rb:499:5:499:5 | b [element] | -| array_flow.rb:499:9:501:7 | call to filter [element] | array_flow.rb:499:5:499:5 | b [element] | -| array_flow.rb:499:22:499:22 | x | array_flow.rb:500:14:500:14 | x | | array_flow.rb:499:22:499:22 | x | array_flow.rb:500:14:500:14 | x | | array_flow.rb:502:10:502:10 | b [element] | array_flow.rb:502:10:502:13 | ...[...] | -| array_flow.rb:502:10:502:10 | b [element] | array_flow.rb:502:10:502:13 | ...[...] | -| array_flow.rb:506:5:506:5 | a [element 3] | array_flow.rb:507:9:507:9 | a [element 3] | | array_flow.rb:506:5:506:5 | a [element 3] | array_flow.rb:507:9:507:9 | a [element 3] | | array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:5:506:5 | a [element 3] | -| array_flow.rb:506:19:506:28 | call to source | array_flow.rb:506:5:506:5 | a [element 3] | -| array_flow.rb:507:5:507:5 | b [element] | array_flow.rb:511:10:511:10 | b [element] | | array_flow.rb:507:5:507:5 | b [element] | array_flow.rb:511:10:511:10 | b [element] | | array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:9:510:7 | call to filter_map [element] | -| array_flow.rb:507:9:507:9 | a [element 3] | array_flow.rb:507:9:510: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:510:7 | call to filter_map [element] | array_flow.rb:507:5:507:5 | b [element] | -| array_flow.rb:507:9:510: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:511:10:511:10 | b [element] | array_flow.rb:511:10:511:13 | ...[...] | -| array_flow.rb:511:10:511:10 | b [element] | array_flow.rb:511:10:511:13 | ...[...] | -| array_flow.rb:518:5:518:5 | d [element] | array_flow.rb:521:10:521:10 | d [element] | | array_flow.rb:518:5:518:5 | d [element] | array_flow.rb:521:10:521:10 | d [element] | | array_flow.rb:518:9:520:7 | call to filter_map [element] | array_flow.rb:518:5:518:5 | d [element] | -| array_flow.rb:518:9:520:7 | call to filter_map [element] | array_flow.rb:518:5:518:5 | d [element] | -| array_flow.rb:519:9:519:20 | call to source | array_flow.rb:518:9:520:7 | call to filter_map [element] | | array_flow.rb:519:9:519:20 | call to source | array_flow.rb:518:9:520:7 | call to filter_map [element] | | array_flow.rb:521:10:521:10 | d [element] | array_flow.rb:521:10:521:13 | ...[...] | -| array_flow.rb:521:10:521:10 | d [element] | array_flow.rb:521:10:521:13 | ...[...] | -| array_flow.rb:525:5:525:5 | a [element 3] | array_flow.rb:526:9:526:9 | a [element 3] | | array_flow.rb:525:5:525:5 | a [element 3] | array_flow.rb:526:9:526:9 | a [element 3] | | array_flow.rb:525:19:525:28 | call to source | array_flow.rb:525:5:525:5 | a [element 3] | -| array_flow.rb:525:19:525:28 | call to source | array_flow.rb:525:5:525:5 | a [element 3] | -| array_flow.rb:526:5:526:5 | b [element] | array_flow.rb:531:10:531:10 | b [element] | | array_flow.rb:526:5:526:5 | b [element] | array_flow.rb:531:10:531:10 | b [element] | | array_flow.rb:526:9:526:9 | [post] a [element] | array_flow.rb:530:10:530:10 | a [element] | -| array_flow.rb:526:9:526:9 | [post] a [element] | array_flow.rb:530:10:530:10 | a [element] | -| array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:9:526:9 | [post] a [element] | | array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:9:526:9 | [post] a [element] | | array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:9:529:7 | call to filter! [element] | -| array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:9:529:7 | call to filter! [element] | -| array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:23:526:23 | x | | array_flow.rb:526:9:526:9 | a [element 3] | array_flow.rb:526:23:526:23 | x | | array_flow.rb:526:9:529:7 | call to filter! [element] | array_flow.rb:526:5:526:5 | b [element] | -| array_flow.rb:526:9:529:7 | call to filter! [element] | array_flow.rb:526:5:526:5 | b [element] | -| array_flow.rb:526:23:526:23 | x | array_flow.rb:527:14:527:14 | x | | array_flow.rb:526:23:526:23 | x | array_flow.rb:527:14:527:14 | x | | array_flow.rb:530:10:530:10 | a [element] | array_flow.rb:530:10:530:13 | ...[...] | -| array_flow.rb:530:10:530:10 | a [element] | array_flow.rb:530:10:530:13 | ...[...] | -| array_flow.rb:531:10:531:10 | b [element] | array_flow.rb:531:10:531:13 | ...[...] | | array_flow.rb:531:10:531:10 | b [element] | array_flow.rb:531:10:531:13 | ...[...] | | array_flow.rb:535:5:535:5 | a [element 3] | array_flow.rb:536:9:536:9 | a [element 3] | -| array_flow.rb:535:5:535:5 | a [element 3] | array_flow.rb:536:9:536:9 | a [element 3] | -| array_flow.rb:535:19:535:30 | call to source | array_flow.rb:535:5:535:5 | a [element 3] | | array_flow.rb:535:19:535:30 | call to source | array_flow.rb:535:5:535:5 | a [element 3] | | array_flow.rb:536:5:536:5 | b | array_flow.rb:539:10:539:10 | b | -| array_flow.rb:536:5:536:5 | b | array_flow.rb:539:10:539:10 | b | -| array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:9:538:7 | call to find | | array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:9:538:7 | call to find | | array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:41:536:41 | x | -| array_flow.rb:536:9:536:9 | a [element 3] | array_flow.rb:536:41:536:41 | x | -| array_flow.rb:536:9:538:7 | call to find | array_flow.rb:536:5:536:5 | b | | array_flow.rb:536:9:538:7 | call to find | array_flow.rb:536:5:536:5 | b | | array_flow.rb:536:21:536:32 | call to source | array_flow.rb:536:9:538:7 | call to find | -| array_flow.rb:536:21:536:32 | call to source | array_flow.rb:536:9:538:7 | call to find | -| array_flow.rb:536:41:536:41 | x | array_flow.rb:537:14:537:14 | x | | array_flow.rb:536:41:536:41 | x | array_flow.rb:537:14:537:14 | x | | array_flow.rb:543:5:543:5 | a [element 3] | array_flow.rb:544:9:544:9 | a [element 3] | -| array_flow.rb:543:5:543:5 | a [element 3] | array_flow.rb:544:9:544:9 | a [element 3] | -| array_flow.rb:543:19:543:28 | call to source | array_flow.rb:543:5:543:5 | a [element 3] | | array_flow.rb:543:19:543:28 | call to source | array_flow.rb:543:5:543:5 | a [element 3] | | array_flow.rb:544:5:544:5 | b [element] | array_flow.rb:547:10:547:10 | b [element] | -| array_flow.rb:544:5:544:5 | b [element] | array_flow.rb:547:10:547:10 | b [element] | -| array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:9:546:7 | call to find_all [element] | | array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:9:546:7 | call to find_all [element] | | array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:24:544:24 | x | -| array_flow.rb:544:9:544:9 | a [element 3] | array_flow.rb:544:24:544:24 | x | -| array_flow.rb:544:9:546:7 | call to find_all [element] | array_flow.rb:544:5:544:5 | b [element] | | array_flow.rb:544:9:546:7 | call to find_all [element] | array_flow.rb:544:5:544:5 | b [element] | | array_flow.rb:544:24:544:24 | x | array_flow.rb:545:14:545:14 | x | -| array_flow.rb:544:24:544:24 | x | array_flow.rb:545:14:545:14 | x | -| array_flow.rb:547:10:547:10 | b [element] | array_flow.rb:547:10:547:13 | ...[...] | | array_flow.rb:547:10:547:10 | b [element] | array_flow.rb:547:10:547:13 | ...[...] | | array_flow.rb:551:5:551:5 | a [element 3] | array_flow.rb:552:5:552:5 | a [element 3] | -| array_flow.rb:551:5:551:5 | a [element 3] | array_flow.rb:552:5:552:5 | a [element 3] | -| array_flow.rb:551:19:551:28 | call to source | array_flow.rb:551:5:551:5 | a [element 3] | | array_flow.rb:551:19:551:28 | call to source | array_flow.rb:551:5:551:5 | a [element 3] | | array_flow.rb:552:5:552:5 | a [element 3] | array_flow.rb:552:22:552:22 | x | -| array_flow.rb:552:5:552:5 | a [element 3] | array_flow.rb:552:22:552:22 | x | -| array_flow.rb:552:22:552:22 | x | array_flow.rb:553:14:553:14 | x | | array_flow.rb:552:22:552:22 | x | array_flow.rb:553:14:553:14 | x | | array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:560:10:560:10 | a [element 0] | -| array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:560:10:560:10 | a [element 0] | -| array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:561:9:561:9 | a [element 0] | | array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:561:9:561:9 | a [element 0] | | array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:564:9:564:9 | a [element 0] | -| array_flow.rb:558:5:558:5 | a [element 0] | array_flow.rb:564:9:564:9 | a [element 0] | -| array_flow.rb:558:5:558:5 | a [element 3] | array_flow.rb:564:9:564:9 | a [element 3] | | array_flow.rb:558:5:558:5 | a [element 3] | array_flow.rb:564:9:564:9 | a [element 3] | | array_flow.rb:558:10:558:21 | call to source | array_flow.rb:558:5:558:5 | a [element 0] | -| array_flow.rb:558:10:558:21 | call to source | array_flow.rb:558:5:558:5 | a [element 0] | -| array_flow.rb:558:30:558:41 | call to source | array_flow.rb:558:5:558:5 | a [element 3] | | array_flow.rb:558:30:558:41 | call to source | array_flow.rb:558:5:558:5 | a [element 3] | | array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:560:10:560:10 | a [element] | -| array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:560:10:560:10 | a [element] | -| array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:561:9:561:9 | a [element] | | array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:561:9:561:9 | a [element] | | array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:564:9:564:9 | a [element] | -| array_flow.rb:559:5:559:5 | [post] a [element] | array_flow.rb:564:9:564:9 | a [element] | -| array_flow.rb:559:12:559:23 | call to source | array_flow.rb:559:5:559:5 | [post] a [element] | | array_flow.rb:559:12:559:23 | call to source | array_flow.rb:559:5:559:5 | [post] a [element] | | array_flow.rb:560:10:560:10 | a [element 0] | array_flow.rb:560:10:560:16 | call to first | -| array_flow.rb:560:10:560:10 | a [element 0] | array_flow.rb:560:10:560:16 | call to first | -| array_flow.rb:560:10:560:10 | a [element] | array_flow.rb:560:10:560:16 | call to first | | array_flow.rb:560:10:560:10 | a [element] | array_flow.rb:560:10:560:16 | call to first | | array_flow.rb:561:5:561:5 | b [element 0] | array_flow.rb:562:10:562:10 | b [element 0] | -| array_flow.rb:561:5:561:5 | b [element 0] | array_flow.rb:562:10:562:10 | b [element 0] | -| array_flow.rb:561:5:561:5 | b [element] | array_flow.rb:562:10:562:10 | b [element] | | array_flow.rb:561:5:561:5 | b [element] | array_flow.rb:562:10:562:10 | b [element] | | array_flow.rb:561:5:561:5 | b [element] | array_flow.rb:563:10:563:10 | b [element] | -| array_flow.rb:561:5:561:5 | b [element] | array_flow.rb:563:10:563:10 | b [element] | -| array_flow.rb:561:9:561:9 | a [element 0] | array_flow.rb:561:9:561:18 | call to first [element 0] | | array_flow.rb:561:9:561:9 | a [element 0] | array_flow.rb:561:9:561:18 | call to first [element 0] | | array_flow.rb:561:9:561:9 | a [element] | array_flow.rb:561:9:561:18 | call to first [element] | -| array_flow.rb:561:9:561:9 | a [element] | array_flow.rb:561:9:561:18 | call to first [element] | -| array_flow.rb:561:9:561:18 | call to first [element 0] | array_flow.rb:561:5:561:5 | b [element 0] | | array_flow.rb:561:9:561:18 | call to first [element 0] | array_flow.rb:561:5:561:5 | b [element 0] | | array_flow.rb:561:9:561:18 | call to first [element] | array_flow.rb:561:5:561:5 | b [element] | -| array_flow.rb:561:9:561:18 | call to first [element] | array_flow.rb:561:5:561:5 | b [element] | -| array_flow.rb:562:10:562:10 | b [element 0] | array_flow.rb:562:10:562:13 | ...[...] | | array_flow.rb:562:10:562:10 | b [element 0] | array_flow.rb:562:10:562:13 | ...[...] | | array_flow.rb:562:10:562:10 | b [element] | array_flow.rb:562:10:562:13 | ...[...] | -| array_flow.rb:562:10:562:10 | b [element] | array_flow.rb:562:10:562:13 | ...[...] | -| array_flow.rb:563:10:563:10 | b [element] | array_flow.rb:563:10:563:13 | ...[...] | | array_flow.rb:563:10:563:10 | b [element] | array_flow.rb:563:10:563:13 | ...[...] | | array_flow.rb:564:5:564:5 | c [element 0] | array_flow.rb:565:10:565:10 | c [element 0] | -| array_flow.rb:564:5:564:5 | c [element 0] | array_flow.rb:565:10:565:10 | c [element 0] | -| array_flow.rb:564:5:564:5 | c [element 3] | array_flow.rb:566:10:566:10 | c [element 3] | | array_flow.rb:564:5:564:5 | c [element 3] | array_flow.rb:566:10:566:10 | c [element 3] | | array_flow.rb:564:5:564:5 | c [element] | array_flow.rb:565:10:565:10 | c [element] | -| array_flow.rb:564:5:564:5 | c [element] | array_flow.rb:565:10:565:10 | c [element] | -| array_flow.rb:564:5:564:5 | c [element] | array_flow.rb:566:10:566:10 | c [element] | | array_flow.rb:564:5:564:5 | c [element] | array_flow.rb:566:10:566:10 | c [element] | | array_flow.rb:564:9:564:9 | a [element 0] | array_flow.rb:564:9:564:18 | call to first [element 0] | -| array_flow.rb:564:9:564:9 | a [element 0] | array_flow.rb:564:9:564:18 | call to first [element 0] | -| array_flow.rb:564:9:564:9 | a [element 3] | array_flow.rb:564:9:564:18 | call to first [element 3] | | array_flow.rb:564:9:564:9 | a [element 3] | array_flow.rb:564:9:564:18 | call to first [element 3] | | array_flow.rb:564:9:564:9 | a [element] | array_flow.rb:564:9:564:18 | call to first [element] | -| array_flow.rb:564:9:564:9 | a [element] | array_flow.rb:564:9:564:18 | call to first [element] | -| array_flow.rb:564:9:564:18 | call to first [element 0] | array_flow.rb:564:5:564:5 | c [element 0] | | array_flow.rb:564:9:564:18 | call to first [element 0] | array_flow.rb:564:5:564:5 | c [element 0] | | array_flow.rb:564:9:564:18 | call to first [element 3] | array_flow.rb:564:5:564:5 | c [element 3] | -| array_flow.rb:564:9:564:18 | call to first [element 3] | array_flow.rb:564:5:564:5 | c [element 3] | -| array_flow.rb:564:9:564:18 | call to first [element] | array_flow.rb:564:5:564:5 | c [element] | | array_flow.rb:564:9:564:18 | call to first [element] | array_flow.rb:564:5:564:5 | c [element] | | array_flow.rb:565:10:565:10 | c [element 0] | array_flow.rb:565:10:565:13 | ...[...] | -| array_flow.rb:565:10:565:10 | c [element 0] | array_flow.rb:565:10:565:13 | ...[...] | -| array_flow.rb:565:10:565:10 | c [element] | array_flow.rb:565:10:565:13 | ...[...] | | array_flow.rb:565:10:565:10 | c [element] | array_flow.rb:565:10:565:13 | ...[...] | | array_flow.rb:566:10:566:10 | c [element 3] | array_flow.rb:566:10:566:13 | ...[...] | -| array_flow.rb:566:10:566:10 | c [element 3] | array_flow.rb:566:10:566:13 | ...[...] | -| array_flow.rb:566:10:566:10 | c [element] | array_flow.rb:566:10:566:13 | ...[...] | | array_flow.rb:566:10:566:10 | c [element] | array_flow.rb:566:10:566:13 | ...[...] | | array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:571:9:571:9 | a [element 2] | -| array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:571:9:571:9 | a [element 2] | -| array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:576:9:576:9 | a [element 2] | | array_flow.rb:570:5:570:5 | a [element 2] | array_flow.rb:576:9:576:9 | a [element 2] | | array_flow.rb:570:16:570:27 | call to source | array_flow.rb:570:5:570:5 | a [element 2] | -| array_flow.rb:570:16:570:27 | call to source | array_flow.rb:570:5:570:5 | a [element 2] | -| array_flow.rb:571:5:571:5 | b [element] | array_flow.rb:575:10:575:10 | b [element] | | array_flow.rb:571:5:571:5 | b [element] | array_flow.rb:575:10:575:10 | b [element] | | array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:9:574:7 | call to flat_map [element] | -| array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:9:574:7 | call to flat_map [element] | -| array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:24:571:24 | x | | array_flow.rb:571:9:571:9 | a [element 2] | array_flow.rb:571:24:571:24 | x | | array_flow.rb:571:9:574:7 | call to flat_map [element] | array_flow.rb:571:5:571:5 | b [element] | -| array_flow.rb:571:9:574:7 | call to flat_map [element] | array_flow.rb:571:5:571:5 | b [element] | -| array_flow.rb:571:24:571:24 | x | array_flow.rb:572:14:572:14 | x | | array_flow.rb:571:24:571:24 | x | array_flow.rb:572:14:572:14 | x | | array_flow.rb:573:13:573:24 | call to source | array_flow.rb:571:9:574:7 | call to flat_map [element] | -| array_flow.rb:573:13:573:24 | call to source | array_flow.rb:571:9:574:7 | call to flat_map [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:576:5:576:5 | b [element] | array_flow.rb:580:10:580:10 | b [element] | -| array_flow.rb:576:5:576:5 | b [element] | array_flow.rb:580:10:580:10 | b [element] | -| array_flow.rb:576:9:576:9 | a [element 2] | array_flow.rb:576:24:576:24 | x | | array_flow.rb:576:9:576:9 | a [element 2] | array_flow.rb:576:24:576:24 | x | | array_flow.rb:576:9:579:7 | call to flat_map [element] | array_flow.rb:576:5:576:5 | b [element] | -| array_flow.rb:576:9:579:7 | call to flat_map [element] | array_flow.rb:576:5:576:5 | b [element] | -| array_flow.rb:576:24:576:24 | x | array_flow.rb:577:14:577:14 | x | | array_flow.rb:576:24:576:24 | x | array_flow.rb:577:14:577:14 | x | | array_flow.rb:578:9:578:20 | call to source | array_flow.rb:576:9:579:7 | call to flat_map [element] | -| array_flow.rb:578:9:578:20 | call to source | array_flow.rb:576:9:579:7 | call to flat_map [element] | -| array_flow.rb:580:10:580:10 | b [element] | array_flow.rb:580:10:580:13 | ...[...] | | array_flow.rb:580:10:580:10 | b [element] | array_flow.rb:580:10:580:13 | ...[...] | | array_flow.rb:584:5:584:5 | a [element 2, element 1] | array_flow.rb:585:9:585:9 | a [element 2, element 1] | -| array_flow.rb:584:5:584:5 | a [element 2, element 1] | array_flow.rb:585:9:585:9 | a [element 2, element 1] | -| array_flow.rb:584:20:584:29 | call to source | array_flow.rb:584:5:584:5 | a [element 2, element 1] | | array_flow.rb:584:20:584:29 | call to source | array_flow.rb:584:5:584:5 | a [element 2, element 1] | | array_flow.rb:585:5:585:5 | b [element] | array_flow.rb:586:10:586:10 | b [element] | -| array_flow.rb:585:5:585:5 | b [element] | array_flow.rb:586:10:586:10 | b [element] | -| array_flow.rb:585:9:585:9 | a [element 2, element 1] | array_flow.rb:585:9:585:17 | call to flatten [element] | | array_flow.rb:585:9:585:9 | a [element 2, element 1] | array_flow.rb:585:9:585:17 | call to flatten [element] | | array_flow.rb:585:9:585:17 | call to flatten [element] | array_flow.rb:585:5:585:5 | b [element] | -| array_flow.rb:585:9:585:17 | call to flatten [element] | array_flow.rb:585:5:585:5 | b [element] | -| array_flow.rb:586:10:586:10 | b [element] | array_flow.rb:586:10:586:13 | ...[...] | | array_flow.rb:586:10:586:10 | b [element] | array_flow.rb:586:10:586:13 | ...[...] | | array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:591:10:591:10 | a [element 2, element 1] | -| array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:591:10:591:10 | a [element 2, element 1] | -| array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | a [element 2, element 1] | | array_flow.rb:590:5:590:5 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | a [element 2, element 1] | | array_flow.rb:590:20:590:29 | call to source | array_flow.rb:590:5:590:5 | a [element 2, element 1] | -| array_flow.rb:590:20:590:29 | call to source | array_flow.rb:590:5:590:5 | a [element 2, element 1] | -| array_flow.rb:591:10:591:10 | a [element 2, element 1] | array_flow.rb:591:10:591:13 | ...[...] [element 1] | | array_flow.rb:591:10:591:10 | a [element 2, element 1] | array_flow.rb:591:10:591:13 | ...[...] [element 1] | | array_flow.rb:591:10:591:13 | ...[...] [element 1] | array_flow.rb:591:10:591:16 | ...[...] | -| array_flow.rb:591:10:591:13 | ...[...] [element 1] | array_flow.rb:591:10:591:16 | ...[...] | -| array_flow.rb:592:5:592:5 | b [element, element 1] | array_flow.rb:596:10:596:10 | b [element, element 1] | | array_flow.rb:592:5:592:5 | b [element, element 1] | array_flow.rb:596:10:596:10 | b [element, element 1] | | array_flow.rb:592:5:592:5 | b [element] | array_flow.rb:595:10:595:10 | b [element] | -| array_flow.rb:592:5:592:5 | b [element] | array_flow.rb:595:10:595: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 | [post] a [element, element 1] | array_flow.rb:594:10:594:10 | a [element, element 1] | | array_flow.rb:592:9:592:9 | [post] a [element, element 1] | array_flow.rb:594:10:594:10 | a [element, element 1] | | array_flow.rb:592:9:592:9 | [post] a [element] | array_flow.rb:593:10:593:10 | a [element] | -| array_flow.rb:592:9:592:9 | [post] a [element] | array_flow.rb:593:10:593:10 | a [element] | -| array_flow.rb:592:9:592:9 | [post] a [element] | array_flow.rb:594:10:594:10 | a [element] | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a [element, element 1] | | array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a [element, element 1] | | array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a [element] | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:9 | [post] a [element] | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | | array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | | array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! [element] | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | array_flow.rb:592:9:592:18 | call to flatten! [element] | -| array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | array_flow.rb:592:5:592:5 | b [element, element 1] | | array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | array_flow.rb:592:5:592:5 | b [element, element 1] | | array_flow.rb:592:9:592:18 | call to flatten! [element] | array_flow.rb:592:5:592:5 | b [element] | -| array_flow.rb:592:9:592:18 | call to flatten! [element] | array_flow.rb:592:5:592:5 | b [element] | -| array_flow.rb:593:10:593:10 | a [element] | array_flow.rb:593:10:593:13 | ...[...] | | array_flow.rb:593:10:593:10 | a [element] | array_flow.rb:593:10:593:13 | ...[...] | | array_flow.rb:594:10:594:10 | a [element, element 1] | array_flow.rb:594:10:594:13 | ...[...] [element 1] | -| array_flow.rb:594:10:594:10 | a [element, element 1] | array_flow.rb:594:10:594:13 | ...[...] [element 1] | -| array_flow.rb:594:10:594:10 | a [element] | array_flow.rb:594:10:594:13 | ...[...] | -| array_flow.rb:594:10:594:13 | ...[...] | array_flow.rb:594:10:594:16 | ...[...] | -| array_flow.rb:594:10:594:13 | ...[...] [element 1] | array_flow.rb:594:10:594:16 | ...[...] | | array_flow.rb:594:10:594:13 | ...[...] [element 1] | array_flow.rb:594:10:594:16 | ...[...] | | array_flow.rb:595:10:595:10 | b [element] | array_flow.rb:595:10:595:13 | ...[...] | -| array_flow.rb:595:10:595:10 | b [element] | array_flow.rb:595:10:595:13 | ...[...] | -| array_flow.rb:596:10:596:10 | b [element, element 1] | array_flow.rb:596:10:596:13 | ...[...] [element 1] | | array_flow.rb:596:10:596:10 | b [element, element 1] | array_flow.rb:596:10:596:13 | ...[...] [element 1] | -| array_flow.rb:596:10:596:10 | b [element] | array_flow.rb:596:10:596:13 | ...[...] | -| array_flow.rb:596:10:596:13 | ...[...] | array_flow.rb:596:10:596:16 | ...[...] | | array_flow.rb:596:10:596:13 | ...[...] [element 1] | array_flow.rb:596:10:596:16 | ...[...] | -| array_flow.rb:596:10:596:13 | ...[...] [element 1] | array_flow.rb:596:10:596:16 | ...[...] | -| 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:20 | call to grep [element] | | array_flow.rb:601:9:601:9 | a [element 3] | array_flow.rb:601:9:601:20 | call to grep [element] | | array_flow.rb:601:9:601:20 | call to grep [element] | array_flow.rb:601:5:601:5 | b [element] | -| array_flow.rb:601:9:601:20 | call to grep [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:26:603:26 | x | | array_flow.rb:603:9:603:9 | a [element 3] | array_flow.rb:603:26:603:26 | x | | array_flow.rb:603:9:606:7 | call to grep [element] | array_flow.rb:603:5:603:5 | b [element] | -| array_flow.rb:603:9:606:7 | call to grep [element] | array_flow.rb:603:5:603:5 | b [element] | -| array_flow.rb:603:26:603:26 | x | array_flow.rb:604:14:604:14 | x | | array_flow.rb:603:26:603:26 | 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 [element] | -| array_flow.rb:605:9:605:20 | call to source | array_flow.rb:603:9:606:7 | call to grep [element] | -| array_flow.rb:607:10:607:10 | b [element] | array_flow.rb:607:10:607:13 | ...[...] | | array_flow.rb:607:10:607:10 | b [element] | array_flow.rb:607:10:607:13 | ...[...] | | array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:612:9:612:9 | a [element 3] | -| array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:612:9:612:9 | a [element 3] | -| array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:614:9:614:9 | a [element 3] | | array_flow.rb:611:5:611:5 | a [element 3] | array_flow.rb:614:9:614: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:5:612:5 | b [element] | array_flow.rb:613:10:613:10 | b [element] | | array_flow.rb:612:5:612:5 | b [element] | array_flow.rb:613:10:613:10 | b [element] | | array_flow.rb:612:9:612:9 | a [element 3] | array_flow.rb:612:9:612:21 | call to grep_v [element] | -| array_flow.rb:612:9:612:9 | a [element 3] | array_flow.rb:612:9:612:21 | call to grep_v [element] | -| array_flow.rb:612:9:612:21 | call to grep_v [element] | array_flow.rb:612:5:612:5 | b [element] | | array_flow.rb:612:9:612:21 | call to grep_v [element] | array_flow.rb:612:5:612:5 | b [element] | | array_flow.rb:613:10:613:10 | b [element] | array_flow.rb:613:10:613:13 | ...[...] | -| array_flow.rb:613:10:613:10 | b [element] | array_flow.rb:613:10:613:13 | ...[...] | -| array_flow.rb:614:5:614:5 | b [element] | array_flow.rb:618:10:618:10 | b [element] | | array_flow.rb:614:5:614:5 | b [element] | array_flow.rb:618:10:618:10 | b [element] | | array_flow.rb:614:9:614:9 | a [element 3] | array_flow.rb:614:27:614:27 | x | -| array_flow.rb:614:9:614:9 | a [element 3] | array_flow.rb:614:27:614:27 | x | -| array_flow.rb:614:9:617:7 | call to grep_v [element] | array_flow.rb:614:5:614:5 | b [element] | | array_flow.rb:614:9:617:7 | call to grep_v [element] | array_flow.rb:614:5:614:5 | b [element] | | array_flow.rb:614:27:614:27 | x | array_flow.rb:615:14:615:14 | x | -| array_flow.rb:614:27:614:27 | x | array_flow.rb:615:14:615:14 | x | -| array_flow.rb:616:9:616:20 | call to source | array_flow.rb:614:9:617:7 | call to grep_v [element] | | array_flow.rb:616:9:616:20 | call to source | array_flow.rb:614:9:617:7 | call to grep_v [element] | | array_flow.rb:618:10:618:10 | b [element] | array_flow.rb:618:10:618:13 | ...[...] | -| array_flow.rb:618:10:618:10 | b [element] | array_flow.rb:618:10:618:13 | ...[...] | -| array_flow.rb:622:5:622:5 | a [element 3] | array_flow.rb:623:9:623:9 | a [element 3] | | array_flow.rb:622:5:622:5 | a [element 3] | array_flow.rb:623:9:623:9 | a [element 3] | | array_flow.rb:622:19:622:30 | call to source | array_flow.rb:622:5:622:5 | a [element 3] | -| array_flow.rb:622:19:622:30 | call to source | array_flow.rb:622:5:622:5 | a [element 3] | -| array_flow.rb:623:9:623:9 | a [element 3] | array_flow.rb:623:24:623:24 | x | | array_flow.rb:623:9:623:9 | a [element 3] | array_flow.rb:623:24:623:24 | x | | array_flow.rb:623:24:623:24 | x | array_flow.rb:624:14:624:14 | x | -| array_flow.rb:623:24:623:24 | x | array_flow.rb:624:14:624:14 | x | -| array_flow.rb:631:5:631:5 | a [element 3] | array_flow.rb:632:5:632:5 | a [element 3] | | array_flow.rb:631:5:631:5 | a [element 3] | array_flow.rb:632:5:632:5 | a [element 3] | | array_flow.rb:631:19:631:28 | call to source | array_flow.rb:631:5:631:5 | a [element 3] | -| array_flow.rb:631:19:631:28 | call to source | array_flow.rb:631:5:631:5 | a [element 3] | -| array_flow.rb:632:5:632:5 | a [element 3] | array_flow.rb:632:17:632:17 | x | | array_flow.rb:632:5:632:5 | a [element 3] | array_flow.rb:632:17:632:17 | x | | array_flow.rb:632:17:632:17 | x | array_flow.rb:633:14:633:14 | x | -| array_flow.rb:632:17:632:17 | x | array_flow.rb:633:14:633:14 | x | -| array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:639:9:639:9 | a [element 0] | | array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:639:9:639:9 | a [element 0] | | array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:645:9:645:9 | a [element 0] | -| array_flow.rb:638:5:638:5 | a [element 0] | array_flow.rb:645:9:645:9 | a [element 0] | -| array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:639:9:639:9 | a [element 2] | | array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:639:9:639:9 | a [element 2] | | array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:645:9:645:9 | a [element 2] | -| array_flow.rb:638:5:638:5 | a [element 2] | array_flow.rb:645:9:645:9 | a [element 2] | -| array_flow.rb:638:10:638:21 | call to source | array_flow.rb:638:5:638:5 | a [element 0] | | array_flow.rb:638:10:638:21 | call to source | array_flow.rb:638:5:638:5 | a [element 0] | | array_flow.rb:638:27:638:38 | call to source | array_flow.rb:638:5:638:5 | a [element 2] | -| array_flow.rb:638:27:638:38 | call to source | array_flow.rb:638:5:638:5 | a [element 2] | -| array_flow.rb:639:5:639:5 | b | array_flow.rb:644:10:644:10 | b | | array_flow.rb:639:5:639:5 | b | array_flow.rb:644:10:644:10 | b | | array_flow.rb:639:9:639:9 | a [element 0] | array_flow.rb:639:22:639:22 | x | -| array_flow.rb:639:9:639:9 | a [element 0] | array_flow.rb:639:22:639:22 | x | -| array_flow.rb:639:9:639:9 | a [element 2] | array_flow.rb:639:25:639:25 | y | | array_flow.rb:639:9:639:9 | a [element 2] | array_flow.rb:639:25:639:25 | y | | array_flow.rb:639:9:643:7 | call to inject | array_flow.rb:639:5:639:5 | b | -| array_flow.rb:639:9:643:7 | call to inject | array_flow.rb:639:5:639:5 | b | -| array_flow.rb:639:22:639:22 | x | array_flow.rb:640:14:640:14 | x | | array_flow.rb:639:22:639:22 | x | array_flow.rb:640:14:640:14 | x | | array_flow.rb:639:25:639:25 | y | array_flow.rb:641:14:641:14 | y | -| array_flow.rb:639:25:639:25 | y | array_flow.rb:641:14:641:14 | y | -| array_flow.rb:642:9:642:19 | call to source | array_flow.rb:639:9:643:7 | call to inject | | array_flow.rb:642:9:642:19 | call to source | array_flow.rb:639:9:643:7 | call to inject | | array_flow.rb:645:5:645:5 | c | array_flow.rb:650:10:650:10 | c | -| array_flow.rb:645:5:645:5 | c | array_flow.rb:650:10:650:10 | c | -| array_flow.rb:645:9:645:9 | a [element 0] | array_flow.rb:645:28:645:28 | y | | array_flow.rb:645:9:645:9 | a [element 0] | array_flow.rb:645:28:645:28 | y | | array_flow.rb:645:9:645:9 | a [element 2] | array_flow.rb:645:28:645:28 | y | -| array_flow.rb:645:9:645:9 | a [element 2] | array_flow.rb:645:28:645:28 | y | -| array_flow.rb:645:9:649:7 | call to inject | array_flow.rb:645:5:645:5 | c | | array_flow.rb:645:9:649:7 | call to inject | array_flow.rb:645:5:645:5 | c | | array_flow.rb:645:28:645:28 | y | array_flow.rb:647:14:647:14 | y | -| array_flow.rb:645:28:645:28 | y | array_flow.rb:647:14:647:14 | y | -| array_flow.rb:648:9:648:19 | call to source | array_flow.rb:645:9:649:7 | call to inject | | array_flow.rb:648:9:648:19 | call to source | array_flow.rb:645:9:649:7 | call to inject | | array_flow.rb:655:5:655:5 | a [element 2] | array_flow.rb:656:9:656:9 | a [element 2] | -| array_flow.rb:655:5:655:5 | a [element 2] | array_flow.rb:656:9:656:9 | a [element 2] | -| array_flow.rb:655:16:655:27 | call to source | array_flow.rb:655:5:655:5 | a [element 2] | | array_flow.rb:655:16:655:27 | call to source | array_flow.rb:655:5:655:5 | a [element 2] | | array_flow.rb:656:5:656:5 | b [element 1] | array_flow.rb:663:10:663:10 | b [element 1] | -| array_flow.rb:656:5:656:5 | b [element 1] | array_flow.rb:663:10:663:10 | b [element 1] | -| array_flow.rb:656:5:656:5 | b [element 2] | array_flow.rb:664:10:664:10 | b [element 2] | | array_flow.rb:656:5:656:5 | b [element 2] | array_flow.rb:664:10:664:10 | b [element 2] | | array_flow.rb:656:5:656:5 | b [element 4] | array_flow.rb:666:10:666:10 | b [element 4] | -| array_flow.rb:656:5:656:5 | b [element 4] | array_flow.rb:666:10:666:10 | b [element 4] | -| array_flow.rb:656:9:656:9 | [post] a [element 1] | array_flow.rb:658:10:658:10 | a [element 1] | | array_flow.rb:656:9:656:9 | [post] a [element 1] | array_flow.rb:658:10:658:10 | a [element 1] | | array_flow.rb:656:9:656:9 | [post] a [element 2] | array_flow.rb:659:10:659:10 | a [element 2] | -| array_flow.rb:656:9:656:9 | [post] a [element 2] | array_flow.rb:659:10:659:10 | a [element 2] | -| array_flow.rb:656:9:656:9 | [post] a [element 4] | array_flow.rb:661:10:661:10 | a [element 4] | | array_flow.rb:656:9:656:9 | [post] a [element 4] | array_flow.rb:661:10:661:10 | a [element 4] | | array_flow.rb:656:9:656:9 | a [element 2] | array_flow.rb:656:9:656:9 | [post] a [element 4] | -| array_flow.rb:656:9:656:9 | a [element 2] | array_flow.rb:656:9:656:9 | [post] a [element 4] | -| array_flow.rb:656:9:656:9 | a [element 2] | array_flow.rb:656:9:656:47 | call to insert [element 4] | | array_flow.rb:656:9:656:9 | a [element 2] | array_flow.rb:656:9:656:47 | call to insert [element 4] | | array_flow.rb:656:9:656:47 | call to insert [element 1] | array_flow.rb:656:5:656:5 | b [element 1] | -| array_flow.rb:656:9:656:47 | call to insert [element 1] | array_flow.rb:656:5:656:5 | b [element 1] | -| array_flow.rb:656:9:656:47 | call to insert [element 2] | array_flow.rb:656:5:656:5 | b [element 2] | | array_flow.rb:656:9:656:47 | call to insert [element 2] | array_flow.rb:656:5:656:5 | b [element 2] | | array_flow.rb:656:9:656:47 | call to insert [element 4] | array_flow.rb:656:5:656:5 | b [element 4] | -| array_flow.rb:656:9:656:47 | call to insert [element 4] | array_flow.rb:656:5:656:5 | b [element 4] | -| array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:9 | [post] a [element 1] | | array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:9 | [post] a [element 1] | | array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:47 | call to insert [element 1] | -| array_flow.rb:656:21:656:32 | call to source | array_flow.rb:656:9:656:47 | call to insert [element 1] | -| array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:9 | [post] a [element 2] | | array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:9 | [post] a [element 2] | | array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:47 | call to insert [element 2] | -| array_flow.rb:656:35:656:46 | call to source | array_flow.rb:656:9:656:47 | call to insert [element 2] | -| array_flow.rb:658:10:658:10 | a [element 1] | array_flow.rb:658:10:658:13 | ...[...] | | array_flow.rb:658:10:658:10 | a [element 1] | array_flow.rb:658:10:658:13 | ...[...] | | array_flow.rb:659:10:659:10 | a [element 2] | array_flow.rb:659:10:659:13 | ...[...] | -| array_flow.rb:659:10:659:10 | a [element 2] | array_flow.rb:659:10:659:13 | ...[...] | -| array_flow.rb:661:10:661:10 | a [element 4] | array_flow.rb:661:10:661:13 | ...[...] | | array_flow.rb:661:10:661:10 | a [element 4] | array_flow.rb:661:10:661:13 | ...[...] | | array_flow.rb:663:10:663:10 | b [element 1] | array_flow.rb:663:10:663:13 | ...[...] | -| array_flow.rb:663:10:663:10 | b [element 1] | array_flow.rb:663:10:663:13 | ...[...] | -| array_flow.rb:664:10:664:10 | b [element 2] | array_flow.rb:664:10:664:13 | ...[...] | | array_flow.rb:664:10:664:10 | b [element 2] | array_flow.rb:664:10:664:13 | ...[...] | | array_flow.rb:666:10:666:10 | b [element 4] | array_flow.rb:666:10:666:13 | ...[...] | -| array_flow.rb:666:10:666:10 | b [element 4] | array_flow.rb:666:10:666:13 | ...[...] | -| array_flow.rb:669:5:669:5 | c [element 2] | array_flow.rb:670:9:670:9 | c [element 2] | | array_flow.rb:669:5:669:5 | c [element 2] | array_flow.rb:670:9:670:9 | c [element 2] | | array_flow.rb:669:16:669:27 | call to source | array_flow.rb:669:5:669:5 | c [element 2] | -| array_flow.rb:669:16:669:27 | call to source | array_flow.rb:669:5:669:5 | c [element 2] | -| array_flow.rb:670:5:670:5 | d [element] | array_flow.rb:672:10:672:10 | d [element] | | array_flow.rb:670:5:670:5 | d [element] | array_flow.rb:672:10:672:10 | d [element] | | array_flow.rb:670:9:670:9 | [post] c [element] | array_flow.rb:671:10:671:10 | c [element] | -| array_flow.rb:670:9:670:9 | [post] c [element] | array_flow.rb:671:10:671:10 | c [element] | -| array_flow.rb:670:9:670:9 | c [element 2] | array_flow.rb:670:9:670:9 | [post] c [element] | | array_flow.rb:670:9:670:9 | c [element 2] | array_flow.rb:670:9:670:9 | [post] c [element] | | array_flow.rb:670:9:670:9 | c [element 2] | array_flow.rb:670:9:670:47 | call to insert [element] | -| array_flow.rb:670:9:670:9 | c [element 2] | array_flow.rb:670:9:670:47 | call to insert [element] | -| array_flow.rb:670:9:670:47 | call to insert [element] | array_flow.rb:670:5:670:5 | d [element] | | array_flow.rb:670:9:670:47 | call to insert [element] | array_flow.rb:670:5:670:5 | d [element] | | array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:9 | [post] c [element] | -| array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:9 | [post] c [element] | -| array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:47 | call to insert [element] | | array_flow.rb:670:21:670:32 | call to source | array_flow.rb:670:9:670:47 | call to insert [element] | | array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:9 | [post] c [element] | -| array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:9 | [post] c [element] | -| array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:47 | call to insert [element] | | array_flow.rb:670:35:670:46 | call to source | array_flow.rb:670:9:670:47 | call to insert [element] | | array_flow.rb:671:10:671:10 | c [element] | array_flow.rb:671:10:671:13 | ...[...] | -| array_flow.rb:671:10:671:10 | c [element] | array_flow.rb:671:10:671:13 | ...[...] | -| array_flow.rb:672:10:672:10 | d [element] | array_flow.rb:672:10:672:13 | ...[...] | | array_flow.rb:672:10:672:10 | d [element] | array_flow.rb:672:10:672:13 | ...[...] | | array_flow.rb:683:5:683:5 | a [element 2] | array_flow.rb:684:9:684:9 | a [element 2] | -| array_flow.rb:683:5:683:5 | a [element 2] | array_flow.rb:684:9:684:9 | a [element 2] | -| array_flow.rb:683:16:683:27 | call to source | array_flow.rb:683:5:683:5 | a [element 2] | | array_flow.rb:683:16:683:27 | call to source | array_flow.rb:683:5:683:5 | a [element 2] | | array_flow.rb:684:5:684:5 | b [element] | array_flow.rb:685:10:685:10 | b [element] | -| array_flow.rb:684:5:684:5 | b [element] | array_flow.rb:685:10:685:10 | b [element] | -| array_flow.rb:684:9:684:9 | a [element 2] | array_flow.rb:684:9:684:60 | call to intersection [element] | | array_flow.rb:684:9:684:9 | a [element 2] | array_flow.rb:684:9:684:60 | call to intersection [element] | | array_flow.rb:684:9:684:60 | call to intersection [element] | array_flow.rb:684:5:684:5 | b [element] | -| array_flow.rb:684:9:684:60 | call to intersection [element] | array_flow.rb:684:5:684:5 | b [element] | -| array_flow.rb:684:31:684:42 | call to source | array_flow.rb:684:9:684:60 | call to intersection [element] | | array_flow.rb:684:31:684:42 | call to source | array_flow.rb:684:9:684:60 | call to intersection [element] | | array_flow.rb:684:47:684:58 | call to source | array_flow.rb:684:9:684:60 | call to intersection [element] | -| array_flow.rb:684:47:684:58 | call to source | array_flow.rb:684:9:684:60 | call to intersection [element] | -| array_flow.rb:685:10:685:10 | b [element] | array_flow.rb:685:10:685:13 | ...[...] | | array_flow.rb:685:10:685:10 | b [element] | array_flow.rb:685:10:685:13 | ...[...] | | array_flow.rb:689:5:689:5 | a [element 2] | array_flow.rb:690:9:690:9 | a [element 2] | -| array_flow.rb:689:5:689:5 | a [element 2] | array_flow.rb:690:9:690:9 | a [element 2] | -| array_flow.rb:689:16:689:25 | call to source | array_flow.rb:689:5:689:5 | a [element 2] | | array_flow.rb:689:16:689:25 | call to source | array_flow.rb:689:5:689:5 | a [element 2] | | array_flow.rb:690:5:690:5 | b [element] | array_flow.rb:695:10:695:10 | b [element] | -| array_flow.rb:690:5:690:5 | b [element] | array_flow.rb:695:10:695:10 | b [element] | -| array_flow.rb:690:9:690:9 | [post] a [element] | array_flow.rb:694:10:694:10 | a [element] | | array_flow.rb:690:9:690:9 | [post] a [element] | array_flow.rb:694:10:694:10 | a [element] | | array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:9:690:9 | [post] a [element] | -| array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:9:690:9 | [post] a [element] | -| array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:9:693:7 | call to keep_if [element] | | array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:9:693:7 | call to keep_if [element] | | array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:23:690:23 | x | -| array_flow.rb:690:9:690:9 | a [element 2] | array_flow.rb:690:23:690:23 | x | -| array_flow.rb:690:9:693:7 | call to keep_if [element] | array_flow.rb:690:5:690:5 | b [element] | | array_flow.rb:690:9:693:7 | call to keep_if [element] | array_flow.rb:690:5:690:5 | b [element] | | array_flow.rb:690:23:690:23 | x | array_flow.rb:691:14:691:14 | x | -| array_flow.rb:690:23:690:23 | x | array_flow.rb:691:14:691:14 | x | -| array_flow.rb:694:10:694:10 | a [element] | array_flow.rb:694:10:694:13 | ...[...] | | array_flow.rb:694:10:694:10 | a [element] | array_flow.rb:694:10:694:13 | ...[...] | | array_flow.rb:695:10:695:10 | b [element] | array_flow.rb:695:10:695:13 | ...[...] | -| array_flow.rb:695:10:695:10 | b [element] | array_flow.rb:695:10:695:13 | ...[...] | -| array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:701:10:701:10 | a [element 2] | | array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:701:10:701:10 | a [element 2] | | array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:702:9:702:9 | a [element 2] | -| array_flow.rb:699:5:699:5 | a [element 2] | array_flow.rb:702:9:702:9 | a [element 2] | -| array_flow.rb:699:16:699:27 | call to source | array_flow.rb:699:5:699:5 | a [element 2] | | array_flow.rb:699:16:699:27 | call to source | array_flow.rb:699:5:699:5 | a [element 2] | | array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:701:10:701:10 | a [element] | -| array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:701:10:701:10 | a [element] | -| array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:702:9:702:9 | a [element] | | array_flow.rb:700:5:700:5 | [post] a [element] | array_flow.rb:702:9:702:9 | a [element] | | array_flow.rb:700:12:700:23 | call to source | array_flow.rb:700:5:700:5 | [post] a [element] | -| array_flow.rb:700:12:700:23 | call to source | array_flow.rb:700:5:700:5 | [post] a [element] | -| array_flow.rb:701:10:701:10 | a [element 2] | array_flow.rb:701:10:701:15 | call to last | | array_flow.rb:701:10:701:10 | a [element 2] | array_flow.rb:701:10:701:15 | call to last | | array_flow.rb:701:10:701:10 | a [element] | array_flow.rb:701:10:701:15 | call to last | -| array_flow.rb:701:10:701:10 | a [element] | array_flow.rb:701:10:701:15 | call to last | -| array_flow.rb:702:5:702:5 | b [element] | array_flow.rb:703:10:703:10 | b [element] | | array_flow.rb:702:5:702:5 | b [element] | array_flow.rb:703:10:703:10 | b [element] | | array_flow.rb:702:5:702:5 | b [element] | array_flow.rb:704:10:704:10 | b [element] | -| array_flow.rb:702:5:702:5 | b [element] | array_flow.rb:704:10:704:10 | b [element] | -| array_flow.rb:702:9:702:9 | a [element 2] | array_flow.rb:702:9:702:17 | call to last [element] | | array_flow.rb:702:9:702:9 | a [element 2] | array_flow.rb:702:9:702:17 | call to last [element] | | array_flow.rb:702:9:702:9 | a [element] | array_flow.rb:702:9:702:17 | call to last [element] | -| array_flow.rb:702:9:702:9 | a [element] | array_flow.rb:702:9:702:17 | call to last [element] | -| array_flow.rb:702:9:702:17 | call to last [element] | array_flow.rb:702:5:702:5 | b [element] | | array_flow.rb:702:9:702:17 | call to last [element] | array_flow.rb:702:5:702:5 | b [element] | | array_flow.rb:703:10:703:10 | b [element] | array_flow.rb:703:10:703:13 | ...[...] | -| array_flow.rb:703:10:703:10 | b [element] | array_flow.rb:703:10:703:13 | ...[...] | -| array_flow.rb:704:10:704:10 | b [element] | array_flow.rb:704:10:704:13 | ...[...] | | array_flow.rb:704:10:704:10 | b [element] | array_flow.rb:704:10:704:13 | ...[...] | | array_flow.rb:708:5:708:5 | a [element 2] | array_flow.rb:709:9:709:9 | a [element 2] | -| array_flow.rb:708:5:708:5 | a [element 2] | array_flow.rb:709:9:709:9 | a [element 2] | -| array_flow.rb:708:16:708:27 | call to source | array_flow.rb:708:5:708:5 | a [element 2] | | array_flow.rb:708:16:708:27 | call to source | array_flow.rb:708:5:708:5 | a [element 2] | | array_flow.rb:709:5:709:5 | b [element] | array_flow.rb:713:10:713:10 | b [element] | -| array_flow.rb:709:5:709:5 | b [element] | array_flow.rb:713:10:713:10 | b [element] | -| array_flow.rb:709:9:709:9 | a [element 2] | array_flow.rb:709:19:709:19 | x | | array_flow.rb:709:9:709:9 | a [element 2] | array_flow.rb:709:19:709:19 | x | | array_flow.rb:709:9:712:7 | call to map [element] | array_flow.rb:709:5:709:5 | b [element] | -| array_flow.rb:709:9:712:7 | call to map [element] | array_flow.rb:709:5:709:5 | b [element] | -| array_flow.rb:709:19:709:19 | x | array_flow.rb:710:14:710:14 | x | | array_flow.rb:709:19:709:19 | x | array_flow.rb:710:14:710:14 | x | | array_flow.rb:711:9:711:19 | call to source | array_flow.rb:709:9:712:7 | call to map [element] | -| array_flow.rb:711:9:711:19 | call to source | array_flow.rb:709:9:712:7 | call to map [element] | -| array_flow.rb:713:10:713:10 | b [element] | array_flow.rb:713:10:713:13 | ...[...] | | array_flow.rb:713:10:713:10 | b [element] | array_flow.rb:713:10:713:13 | ...[...] | | array_flow.rb:717:5:717:5 | a [element 2] | array_flow.rb:718:9:718:9 | a [element 2] | -| array_flow.rb:717:5:717:5 | a [element 2] | array_flow.rb:718:9:718:9 | a [element 2] | -| array_flow.rb:717:16:717:27 | call to source | array_flow.rb:717:5:717:5 | a [element 2] | | array_flow.rb:717:16:717:27 | call to source | array_flow.rb:717:5:717:5 | a [element 2] | | array_flow.rb:718:5:718:5 | b [element] | array_flow.rb:722:10:722:10 | b [element] | -| array_flow.rb:718:5:718:5 | b [element] | array_flow.rb:722:10:722:10 | b [element] | -| array_flow.rb:718:9:718:9 | a [element 2] | array_flow.rb:718:20:718:20 | x | | array_flow.rb:718:9:718:9 | a [element 2] | array_flow.rb:718:20:718:20 | x | | array_flow.rb:718:9:721:7 | call to map! [element] | array_flow.rb:718:5:718:5 | b [element] | -| array_flow.rb:718:9:721:7 | call to map! [element] | array_flow.rb:718:5:718:5 | b [element] | -| array_flow.rb:718:20:718:20 | x | array_flow.rb:719:14:719:14 | x | | array_flow.rb:718:20:718:20 | x | array_flow.rb:719:14:719:14 | x | | array_flow.rb:720:9:720:19 | call to source | array_flow.rb:718:9:721:7 | call to map! [element] | -| array_flow.rb:720:9:720:19 | call to source | array_flow.rb:718:9:721:7 | call to map! [element] | -| array_flow.rb:722:10:722:10 | b [element] | array_flow.rb:722:10:722:13 | ...[...] | | array_flow.rb:722:10:722:10 | b [element] | array_flow.rb:722:10:722:13 | ...[...] | | array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:729:9:729:9 | a [element 2] | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:729:9:729:9 | a [element 2] | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:733:9:733:9 | a [element 2] | | array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:733:9:733:9 | a [element 2] | | array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:737:9:737:9 | a [element 2] | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:737:9:737:9 | a [element 2] | -| array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:745:9:745:9 | a [element 2] | | array_flow.rb:726:5:726:5 | a [element 2] | array_flow.rb:745:9:745:9 | a [element 2] | | array_flow.rb:726:16:726:25 | call to source | array_flow.rb:726:5:726:5 | a [element 2] | -| array_flow.rb:726:16:726:25 | call to source | array_flow.rb:726:5:726:5 | a [element 2] | -| array_flow.rb:729:5:729:5 | b | array_flow.rb:730:10:730:10 | b | | array_flow.rb:729:5:729:5 | b | array_flow.rb:730:10:730:10 | b | | array_flow.rb:729:9:729:9 | a [element 2] | array_flow.rb:729:9:729:13 | call to max | -| array_flow.rb:729:9:729:9 | a [element 2] | array_flow.rb:729:9:729:13 | call to max | -| array_flow.rb:729:9:729:13 | call to max | array_flow.rb:729:5:729:5 | b | | array_flow.rb:729:9:729:13 | call to max | array_flow.rb:729:5:729:5 | b | | array_flow.rb:733:5:733:5 | c [element] | array_flow.rb:734:10:734:10 | c [element] | -| array_flow.rb:733:5:733:5 | c [element] | array_flow.rb:734:10:734:10 | c [element] | -| array_flow.rb:733:9:733:9 | a [element 2] | array_flow.rb:733:9:733:16 | call to max [element] | | array_flow.rb:733:9:733:9 | a [element 2] | array_flow.rb:733:9:733:16 | call to max [element] | | array_flow.rb:733:9:733:16 | call to max [element] | array_flow.rb:733:5:733:5 | c [element] | -| array_flow.rb:733:9:733:16 | call to max [element] | array_flow.rb:733:5:733:5 | c [element] | -| array_flow.rb:734:10:734:10 | c [element] | array_flow.rb:734:10:734:13 | ...[...] | | array_flow.rb:734:10:734:10 | c [element] | array_flow.rb:734:10:734:13 | ...[...] | | array_flow.rb:737:5:737:5 | d | array_flow.rb:742:10:742:10 | d | -| array_flow.rb:737:5:737:5 | d | array_flow.rb:742:10:742:10 | d | -| array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:9:741:7 | call to max | | array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:9:741:7 | call to max | | array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:19:737:19 | x | -| array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:19:737:19 | x | -| array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:22:737:22 | y | | array_flow.rb:737:9:737:9 | a [element 2] | array_flow.rb:737:22:737:22 | y | | array_flow.rb:737:9:741:7 | call to max | array_flow.rb:737:5:737:5 | d | -| array_flow.rb:737:9:741:7 | call to max | array_flow.rb:737:5:737:5 | d | -| array_flow.rb:737:19:737:19 | x | array_flow.rb:738:14:738:14 | x | | array_flow.rb:737:19:737:19 | x | array_flow.rb:738:14:738:14 | x | | array_flow.rb:737:22:737:22 | y | array_flow.rb:739:14:739:14 | y | -| array_flow.rb:737:22:737:22 | y | array_flow.rb:739:14:739:14 | y | -| array_flow.rb:745:5:745:5 | e [element] | array_flow.rb:750:10:750:10 | e [element] | | array_flow.rb:745:5:745:5 | e [element] | array_flow.rb:750:10:750:10 | e [element] | | array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:9:749:7 | call to max [element] | -| array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:9:749:7 | call to max [element] | -| array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:22:745:22 | x | | array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:22:745:22 | x | | array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:25:745:25 | y | -| array_flow.rb:745:9:745:9 | a [element 2] | array_flow.rb:745:25:745:25 | y | -| array_flow.rb:745:9:749:7 | call to max [element] | array_flow.rb:745:5:745:5 | e [element] | | array_flow.rb:745:9:749:7 | call to max [element] | array_flow.rb:745:5:745:5 | e [element] | | array_flow.rb:745:22:745:22 | x | array_flow.rb:746:14:746:14 | x | -| array_flow.rb:745:22:745:22 | x | array_flow.rb:746:14:746:14 | x | -| array_flow.rb:745:25:745:25 | y | array_flow.rb:747:14:747:14 | y | | array_flow.rb:745:25:745:25 | y | array_flow.rb:747:14:747:14 | y | | array_flow.rb:750:10:750:10 | e [element] | array_flow.rb:750:10:750:13 | ...[...] | -| array_flow.rb:750:10:750:10 | e [element] | array_flow.rb:750:10:750:13 | ...[...] | -| array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:757:9:757:9 | a [element 2] | | array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:757:9:757:9 | a [element 2] | | array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:764:9:764:9 | a [element 2] | -| array_flow.rb:754:5:754:5 | a [element 2] | array_flow.rb:764:9:764:9 | a [element 2] | -| array_flow.rb:754:16:754:25 | call to source | array_flow.rb:754:5:754:5 | a [element 2] | | array_flow.rb:754:16:754:25 | call to source | array_flow.rb:754:5:754:5 | a [element 2] | | array_flow.rb:757:5:757:5 | b | array_flow.rb:761:10:761:10 | b | -| array_flow.rb:757:5:757:5 | b | array_flow.rb:761:10:761:10 | b | -| array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:9:760:7 | call to max_by | | array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:9:760:7 | call to max_by | | array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:22:757:22 | x | -| array_flow.rb:757:9:757:9 | a [element 2] | array_flow.rb:757:22:757:22 | x | -| array_flow.rb:757:9:760:7 | call to max_by | array_flow.rb:757:5:757:5 | b | | array_flow.rb:757:9:760:7 | call to max_by | array_flow.rb:757:5:757:5 | b | | array_flow.rb:757:22:757:22 | x | array_flow.rb:758:14:758:14 | x | -| array_flow.rb:757:22:757:22 | x | array_flow.rb:758:14:758:14 | x | -| array_flow.rb:764:5:764:5 | c [element] | array_flow.rb:768:10:768:10 | c [element] | | array_flow.rb:764:5:764:5 | c [element] | array_flow.rb:768:10:768:10 | c [element] | | array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:9:767:7 | call to max_by [element] | -| array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:9:767:7 | call to max_by [element] | -| array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:25:764:25 | x | | array_flow.rb:764:9:764:9 | a [element 2] | array_flow.rb:764:25:764:25 | x | | array_flow.rb:764:9:767:7 | call to max_by [element] | array_flow.rb:764:5:764:5 | c [element] | -| array_flow.rb:764:9:767:7 | call to max_by [element] | array_flow.rb:764:5:764:5 | c [element] | -| array_flow.rb:764:25:764:25 | x | array_flow.rb:765:14:765:14 | x | | array_flow.rb:764:25:764:25 | x | array_flow.rb:765:14:765:14 | x | | array_flow.rb:768:10:768:10 | c [element] | array_flow.rb:768:10:768:13 | ...[...] | -| array_flow.rb:768:10:768:10 | c [element] | array_flow.rb:768:10:768:13 | ...[...] | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:775:9:775:9 | a [element 2] | | array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:775:9:775:9 | a [element 2] | | array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:779:9:779:9 | a [element 2] | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:779:9:779:9 | a [element 2] | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:783:9:783:9 | a [element 2] | | array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:783:9:783:9 | a [element 2] | | array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:791:9:791:9 | a [element 2] | -| array_flow.rb:772:5:772:5 | a [element 2] | array_flow.rb:791:9:791:9 | a [element 2] | -| array_flow.rb:772:16:772:25 | call to source | array_flow.rb:772:5:772:5 | a [element 2] | | array_flow.rb:772:16:772:25 | call to source | array_flow.rb:772:5:772:5 | a [element 2] | | array_flow.rb:775:5:775:5 | b | array_flow.rb:776:10:776:10 | b | -| array_flow.rb:775:5:775:5 | b | array_flow.rb:776:10:776:10 | b | -| array_flow.rb:775:9:775:9 | a [element 2] | array_flow.rb:775:9:775:13 | call to min | | array_flow.rb:775:9:775:9 | a [element 2] | array_flow.rb:775:9:775:13 | call to min | | array_flow.rb:775:9:775:13 | call to min | array_flow.rb:775:5:775:5 | b | -| array_flow.rb:775:9:775:13 | call to min | array_flow.rb:775:5:775:5 | b | -| array_flow.rb:779:5:779:5 | c [element] | array_flow.rb:780:10:780:10 | c [element] | | array_flow.rb:779:5:779:5 | c [element] | array_flow.rb:780:10:780:10 | c [element] | | array_flow.rb:779:9:779:9 | a [element 2] | array_flow.rb:779:9:779:16 | call to min [element] | -| array_flow.rb:779:9:779:9 | a [element 2] | array_flow.rb:779:9:779:16 | call to min [element] | -| array_flow.rb:779:9:779:16 | call to min [element] | array_flow.rb:779:5:779:5 | c [element] | | array_flow.rb:779:9:779:16 | call to min [element] | array_flow.rb:779:5:779:5 | c [element] | | array_flow.rb:780:10:780:10 | c [element] | array_flow.rb:780:10:780:13 | ...[...] | -| array_flow.rb:780:10:780:10 | c [element] | array_flow.rb:780:10:780:13 | ...[...] | -| array_flow.rb:783:5:783:5 | d | array_flow.rb:788:10:788:10 | d | | array_flow.rb:783:5:783:5 | d | array_flow.rb:788:10:788:10 | d | | array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:9:787:7 | call to min | -| array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:9:787:7 | call to min | -| array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:19:783:19 | x | | array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:19:783:19 | x | | array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:22:783:22 | y | -| array_flow.rb:783:9:783:9 | a [element 2] | array_flow.rb:783:22:783:22 | y | -| array_flow.rb:783:9:787:7 | call to min | array_flow.rb:783:5:783:5 | d | | array_flow.rb:783:9:787:7 | call to min | array_flow.rb:783:5:783:5 | d | | array_flow.rb:783:19:783:19 | x | array_flow.rb:784:14:784:14 | x | -| array_flow.rb:783:19:783:19 | x | array_flow.rb:784:14:784:14 | x | -| array_flow.rb:783:22:783:22 | y | array_flow.rb:785:14:785:14 | y | | array_flow.rb:783:22:783:22 | y | array_flow.rb:785:14:785:14 | y | | array_flow.rb:791:5:791:5 | e [element] | array_flow.rb:796:10:796:10 | e [element] | -| array_flow.rb:791:5:791:5 | e [element] | array_flow.rb:796:10:796:10 | e [element] | -| array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:9:795:7 | call to min [element] | | array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:9:795:7 | call to min [element] | | array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:22:791:22 | x | -| array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:22:791:22 | x | -| array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:25:791:25 | y | | array_flow.rb:791:9:791:9 | a [element 2] | array_flow.rb:791:25:791:25 | y | | array_flow.rb:791:9:795:7 | call to min [element] | array_flow.rb:791:5:791:5 | e [element] | -| array_flow.rb:791:9:795:7 | call to min [element] | array_flow.rb:791:5:791:5 | e [element] | -| array_flow.rb:791:22:791:22 | x | array_flow.rb:792:14:792:14 | x | | array_flow.rb:791:22:791:22 | x | array_flow.rb:792:14:792:14 | x | | array_flow.rb:791:25:791:25 | y | array_flow.rb:793:14:793:14 | y | -| array_flow.rb:791:25:791:25 | y | array_flow.rb:793:14:793:14 | y | -| array_flow.rb:796:10:796:10 | e [element] | array_flow.rb:796:10:796:13 | ...[...] | | array_flow.rb:796:10:796:10 | e [element] | array_flow.rb:796:10:796:13 | ...[...] | | array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:803:9:803:9 | a [element 2] | -| array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:803:9:803:9 | a [element 2] | -| array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:810:9:810:9 | a [element 2] | | array_flow.rb:800:5:800:5 | a [element 2] | array_flow.rb:810:9:810:9 | a [element 2] | | array_flow.rb:800:16:800:25 | call to source | array_flow.rb:800:5:800:5 | a [element 2] | -| array_flow.rb:800:16:800:25 | call to source | array_flow.rb:800:5:800:5 | a [element 2] | -| array_flow.rb:803:5:803:5 | b | array_flow.rb:807:10:807:10 | b | | array_flow.rb:803:5:803:5 | b | array_flow.rb:807:10:807:10 | b | | array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:9:806:7 | call to min_by | -| array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:9:806:7 | call to min_by | -| array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:22:803:22 | x | | array_flow.rb:803:9:803:9 | a [element 2] | array_flow.rb:803:22:803:22 | x | | array_flow.rb:803:9:806:7 | call to min_by | array_flow.rb:803:5:803:5 | b | -| array_flow.rb:803:9:806:7 | call to min_by | array_flow.rb:803:5:803:5 | b | -| array_flow.rb:803:22:803:22 | x | array_flow.rb:804:14:804:14 | x | | array_flow.rb:803:22:803:22 | x | array_flow.rb:804:14:804:14 | x | | array_flow.rb:810:5:810:5 | c [element] | array_flow.rb:814:10:814:10 | c [element] | -| array_flow.rb:810:5:810:5 | c [element] | array_flow.rb:814:10:814:10 | c [element] | -| array_flow.rb:810:9:810:9 | a [element 2] | array_flow.rb:810:9:813:7 | call to min_by [element] | | array_flow.rb:810:9:810:9 | a [element 2] | array_flow.rb:810:9:813:7 | call to min_by [element] | | array_flow.rb:810:9:810:9 | a [element 2] | array_flow.rb:810:25:810:25 | x | -| array_flow.rb:810:9:810:9 | a [element 2] | array_flow.rb:810:25:810:25 | x | -| array_flow.rb:810:9:813:7 | call to min_by [element] | array_flow.rb:810:5:810:5 | c [element] | | array_flow.rb:810:9:813:7 | call to min_by [element] | array_flow.rb:810:5:810:5 | c [element] | | array_flow.rb:810:25:810:25 | x | array_flow.rb:811:14:811:14 | x | -| array_flow.rb:810:25:810:25 | x | array_flow.rb:811:14:811:14 | x | -| array_flow.rb:814:10:814:10 | c [element] | array_flow.rb:814:10:814:13 | ...[...] | | array_flow.rb:814:10:814:10 | c [element] | array_flow.rb:814:10:814:13 | ...[...] | | array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:820:9:820:9 | a [element 2] | -| array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:820:9:820:9 | a [element 2] | -| array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:824:9:824:9 | a [element 2] | | array_flow.rb:818:5:818:5 | a [element 2] | array_flow.rb:824:9:824:9 | a [element 2] | | array_flow.rb:818:16:818:25 | call to source | array_flow.rb:818:5:818:5 | a [element 2] | -| array_flow.rb:818:16:818:25 | call to source | array_flow.rb:818:5:818:5 | a [element 2] | -| array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:821:10:821:10 | b [element] | | array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:821:10:821:10 | b [element] | | array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:822:10:822:10 | b [element] | -| array_flow.rb:820:5:820:5 | b [element] | array_flow.rb:822:10:822:10 | b [element] | -| array_flow.rb:820:9:820:9 | a [element 2] | array_flow.rb:820:9:820:16 | call to minmax [element] | | array_flow.rb:820:9:820:9 | a [element 2] | array_flow.rb:820:9:820:16 | call to minmax [element] | | array_flow.rb:820:9:820:16 | call to minmax [element] | array_flow.rb:820:5:820:5 | b [element] | -| array_flow.rb:820:9:820:16 | call to minmax [element] | array_flow.rb:820:5:820:5 | b [element] | -| array_flow.rb:821:10:821:10 | b [element] | array_flow.rb:821:10:821:13 | ...[...] | | array_flow.rb:821:10:821:10 | b [element] | array_flow.rb:821:10:821:13 | ...[...] | | array_flow.rb:822:10:822:10 | b [element] | array_flow.rb:822:10:822:13 | ...[...] | -| array_flow.rb:822:10:822:10 | b [element] | array_flow.rb:822:10:822:13 | ...[...] | -| array_flow.rb:824:5:824:5 | c [element] | array_flow.rb:829:10:829:10 | c [element] | | array_flow.rb:824:5:824:5 | c [element] | array_flow.rb:829:10:829:10 | c [element] | | array_flow.rb:824:5:824:5 | c [element] | array_flow.rb:830:10:830:10 | c [element] | -| array_flow.rb:824:5:824:5 | c [element] | array_flow.rb:830:10:830:10 | c [element] | -| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:9:828:7 | call to minmax [element] | | array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:9:828:7 | call to minmax [element] | | array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:22:824:22 | x | -| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:22:824:22 | x | -| array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:25:824:25 | y | | array_flow.rb:824:9:824:9 | a [element 2] | array_flow.rb:824:25:824:25 | y | | array_flow.rb:824:9:828:7 | call to minmax [element] | array_flow.rb:824:5:824:5 | c [element] | -| array_flow.rb:824:9:828:7 | call to minmax [element] | array_flow.rb:824:5:824:5 | c [element] | -| array_flow.rb:824:22:824:22 | x | array_flow.rb:825:14:825:14 | x | | array_flow.rb:824:22:824:22 | x | array_flow.rb:825:14:825:14 | x | | array_flow.rb:824:25:824:25 | y | array_flow.rb:826:14:826:14 | y | -| array_flow.rb:824:25:824:25 | y | array_flow.rb:826:14:826:14 | y | -| array_flow.rb:829:10:829:10 | c [element] | array_flow.rb:829:10:829:13 | ...[...] | | array_flow.rb:829:10:829:10 | c [element] | array_flow.rb:829:10:829:13 | ...[...] | | array_flow.rb:830:10:830:10 | c [element] | array_flow.rb:830:10:830:13 | ...[...] | -| array_flow.rb:830:10:830:10 | c [element] | array_flow.rb:830:10:830:13 | ...[...] | -| array_flow.rb:834:5:834:5 | a [element 2] | array_flow.rb:835:9:835:9 | a [element 2] | | array_flow.rb:834:5:834:5 | a [element 2] | array_flow.rb:835:9:835:9 | a [element 2] | | array_flow.rb:834:16:834:25 | call to source | array_flow.rb:834:5:834:5 | a [element 2] | -| array_flow.rb:834:16:834:25 | call to source | array_flow.rb:834:5:834:5 | a [element 2] | -| array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:839:10:839:10 | b [element] | | array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:839:10:839:10 | b [element] | | array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:840:10:840:10 | b [element] | -| array_flow.rb:835:5:835:5 | b [element] | array_flow.rb:840:10:840:10 | b [element] | -| array_flow.rb:835:9:835:9 | a [element 2] | array_flow.rb:835:9:838:7 | call to minmax_by [element] | | array_flow.rb:835:9:835:9 | a [element 2] | array_flow.rb:835:9:838:7 | call to minmax_by [element] | | array_flow.rb:835:9:835:9 | a [element 2] | array_flow.rb:835:25:835:25 | x | -| array_flow.rb:835:9:835:9 | a [element 2] | array_flow.rb:835:25:835:25 | x | -| array_flow.rb:835:9:838:7 | call to minmax_by [element] | array_flow.rb:835:5:835:5 | b [element] | | array_flow.rb:835:9:838:7 | call to minmax_by [element] | array_flow.rb:835:5:835:5 | b [element] | | array_flow.rb:835:25:835:25 | x | array_flow.rb:836:14:836:14 | x | -| array_flow.rb:835:25:835:25 | x | array_flow.rb:836:14:836:14 | x | -| array_flow.rb:839:10:839:10 | b [element] | array_flow.rb:839:10:839:13 | ...[...] | | array_flow.rb:839:10:839:10 | b [element] | array_flow.rb:839:10:839:13 | ...[...] | | array_flow.rb:840:10:840:10 | b [element] | array_flow.rb:840:10:840:13 | ...[...] | -| array_flow.rb:840:10:840:10 | b [element] | array_flow.rb:840:10:840:13 | ...[...] | -| array_flow.rb:844:5:844:5 | a [element 2] | array_flow.rb:845:5:845:5 | a [element 2] | | array_flow.rb:844:5:844:5 | a [element 2] | array_flow.rb:845:5:845:5 | a [element 2] | | array_flow.rb:844:16:844:25 | call to source | array_flow.rb:844:5:844:5 | a [element 2] | -| array_flow.rb:844:16:844:25 | call to source | array_flow.rb:844:5:844:5 | a [element 2] | -| array_flow.rb:845:5:845:5 | a [element 2] | array_flow.rb:845:17:845:17 | x | | array_flow.rb:845:5:845:5 | a [element 2] | array_flow.rb:845:17:845:17 | x | | array_flow.rb:845:17:845:17 | x | array_flow.rb:846:14:846:14 | x | -| array_flow.rb:845:17:845:17 | x | array_flow.rb:846:14:846:14 | x | -| array_flow.rb:853:5:853:5 | a [element 2] | array_flow.rb:854:5:854:5 | a [element 2] | | array_flow.rb:853:5:853:5 | a [element 2] | array_flow.rb:854:5:854:5 | a [element 2] | | array_flow.rb:853:16:853:25 | call to source | array_flow.rb:853:5:853:5 | a [element 2] | -| array_flow.rb:853:16:853:25 | call to source | array_flow.rb:853:5:853:5 | a [element 2] | -| array_flow.rb:854:5:854:5 | a [element 2] | array_flow.rb:854:16:854:16 | x | | array_flow.rb:854:5:854:5 | a [element 2] | array_flow.rb:854:16:854:16 | x | | array_flow.rb:854:16:854:16 | x | array_flow.rb:855:14:855:14 | x | -| array_flow.rb:854:16:854:16 | x | array_flow.rb:855:14:855:14 | x | -| array_flow.rb:860:5:860:5 | a [element 2] | array_flow.rb:861:9:861:9 | a [element 2] | -| array_flow.rb:860:16:860:25 | call to source | array_flow.rb:860:5:860:5 | a [element 2] | -| array_flow.rb:861:5:861:5 | b | array_flow.rb:862:10:862:10 | b | -| array_flow.rb:861:9:861:9 | a [element 2] | array_flow.rb:861:9:861:20 | call to pack | -| array_flow.rb:861:9:861:20 | call to pack | array_flow.rb:861:5:861:5 | b | -| array_flow.rb:866:5:866:5 | a [element 2] | array_flow.rb:867:9:867:9 | a [element 2] | | array_flow.rb:866:5:866:5 | a [element 2] | array_flow.rb:867:9:867:9 | a [element 2] | | array_flow.rb:866:16:866:25 | call to source | array_flow.rb:866:5:866:5 | a [element 2] | -| array_flow.rb:866:16:866:25 | call to source | array_flow.rb:866:5:866:5 | a [element 2] | -| array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:871:10:871:10 | b [element, element] | | array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:871:10:871:10 | b [element, element] | | array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:872:10:872:10 | b [element, element] | -| array_flow.rb:867:5:867:5 | b [element, element] | array_flow.rb:872:10:872:10 | b [element, element] | -| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:9:870:7 | call to partition [element, element] | | array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:9:870:7 | call to partition [element, element] | | array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:25:867:25 | x | -| array_flow.rb:867:9:867:9 | a [element 2] | array_flow.rb:867:25:867:25 | x | -| array_flow.rb:867:9:870:7 | call to partition [element, element] | array_flow.rb:867:5:867:5 | b [element, element] | | array_flow.rb:867:9:870:7 | call to partition [element, element] | array_flow.rb:867:5:867:5 | b [element, element] | | array_flow.rb:867:25:867:25 | x | array_flow.rb:868:14:868:14 | x | -| array_flow.rb:867:25:867:25 | x | array_flow.rb:868:14:868:14 | x | -| array_flow.rb:871:10:871:10 | b [element, element] | array_flow.rb:871:10:871:13 | ...[...] [element] | | array_flow.rb:871:10:871:10 | b [element, element] | array_flow.rb:871:10:871:13 | ...[...] [element] | | array_flow.rb:871:10:871:13 | ...[...] [element] | array_flow.rb:871:10:871:16 | ...[...] | -| array_flow.rb:871:10:871:13 | ...[...] [element] | array_flow.rb:871:10:871:16 | ...[...] | -| array_flow.rb:872:10:872:10 | b [element, element] | array_flow.rb:872:10:872:13 | ...[...] [element] | | array_flow.rb:872:10:872:10 | b [element, element] | array_flow.rb:872:10:872:13 | ...[...] [element] | | array_flow.rb:872:10:872:13 | ...[...] [element] | array_flow.rb:872:10:872:16 | ...[...] | -| array_flow.rb:872:10:872:13 | ...[...] [element] | array_flow.rb:872:10:872:16 | ...[...] | -| array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:878:9:878:9 | a [element 2] | | array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:878:9:878:9 | a [element 2] | | array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:886:9:886:9 | a [element 2] | -| array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:886:9:886:9 | a [element 2] | -| array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:893:9:893:9 | a [element 2] | | array_flow.rb:876:5:876:5 | a [element 2] | array_flow.rb:893:9:893:9 | a [element 2] | | array_flow.rb:876:16:876:25 | call to source | array_flow.rb:876:5:876:5 | a [element 2] | -| array_flow.rb:876:16:876:25 | call to source | array_flow.rb:876:5:876:5 | a [element 2] | -| array_flow.rb:878:5:878:5 | b [element 2] | array_flow.rb:884:10:884:10 | b [element 2] | | array_flow.rb:878:5:878:5 | b [element 2] | array_flow.rb:884:10:884:10 | b [element 2] | | array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:9:882:7 | call to permutation [element 2] | -| array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:9:882:7 | call to permutation [element 2] | -| array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:27:878:27 | x [element] | | array_flow.rb:878:9:878:9 | a [element 2] | array_flow.rb:878:27:878:27 | x [element] | | array_flow.rb:878:9:882:7 | call to permutation [element 2] | array_flow.rb:878:5:878:5 | b [element 2] | -| array_flow.rb:878:9:882:7 | call to permutation [element 2] | array_flow.rb:878:5:878:5 | b [element 2] | -| array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:879:14:879:14 | x [element] | | array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:879:14:879:14 | x [element] | | array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:880:14:880:14 | x [element] | -| array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:880:14:880:14 | x [element] | -| array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:881:14:881:14 | x [element] | | array_flow.rb:878:27:878:27 | x [element] | array_flow.rb:881:14:881:14 | x [element] | | array_flow.rb:879:14:879:14 | x [element] | array_flow.rb:879:14:879:17 | ...[...] | -| array_flow.rb:879:14:879:14 | x [element] | array_flow.rb:879:14:879:17 | ...[...] | -| array_flow.rb:880:14:880:14 | x [element] | array_flow.rb:880:14:880:17 | ...[...] | | array_flow.rb:880:14:880:14 | x [element] | array_flow.rb:880:14:880:17 | ...[...] | | array_flow.rb:881:14:881:14 | x [element] | array_flow.rb:881:14:881:17 | ...[...] | -| array_flow.rb:881:14:881:14 | x [element] | array_flow.rb:881:14:881:17 | ...[...] | -| array_flow.rb:884:10:884:10 | b [element 2] | array_flow.rb:884:10:884:13 | ...[...] | | array_flow.rb:884:10:884:10 | b [element 2] | array_flow.rb:884:10:884:13 | ...[...] | | array_flow.rb:886:5:886:5 | c [element 2] | array_flow.rb:891:10:891:10 | c [element 2] | -| array_flow.rb:886:5:886:5 | c [element 2] | array_flow.rb:891:10:891:10 | c [element 2] | -| array_flow.rb:886:5:886:5 | c [element 2] | array_flow.rb:898:10:898:10 | c [element 2] | | array_flow.rb:886:5:886:5 | c [element 2] | array_flow.rb:898:10:898:10 | c [element 2] | | array_flow.rb:886:9:886:9 | a [element 2] | array_flow.rb:886:9:889:7 | call to permutation [element 2] | -| array_flow.rb:886:9:886:9 | a [element 2] | array_flow.rb:886:9:889:7 | call to permutation [element 2] | -| array_flow.rb:886:9:886:9 | a [element 2] | array_flow.rb:886:30:886:30 | x [element] | | array_flow.rb:886:9:886:9 | a [element 2] | array_flow.rb:886:30:886:30 | x [element] | | array_flow.rb:886:9:889:7 | call to permutation [element 2] | array_flow.rb:886:5:886:5 | c [element 2] | -| array_flow.rb:886:9:889:7 | call to permutation [element 2] | array_flow.rb:886:5:886:5 | c [element 2] | -| array_flow.rb:886:30:886:30 | x [element] | array_flow.rb:887:14:887:14 | x [element] | | array_flow.rb:886:30:886:30 | x [element] | array_flow.rb:887:14:887:14 | x [element] | | array_flow.rb:886:30:886:30 | x [element] | array_flow.rb:888:14:888:14 | x [element] | -| array_flow.rb:886:30:886:30 | x [element] | array_flow.rb:888:14:888:14 | x [element] | -| array_flow.rb:887:14:887:14 | x [element] | array_flow.rb:887:14:887:17 | ...[...] | | array_flow.rb:887:14:887:14 | x [element] | array_flow.rb:887:14:887:17 | ...[...] | | array_flow.rb:888:14:888:14 | x [element] | array_flow.rb:888:14:888:17 | ...[...] | -| array_flow.rb:888:14:888:14 | x [element] | array_flow.rb:888:14:888:17 | ...[...] | -| array_flow.rb:891:10:891:10 | c [element 2] | array_flow.rb:891:10:891:13 | ...[...] | | array_flow.rb:891:10:891:10 | c [element 2] | array_flow.rb:891:10:891:13 | ...[...] | | array_flow.rb:893:9:893:9 | a [element 2] | array_flow.rb:893:30:893:30 | x [element] | -| array_flow.rb:893:9:893:9 | a [element 2] | array_flow.rb:893:30:893:30 | x [element] | -| array_flow.rb:893:30:893:30 | x [element] | array_flow.rb:894:14:894:14 | x [element] | | array_flow.rb:893:30:893:30 | x [element] | array_flow.rb:894:14:894:14 | x [element] | | array_flow.rb:893:30:893:30 | x [element] | array_flow.rb:895:14:895:14 | x [element] | -| array_flow.rb:893:30:893:30 | x [element] | array_flow.rb:895:14:895:14 | x [element] | -| array_flow.rb:894:14:894:14 | x [element] | array_flow.rb:894:14:894:17 | ...[...] | | array_flow.rb:894:14:894:14 | x [element] | array_flow.rb:894:14:894:17 | ...[...] | | array_flow.rb:895:14:895:14 | x [element] | array_flow.rb:895:14:895:17 | ...[...] | -| array_flow.rb:895:14:895:14 | x [element] | array_flow.rb:895:14:895:17 | ...[...] | -| array_flow.rb:898:10:898:10 | c [element 2] | array_flow.rb:898:10:898:13 | ...[...] | | array_flow.rb:898:10:898:10 | c [element 2] | array_flow.rb:898:10:898:13 | ...[...] | | array_flow.rb:905:5:905:5 | a [element 1] | array_flow.rb:906:9:906:9 | a [element 1] | -| array_flow.rb:905:5:905:5 | a [element 1] | array_flow.rb:906:9:906:9 | a [element 1] | -| array_flow.rb:905:5:905:5 | a [element 1] | array_flow.rb:909:10:909:10 | a [element 1] | | array_flow.rb:905:5:905:5 | a [element 1] | array_flow.rb:909:10:909:10 | a [element 1] | | array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:906:9:906:9 | a [element 3] | -| array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:906:9:906:9 | a [element 3] | -| array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:911:10:911:10 | a [element 3] | | array_flow.rb:905:5:905:5 | a [element 3] | array_flow.rb:911:10:911:10 | a [element 3] | | array_flow.rb:905:13:905:24 | call to source | array_flow.rb:905:5:905:5 | a [element 1] | -| array_flow.rb:905:13:905:24 | call to source | array_flow.rb:905:5:905:5 | a [element 1] | -| array_flow.rb:905:30:905:41 | call to source | array_flow.rb:905:5:905:5 | a [element 3] | | array_flow.rb:905:30:905:41 | call to source | array_flow.rb:905:5:905:5 | a [element 3] | | array_flow.rb:906:5:906:5 | b | array_flow.rb:907:10:907:10 | b | -| array_flow.rb:906:5:906:5 | b | array_flow.rb:907:10:907:10 | b | -| array_flow.rb:906:9:906:9 | a [element 1] | array_flow.rb:906:9:906:13 | call to pop | | array_flow.rb:906:9:906:9 | a [element 1] | array_flow.rb:906:9:906:13 | call to pop | | array_flow.rb:906:9:906:9 | a [element 3] | array_flow.rb:906:9:906:13 | call to pop | -| array_flow.rb:906:9:906:9 | a [element 3] | array_flow.rb:906:9:906:13 | call to pop | -| array_flow.rb:906:9:906:13 | call to pop | array_flow.rb:906:5:906:5 | b | | array_flow.rb:906:9:906:13 | call to pop | array_flow.rb:906:5:906:5 | b | | array_flow.rb:909:10:909:10 | a [element 1] | array_flow.rb:909:10:909:13 | ...[...] | -| array_flow.rb:909:10:909:10 | a [element 1] | array_flow.rb:909:10:909:13 | ...[...] | -| array_flow.rb:911:10:911:10 | a [element 3] | array_flow.rb:911:10:911:13 | ...[...] | | array_flow.rb:911:10:911:10 | a [element 3] | array_flow.rb:911:10:911:13 | ...[...] | | array_flow.rb:913:5:913:5 | a [element 1] | array_flow.rb:914:9:914:9 | a [element 1] | -| array_flow.rb:913:5:913:5 | a [element 1] | array_flow.rb:914:9:914:9 | a [element 1] | -| array_flow.rb:913:5:913:5 | a [element 1] | array_flow.rb:918:10:918:10 | a [element 1] | | array_flow.rb:913:5:913:5 | a [element 1] | array_flow.rb:918:10:918:10 | a [element 1] | | array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:914:9:914:9 | a [element 3] | -| array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:914:9:914:9 | a [element 3] | -| array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:920:10:920:10 | a [element 3] | | array_flow.rb:913:5:913:5 | a [element 3] | array_flow.rb:920:10:920:10 | a [element 3] | | array_flow.rb:913:13:913:24 | call to source | array_flow.rb:913:5:913:5 | a [element 1] | -| array_flow.rb:913:13:913:24 | call to source | array_flow.rb:913:5:913:5 | a [element 1] | -| array_flow.rb:913:30:913:41 | call to source | array_flow.rb:913:5:913:5 | a [element 3] | | array_flow.rb:913:30:913:41 | call to source | array_flow.rb:913:5:913:5 | a [element 3] | | array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:915:10:915:10 | b [element] | -| array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:915:10:915:10 | b [element] | -| array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:916:10:916:10 | b [element] | | array_flow.rb:914:5:914:5 | b [element] | array_flow.rb:916:10:916:10 | b [element] | | array_flow.rb:914:9:914:9 | a [element 1] | array_flow.rb:914:9:914:16 | call to pop [element] | -| array_flow.rb:914:9:914:9 | a [element 1] | array_flow.rb:914:9:914:16 | call to pop [element] | -| array_flow.rb:914:9:914:9 | a [element 3] | array_flow.rb:914:9:914:16 | call to pop [element] | | array_flow.rb:914:9:914:9 | a [element 3] | array_flow.rb:914:9:914:16 | call to pop [element] | | array_flow.rb:914:9:914:16 | call to pop [element] | array_flow.rb:914:5:914:5 | b [element] | -| array_flow.rb:914:9:914:16 | call to pop [element] | array_flow.rb:914:5:914:5 | b [element] | -| array_flow.rb:915:10:915:10 | b [element] | array_flow.rb:915:10:915:13 | ...[...] | | array_flow.rb:915:10:915:10 | b [element] | array_flow.rb:915:10:915:13 | ...[...] | | array_flow.rb:916:10:916:10 | b [element] | array_flow.rb:916:10:916:13 | ...[...] | -| array_flow.rb:916:10:916:10 | b [element] | array_flow.rb:916:10:916:13 | ...[...] | -| array_flow.rb:918:10:918:10 | a [element 1] | array_flow.rb:918:10:918:13 | ...[...] | | array_flow.rb:918:10:918:10 | a [element 1] | array_flow.rb:918:10:918:13 | ...[...] | | array_flow.rb:920:10:920:10 | a [element 3] | array_flow.rb:920:10:920:13 | ...[...] | -| array_flow.rb:920:10:920:10 | a [element 3] | array_flow.rb:920:10:920:13 | ...[...] | -| array_flow.rb:924:5:924:5 | a [element 2] | array_flow.rb:925:5:925:5 | a [element 2] | | array_flow.rb:924:5:924:5 | a [element 2] | array_flow.rb:925:5:925: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:924:16:924:27 | call to source | array_flow.rb:924:5:924:5 | a [element 2] | -| array_flow.rb:925:5:925:5 | [post] a [element 2] | array_flow.rb:928:10:928:10 | a [element 2] | | array_flow.rb:925:5:925:5 | [post] a [element 2] | array_flow.rb:928:10:928:10 | a [element 2] | | array_flow.rb:925:5:925:5 | [post] a [element 5] | array_flow.rb:931:10:931:10 | a [element 5] | -| array_flow.rb:925:5:925:5 | [post] a [element 5] | array_flow.rb:931:10:931:10 | a [element 5] | -| array_flow.rb:925:5:925:5 | a [element 2] | array_flow.rb:925:5:925:5 | [post] a [element 5] | | array_flow.rb:925:5:925:5 | a [element 2] | array_flow.rb:925:5:925:5 | [post] a [element 5] | | array_flow.rb:925:21:925:32 | call to source | array_flow.rb:925:5:925:5 | [post] a [element 2] | -| array_flow.rb:925:21:925:32 | call to source | array_flow.rb:925:5:925:5 | [post] a [element 2] | -| array_flow.rb:928:10:928:10 | a [element 2] | array_flow.rb:928:10:928:13 | ...[...] | | array_flow.rb:928:10:928:10 | a [element 2] | array_flow.rb:928:10:928:13 | ...[...] | | array_flow.rb:931:10:931:10 | a [element 5] | array_flow.rb:931:10:931:13 | ...[...] | -| array_flow.rb:931:10:931:10 | a [element 5] | array_flow.rb:931:10:931:13 | ...[...] | -| array_flow.rb:935:5:935:5 | a [element 2] | array_flow.rb:938:9:938:9 | a [element 2] | | array_flow.rb:935:5:935:5 | a [element 2] | array_flow.rb:938:9:938:9 | a [element 2] | | array_flow.rb:935:16:935:27 | call to source | array_flow.rb:935:5:935:5 | a [element 2] | -| array_flow.rb:935:16:935:27 | call to source | array_flow.rb:935:5:935:5 | a [element 2] | -| array_flow.rb:936:5:936:5 | b [element 1] | array_flow.rb:938:19:938:19 | b [element 1] | | array_flow.rb:936:5:936:5 | b [element 1] | array_flow.rb:938:19:938:19 | b [element 1] | | array_flow.rb:936:13:936:24 | call to source | array_flow.rb:936:5:936:5 | b [element 1] | -| array_flow.rb:936:13:936:24 | call to source | array_flow.rb:936:5:936:5 | b [element 1] | -| array_flow.rb:937:5:937:5 | c [element 0] | array_flow.rb:938:22:938:22 | c [element 0] | | array_flow.rb:937:5:937:5 | c [element 0] | array_flow.rb:938:22:938:22 | c [element 0] | | array_flow.rb:937:10:937:21 | call to source | array_flow.rb:937:5:937:5 | c [element 0] | -| array_flow.rb:937:10:937:21 | call to source | array_flow.rb:937:5:937:5 | c [element 0] | -| array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:939:10:939:10 | d [element, element] | | array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:939:10:939:10 | d [element, element] | | array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:940:10:940:10 | d [element, element] | -| array_flow.rb:938:5:938:5 | d [element, element] | array_flow.rb:940:10:940:10 | d [element, element] | -| array_flow.rb:938:9:938:9 | a [element 2] | array_flow.rb:938:9:938:22 | call to product [element, element] | | array_flow.rb:938:9:938:9 | a [element 2] | array_flow.rb:938:9:938:22 | call to product [element, element] | | array_flow.rb:938:9:938:22 | call to product [element, element] | array_flow.rb:938:5:938:5 | d [element, element] | -| array_flow.rb:938:9:938:22 | call to product [element, element] | array_flow.rb:938:5:938:5 | d [element, element] | -| array_flow.rb:938:19:938:19 | b [element 1] | array_flow.rb:938:9:938:22 | call to product [element, element] | | array_flow.rb:938:19:938:19 | b [element 1] | array_flow.rb:938:9:938:22 | call to product [element, element] | | array_flow.rb:938:22:938:22 | c [element 0] | array_flow.rb:938:9:938:22 | call to product [element, element] | -| array_flow.rb:938:22:938:22 | c [element 0] | array_flow.rb:938:9:938:22 | call to product [element, element] | -| array_flow.rb:939:10:939:10 | d [element, element] | array_flow.rb:939:10:939:13 | ...[...] [element] | | array_flow.rb:939:10:939:10 | d [element, element] | array_flow.rb:939:10:939:13 | ...[...] [element] | | array_flow.rb:939:10:939:13 | ...[...] [element] | array_flow.rb:939:10:939:16 | ...[...] | -| array_flow.rb:939:10:939:13 | ...[...] [element] | array_flow.rb:939:10:939:16 | ...[...] | -| array_flow.rb:940:10:940:10 | d [element, element] | array_flow.rb:940:10:940:13 | ...[...] [element] | | array_flow.rb:940:10:940:10 | d [element, element] | array_flow.rb:940:10:940:13 | ...[...] [element] | | array_flow.rb:940:10:940:13 | ...[...] [element] | array_flow.rb:940:10:940:16 | ...[...] | -| array_flow.rb:940:10:940:13 | ...[...] [element] | array_flow.rb:940:10:940:16 | ...[...] | -| array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:945:9:945:9 | a [element 0] | | array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:945:9:945:9 | a [element 0] | | array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:946:10:946:10 | a [element 0] | -| array_flow.rb:944:5:944:5 | a [element 0] | array_flow.rb:946:10:946:10 | a [element 0] | -| array_flow.rb:944:10:944:21 | call to source | array_flow.rb:944:5:944:5 | a [element 0] | | array_flow.rb:944:10:944:21 | call to source | array_flow.rb:944:5:944:5 | a [element 0] | | array_flow.rb:945:5:945:5 | b [element 0] | array_flow.rb:948:10:948:10 | b [element 0] | -| array_flow.rb:945:5:945:5 | b [element 0] | array_flow.rb:948:10:948:10 | b [element 0] | -| array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:948:10:948:10 | b [element] | | array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:948:10:948:10 | b [element] | | array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:949:10:949:10 | b [element] | -| array_flow.rb:945:5:945:5 | b [element] | array_flow.rb:949:10:949:10 | b [element] | -| array_flow.rb:945:9:945:9 | [post] a [element] | array_flow.rb:946:10:946:10 | a [element] | | array_flow.rb:945:9:945:9 | [post] a [element] | array_flow.rb:946:10:946:10 | a [element] | | array_flow.rb:945:9:945:9 | [post] a [element] | array_flow.rb:947:10:947:10 | a [element] | -| array_flow.rb:945:9:945:9 | [post] a [element] | array_flow.rb:947:10:947:10 | a [element] | -| array_flow.rb:945:9:945:9 | a [element 0] | array_flow.rb:945:9:945:44 | call to append [element 0] | | array_flow.rb:945:9:945:9 | a [element 0] | array_flow.rb:945:9:945:44 | call to append [element 0] | | array_flow.rb:945:9:945:44 | call to append [element 0] | array_flow.rb:945:5:945:5 | b [element 0] | -| array_flow.rb:945:9:945:44 | call to append [element 0] | array_flow.rb:945:5:945:5 | b [element 0] | -| array_flow.rb:945:9:945:44 | call to append [element] | array_flow.rb:945:5:945:5 | b [element] | | array_flow.rb:945:9:945:44 | call to append [element] | array_flow.rb:945:5:945:5 | b [element] | | array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:9 | [post] a [element] | -| array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:9 | [post] a [element] | -| array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:44 | call to append [element] | | array_flow.rb:945:18:945:29 | call to source | array_flow.rb:945:9:945:44 | call to append [element] | | array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:9 | [post] a [element] | -| array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:9 | [post] a [element] | -| array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:44 | call to append [element] | | array_flow.rb:945:32:945:43 | call to source | array_flow.rb:945:9:945:44 | call to append [element] | | array_flow.rb:946:10:946:10 | a [element 0] | array_flow.rb:946:10:946:13 | ...[...] | -| array_flow.rb:946:10:946:10 | a [element 0] | array_flow.rb:946:10:946:13 | ...[...] | -| array_flow.rb:946:10:946:10 | a [element] | array_flow.rb:946:10:946:13 | ...[...] | | array_flow.rb:946:10:946:10 | a [element] | array_flow.rb:946:10:946:13 | ...[...] | | array_flow.rb:947:10:947:10 | a [element] | array_flow.rb:947:10:947:13 | ...[...] | -| array_flow.rb:947:10:947:10 | a [element] | array_flow.rb:947:10:947:13 | ...[...] | -| array_flow.rb:948:10:948:10 | b [element 0] | array_flow.rb:948:10:948:13 | ...[...] | | array_flow.rb:948:10:948:10 | b [element 0] | array_flow.rb:948:10:948:13 | ...[...] | | array_flow.rb:948:10:948:10 | b [element] | array_flow.rb:948:10:948:13 | ...[...] | -| array_flow.rb:948:10:948:10 | b [element] | array_flow.rb:948:10:948:13 | ...[...] | -| array_flow.rb:949:10:949:10 | b [element] | array_flow.rb:949:10:949:13 | ...[...] | | array_flow.rb:949:10:949:10 | b [element] | array_flow.rb:949:10:949:13 | ...[...] | | array_flow.rb:955:5:955:5 | c [element 0] | array_flow.rb:956:16:956:16 | c [element 0] | -| array_flow.rb:955:5:955:5 | c [element 0] | array_flow.rb:956:16:956:16 | c [element 0] | -| array_flow.rb:955:10:955:19 | call to source | array_flow.rb:955:5:955:5 | c [element 0] | | array_flow.rb:955:10:955:19 | call to source | array_flow.rb:955:5:955:5 | c [element 0] | | array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:957:10:957:10 | d [element 2, element 0] | -| array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:957:10:957:10 | d [element 2, element 0] | -| array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:958:10:958:10 | d [element 2, element 0] | | array_flow.rb:956:5:956:5 | d [element 2, element 0] | array_flow.rb:958:10:958:10 | d [element 2, element 0] | | array_flow.rb:956:16:956:16 | c [element 0] | array_flow.rb:956:5:956:5 | d [element 2, element 0] | -| array_flow.rb:956:16:956:16 | c [element 0] | array_flow.rb:956:5:956:5 | d [element 2, element 0] | -| array_flow.rb:957:10:957:10 | d [element 2, element 0] | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | | array_flow.rb:957:10:957:10 | d [element 2, element 0] | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | array_flow.rb:957:10:957:25 | ...[...] | -| array_flow.rb:957:10:957:22 | call to rassoc [element 0] | array_flow.rb:957:10:957:25 | ...[...] | -| array_flow.rb:958:10:958:10 | d [element 2, element 0] | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | | array_flow.rb:958:10:958:10 | d [element 2, element 0] | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | array_flow.rb:958:10:958:25 | ...[...] | -| array_flow.rb:958:10:958:22 | call to rassoc [element 0] | array_flow.rb:958:10:958:25 | ...[...] | -| array_flow.rb:962:5:962:5 | a [element 0] | array_flow.rb:963:9:963:9 | a [element 0] | | array_flow.rb:962:5:962:5 | a [element 0] | array_flow.rb:963:9:963:9 | a [element 0] | | array_flow.rb:962:5:962:5 | a [element 0] | array_flow.rb:968:9:968:9 | a [element 0] | -| array_flow.rb:962:5:962:5 | a [element 0] | array_flow.rb:968:9:968:9 | a [element 0] | -| array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:963:9:963:9 | a [element 2] | | array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:963:9:963:9 | a [element 2] | | array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:968:9:968:9 | a [element 2] | -| array_flow.rb:962:5:962:5 | a [element 2] | array_flow.rb:968:9:968:9 | a [element 2] | -| array_flow.rb:962:10:962:21 | call to source | array_flow.rb:962:5:962:5 | a [element 0] | | array_flow.rb:962:10:962:21 | call to source | array_flow.rb:962:5:962:5 | a [element 0] | | array_flow.rb:962:27:962:38 | call to source | array_flow.rb:962:5:962:5 | a [element 2] | -| array_flow.rb:962:27:962:38 | call to source | array_flow.rb:962:5:962:5 | a [element 2] | -| array_flow.rb:963:9:963:9 | a [element 0] | array_flow.rb:963:22:963:22 | x | | array_flow.rb:963:9:963:9 | a [element 0] | array_flow.rb:963:22:963:22 | x | | array_flow.rb:963:9:963:9 | a [element 2] | array_flow.rb:963:25:963:25 | y | -| array_flow.rb:963:9:963:9 | a [element 2] | array_flow.rb:963:25:963:25 | y | -| array_flow.rb:963:22:963:22 | x | array_flow.rb:964:14:964:14 | x | | array_flow.rb:963:22:963:22 | x | array_flow.rb:964:14:964:14 | x | | array_flow.rb:963:25:963:25 | y | array_flow.rb:965:14:965:14 | y | -| array_flow.rb:963:25:963:25 | y | array_flow.rb:965:14:965:14 | y | -| array_flow.rb:968:9:968:9 | a [element 0] | array_flow.rb:968:28:968:28 | y | | array_flow.rb:968:9:968:9 | a [element 0] | array_flow.rb:968:28:968:28 | y | | array_flow.rb:968:9:968:9 | a [element 2] | array_flow.rb:968:28:968:28 | y | -| array_flow.rb:968:9:968:9 | a [element 2] | array_flow.rb:968:28:968:28 | y | -| array_flow.rb:968:28:968:28 | y | array_flow.rb:970:14:970:14 | y | | array_flow.rb:968:28:968:28 | y | array_flow.rb:970:14:970:14 | y | | array_flow.rb:976:5:976:5 | a [element 2] | array_flow.rb:977:9:977:9 | a [element 2] | -| array_flow.rb:976:5:976:5 | a [element 2] | array_flow.rb:977:9:977:9 | a [element 2] | -| array_flow.rb:976:16:976:25 | call to source | array_flow.rb:976:5:976:5 | a [element 2] | | array_flow.rb:976:16:976:25 | call to source | array_flow.rb:976:5:976:5 | a [element 2] | | array_flow.rb:977:5:977:5 | b [element] | array_flow.rb:981:10:981:10 | b [element] | -| array_flow.rb:977:5:977:5 | b [element] | array_flow.rb:981:10:981:10 | b [element] | -| array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:9:980:7 | call to reject [element] | | array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:9:980:7 | call to reject [element] | | array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:22:977:22 | x | -| array_flow.rb:977:9:977:9 | a [element 2] | array_flow.rb:977:22:977:22 | x | -| array_flow.rb:977:9:980:7 | call to reject [element] | array_flow.rb:977:5:977:5 | b [element] | | array_flow.rb:977:9:980:7 | call to reject [element] | array_flow.rb:977:5:977:5 | b [element] | | array_flow.rb:977:22:977:22 | x | array_flow.rb:978:14:978:14 | x | -| array_flow.rb:977:22:977:22 | x | array_flow.rb:978:14:978:14 | x | -| array_flow.rb:981:10:981:10 | b [element] | array_flow.rb:981:10:981:13 | ...[...] | | array_flow.rb:981:10:981:10 | b [element] | array_flow.rb:981:10:981:13 | ...[...] | | array_flow.rb:985:5:985:5 | a [element 2] | array_flow.rb:986:9:986:9 | a [element 2] | -| array_flow.rb:985:5:985:5 | a [element 2] | array_flow.rb:986:9:986:9 | a [element 2] | -| array_flow.rb:985:16:985:25 | call to source | array_flow.rb:985:5:985:5 | a [element 2] | | array_flow.rb:985:16:985:25 | call to source | array_flow.rb:985:5:985:5 | a [element 2] | | array_flow.rb:986:5:986:5 | b [element] | array_flow.rb:991:10:991:10 | b [element] | -| array_flow.rb:986:5:986:5 | b [element] | array_flow.rb:991:10:991:10 | b [element] | -| array_flow.rb:986:9:986:9 | [post] a [element] | array_flow.rb:990:10:990:10 | a [element] | | array_flow.rb:986:9:986:9 | [post] a [element] | array_flow.rb:990:10:990:10 | a [element] | | array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:9:986:9 | [post] a [element] | -| array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:9:986:9 | [post] a [element] | -| array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:9:989:7 | call to reject! [element] | | array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:9:989:7 | call to reject! [element] | | array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:23:986:23 | x | -| array_flow.rb:986:9:986:9 | a [element 2] | array_flow.rb:986:23:986:23 | x | -| array_flow.rb:986:9:989:7 | call to reject! [element] | array_flow.rb:986:5:986:5 | b [element] | | array_flow.rb:986:9:989:7 | call to reject! [element] | array_flow.rb:986:5:986:5 | b [element] | | array_flow.rb:986:23:986:23 | x | array_flow.rb:987:14:987:14 | x | -| array_flow.rb:986:23:986:23 | x | array_flow.rb:987:14:987:14 | x | -| array_flow.rb:990:10:990:10 | a [element] | array_flow.rb:990:10:990:13 | ...[...] | | array_flow.rb:990:10:990:10 | a [element] | array_flow.rb:990:10:990:13 | ...[...] | | array_flow.rb:991:10:991:10 | b [element] | array_flow.rb:991:10:991:13 | ...[...] | -| array_flow.rb:991:10:991:10 | b [element] | array_flow.rb:991:10:991:13 | ...[...] | -| array_flow.rb:995:5:995:5 | a [element 2] | array_flow.rb:996:9:996:9 | a [element 2] | | array_flow.rb:995:5:995:5 | a [element 2] | array_flow.rb:996:9:996:9 | a [element 2] | | array_flow.rb:995:16:995:25 | call to source | array_flow.rb:995:5:995:5 | a [element 2] | -| array_flow.rb:995:16:995:25 | call to source | array_flow.rb:995:5:995:5 | a [element 2] | -| array_flow.rb:996:5:996:5 | b [element 2] | array_flow.rb:1001:10:1001:10 | b [element 2] | | array_flow.rb:996:5:996:5 | b [element 2] | array_flow.rb:1001:10:1001:10 | b [element 2] | | array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | -| array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | -| array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:39:996:39 | x [element] | | array_flow.rb:996:9:996:9 | a [element 2] | array_flow.rb:996:39:996:39 | x [element] | | array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | array_flow.rb:996:5:996:5 | b [element 2] | -| array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | array_flow.rb:996:5:996:5 | b [element 2] | -| array_flow.rb:996:39:996:39 | x [element] | array_flow.rb:997:14:997:14 | x [element] | | array_flow.rb:996:39:996:39 | x [element] | array_flow.rb:997:14:997:14 | x [element] | | array_flow.rb:996:39:996:39 | x [element] | array_flow.rb:998:14:998:14 | x [element] | -| array_flow.rb:996:39:996:39 | x [element] | array_flow.rb:998:14:998:14 | x [element] | -| array_flow.rb:997:14:997:14 | x [element] | array_flow.rb:997:14:997:17 | ...[...] | | array_flow.rb:997:14:997:14 | x [element] | array_flow.rb:997:14:997:17 | ...[...] | | array_flow.rb:998:14:998:14 | x [element] | array_flow.rb:998:14:998:17 | ...[...] | -| array_flow.rb:998:14:998:14 | x [element] | array_flow.rb:998:14:998:17 | ...[...] | -| array_flow.rb:1001:10:1001:10 | b [element 2] | array_flow.rb:1001:10:1001:13 | ...[...] | | array_flow.rb:1001:10:1001:10 | b [element 2] | array_flow.rb:1001:10:1001:13 | ...[...] | | array_flow.rb:1005:5:1005:5 | a [element 2] | array_flow.rb:1006:9:1006:9 | a [element 2] | -| array_flow.rb:1005:5:1005:5 | a [element 2] | array_flow.rb:1006:9:1006:9 | a [element 2] | -| array_flow.rb:1005:16:1005:25 | call to source | array_flow.rb:1005:5:1005:5 | a [element 2] | | array_flow.rb:1005:16:1005:25 | call to source | array_flow.rb:1005:5:1005:5 | a [element 2] | | array_flow.rb:1006:5:1006:5 | b [element 2] | array_flow.rb:1011:10:1011:10 | b [element 2] | -| array_flow.rb:1006:5:1006:5 | b [element 2] | array_flow.rb:1011:10:1011:10 | b [element 2] | -| array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | | array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | | array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:39:1006:39 | x [element] | -| array_flow.rb:1006:9:1006:9 | a [element 2] | array_flow.rb:1006:39:1006:39 | x [element] | -| array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | array_flow.rb:1006:5:1006:5 | b [element 2] | | array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | array_flow.rb:1006:5:1006:5 | b [element 2] | | array_flow.rb:1006:39:1006:39 | x [element] | array_flow.rb:1007:14:1007:14 | x [element] | -| array_flow.rb:1006:39:1006:39 | x [element] | array_flow.rb:1007:14:1007:14 | x [element] | -| array_flow.rb:1006:39:1006:39 | x [element] | array_flow.rb:1008:14:1008:14 | x [element] | | array_flow.rb:1006:39:1006:39 | x [element] | array_flow.rb:1008:14:1008:14 | x [element] | | array_flow.rb:1007:14:1007:14 | x [element] | array_flow.rb:1007:14:1007:17 | ...[...] | -| array_flow.rb:1007:14:1007:14 | x [element] | array_flow.rb:1007:14:1007:17 | ...[...] | -| array_flow.rb:1008:14:1008:14 | x [element] | array_flow.rb:1008:14:1008:17 | ...[...] | | array_flow.rb:1008:14:1008:14 | x [element] | array_flow.rb:1008:14:1008:17 | ...[...] | | array_flow.rb:1011:10:1011:10 | b [element 2] | array_flow.rb:1011:10:1011:13 | ...[...] | -| array_flow.rb:1011:10:1011:10 | b [element 2] | array_flow.rb:1011:10:1011:13 | ...[...] | -| array_flow.rb:1017:5:1017:5 | b [element 0] | array_flow.rb:1019:10:1019:10 | b [element 0] | | array_flow.rb:1017:5:1017:5 | b [element 0] | array_flow.rb:1019:10:1019:10 | b [element 0] | | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | array_flow.rb:1018:10:1018:10 | a [element 0] | -| array_flow.rb:1017:9:1017:9 | [post] a [element 0] | array_flow.rb:1018:10:1018:10 | a [element 0] | -| array_flow.rb:1017:9:1017:33 | call to replace [element 0] | array_flow.rb:1017:5:1017:5 | b [element 0] | | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | array_flow.rb:1017:5:1017:5 | b [element 0] | | array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | -| array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | -| array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | | array_flow.rb:1017:20:1017:31 | call to source | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | | array_flow.rb:1018:10:1018:10 | a [element 0] | array_flow.rb:1018:10:1018:13 | ...[...] | -| array_flow.rb:1018:10:1018:10 | a [element 0] | array_flow.rb:1018:10:1018:13 | ...[...] | -| array_flow.rb:1019:10:1019:10 | b [element 0] | array_flow.rb:1019:10:1019:13 | ...[...] | | array_flow.rb:1019:10:1019:10 | b [element 0] | array_flow.rb:1019:10:1019:13 | ...[...] | | array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1024:9:1024:9 | a [element 2] | -| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1024:9:1024:9 | a [element 2] | -| array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1029:10:1029:10 | a [element 2] | | array_flow.rb:1023:5:1023:5 | a [element 2] | array_flow.rb:1029:10:1029:10 | a [element 2] | | array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1024:9:1024:9 | a [element 3] | -| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1024:9:1024:9 | a [element 3] | -| array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1030:10:1030:10 | a [element 3] | | array_flow.rb:1023:5:1023:5 | a [element 3] | array_flow.rb:1030:10:1030:10 | a [element 3] | | array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:5:1023:5 | a [element 2] | -| array_flow.rb:1023:16:1023:28 | call to source | array_flow.rb:1023:5:1023:5 | a [element 2] | -| array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:5:1023:5 | a [element 3] | | array_flow.rb:1023:31:1023:43 | call to source | array_flow.rb:1023:5:1023:5 | a [element 3] | | array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1025:10:1025:10 | b [element] | -| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1025:10:1025:10 | b [element] | -| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1026:10:1026:10 | b [element] | | array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1026:10:1026:10 | b [element] | | array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1027:10:1027:10 | b [element] | -| array_flow.rb:1024:5:1024:5 | b [element] | array_flow.rb:1027:10:1027:10 | b [element] | -| array_flow.rb:1024:9:1024:9 | a [element 2] | array_flow.rb:1024:9:1024:17 | call to reverse [element] | | array_flow.rb:1024:9:1024:9 | a [element 2] | array_flow.rb:1024:9:1024:17 | call to reverse [element] | | array_flow.rb:1024:9:1024:9 | a [element 3] | array_flow.rb:1024:9:1024:17 | call to reverse [element] | -| array_flow.rb:1024:9:1024:9 | a [element 3] | array_flow.rb:1024:9:1024:17 | call to reverse [element] | -| array_flow.rb:1024:9:1024:17 | call to reverse [element] | array_flow.rb:1024:5:1024:5 | b [element] | | array_flow.rb:1024:9:1024:17 | call to reverse [element] | array_flow.rb:1024:5:1024:5 | b [element] | | array_flow.rb:1025:10:1025:10 | b [element] | array_flow.rb:1025:10:1025:13 | ...[...] | -| array_flow.rb:1025:10:1025:10 | b [element] | array_flow.rb:1025:10:1025:13 | ...[...] | -| array_flow.rb:1026:10:1026:10 | b [element] | array_flow.rb:1026:10:1026:13 | ...[...] | | array_flow.rb:1026:10:1026:10 | b [element] | array_flow.rb:1026:10:1026:13 | ...[...] | | array_flow.rb:1027:10:1027:10 | b [element] | array_flow.rb:1027:10:1027:13 | ...[...] | -| array_flow.rb:1027:10:1027:10 | b [element] | array_flow.rb:1027:10:1027:13 | ...[...] | -| array_flow.rb:1029:10:1029:10 | a [element 2] | array_flow.rb:1029:10:1029:13 | ...[...] | | array_flow.rb:1029:10:1029:10 | a [element 2] | array_flow.rb:1029:10:1029:13 | ...[...] | | array_flow.rb:1030:10:1030:10 | a [element 3] | array_flow.rb:1030:10:1030:13 | ...[...] | -| array_flow.rb:1030:10:1030:10 | a [element 3] | array_flow.rb:1030:10:1030:13 | ...[...] | -| array_flow.rb: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:5:1034:5 | a [element 2] | array_flow.rb:1040:10:1040:10 | a [element 2] | -| array_flow.rb:1034:5:1034:5 | a [element 2] | array_flow.rb:1040:10:1040:10 | a [element 2] | -| array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1035:9:1035:9 | a [element 3] | | array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1035:9:1035:9 | a [element 3] | | array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1041:10:1041:10 | a [element 3] | -| array_flow.rb:1034:5:1034:5 | a [element 3] | array_flow.rb:1041:10:1041:10 | a [element 3] | -| array_flow.rb:1034:16:1034:28 | call to source | array_flow.rb:1034:5:1034:5 | a [element 2] | | array_flow.rb:1034:16:1034:28 | call to source | array_flow.rb:1034:5:1034:5 | a [element 2] | | array_flow.rb:1034:31:1034:43 | call to source | array_flow.rb:1034:5:1034:5 | a [element 3] | -| array_flow.rb:1034:31:1034:43 | call to source | array_flow.rb:1034:5:1034:5 | a [element 3] | -| array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1036:10:1036:10 | b [element] | | array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1036:10:1036:10 | b [element] | | array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1037:10:1037:10 | b [element] | -| array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1037:10:1037:10 | b [element] | -| array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1038:10:1038:10 | b [element] | | array_flow.rb:1035:5:1035:5 | b [element] | array_flow.rb:1038:10:1038:10 | b [element] | | array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1039:10:1039:10 | a [element] | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1039:10:1039:10 | a [element] | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1040:10:1040:10 | a [element] | | array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1040:10:1040:10 | a [element] | | array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1041:10:1041:10 | a [element] | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | array_flow.rb:1041:10:1041:10 | a [element] | -| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1035:9 | [post] a [element] | | array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1035:9 | [post] a [element] | | array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | -| array_flow.rb:1035:9:1035:9 | a [element 2] | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | -| array_flow.rb:1035:9:1035:9 | a [element 3] | array_flow.rb:1035:9:1035:9 | [post] a [element] | | array_flow.rb:1035:9:1035:9 | a [element 3] | array_flow.rb:1035:9:1035:9 | [post] a [element] | | array_flow.rb:1035:9:1035:9 | a [element 3] | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | -| array_flow.rb:1035:9:1035:9 | a [element 3] | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | -| array_flow.rb:1035:9:1035:18 | call to reverse! [element] | array_flow.rb:1035:5:1035:5 | b [element] | | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | array_flow.rb:1035:5:1035:5 | b [element] | | array_flow.rb:1036:10:1036:10 | b [element] | array_flow.rb:1036:10:1036:13 | ...[...] | -| array_flow.rb:1036:10:1036:10 | b [element] | array_flow.rb:1036:10:1036:13 | ...[...] | -| array_flow.rb:1037:10:1037:10 | b [element] | array_flow.rb:1037:10:1037:13 | ...[...] | | array_flow.rb:1037:10:1037:10 | b [element] | array_flow.rb:1037:10:1037:13 | ...[...] | | array_flow.rb:1038:10:1038:10 | b [element] | array_flow.rb:1038:10:1038:13 | ...[...] | -| array_flow.rb:1038:10:1038:10 | b [element] | array_flow.rb:1038:10:1038:13 | ...[...] | -| array_flow.rb:1039:10:1039:10 | a [element] | array_flow.rb:1039:10:1039:13 | ...[...] | | array_flow.rb:1039:10:1039:10 | a [element] | array_flow.rb:1039:10:1039:13 | ...[...] | | array_flow.rb:1040:10:1040:10 | a [element 2] | array_flow.rb:1040:10:1040:13 | ...[...] | -| array_flow.rb:1040:10:1040:10 | a [element 2] | array_flow.rb:1040:10:1040:13 | ...[...] | -| array_flow.rb:1040:10:1040:10 | a [element] | array_flow.rb:1040:10:1040:13 | ...[...] | | array_flow.rb:1040:10:1040:10 | a [element] | array_flow.rb:1040:10:1040:13 | ...[...] | | array_flow.rb:1041:10:1041:10 | a [element 3] | array_flow.rb:1041:10:1041:13 | ...[...] | -| array_flow.rb:1041:10:1041:10 | a [element 3] | array_flow.rb:1041:10:1041:13 | ...[...] | -| array_flow.rb:1041:10:1041:10 | a [element] | array_flow.rb:1041:10:1041:13 | ...[...] | | array_flow.rb:1041:10:1041:10 | a [element] | array_flow.rb:1041:10:1041:13 | ...[...] | | array_flow.rb:1045:5:1045:5 | a [element 2] | array_flow.rb:1046:9:1046:9 | a [element 2] | -| array_flow.rb:1045:5:1045:5 | a [element 2] | array_flow.rb:1046:9:1046:9 | a [element 2] | -| array_flow.rb:1045:16:1045:26 | call to source | array_flow.rb:1045:5:1045:5 | a [element 2] | | array_flow.rb:1045:16:1045:26 | call to source | array_flow.rb:1045:5:1045:5 | a [element 2] | | array_flow.rb:1046:5:1046:5 | b [element 2] | array_flow.rb:1049:10:1049:10 | b [element 2] | -| array_flow.rb:1046:5:1046:5 | b [element 2] | array_flow.rb:1049:10:1049:10 | b [element 2] | -| array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | | array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | | array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:28:1046:28 | x | -| array_flow.rb:1046:9:1046:9 | a [element 2] | array_flow.rb:1046:28:1046:28 | x | -| array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | array_flow.rb:1046:5:1046:5 | b [element 2] | | array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | array_flow.rb:1046:5:1046:5 | b [element 2] | | array_flow.rb:1046:28:1046:28 | x | array_flow.rb:1047:14:1047:14 | x | -| array_flow.rb:1046:28:1046:28 | x | array_flow.rb:1047:14:1047:14 | x | -| array_flow.rb:1049:10:1049:10 | b [element 2] | array_flow.rb:1049:10:1049:13 | ...[...] | | array_flow.rb:1049:10:1049:10 | b [element 2] | array_flow.rb:1049:10:1049:13 | ...[...] | | array_flow.rb:1053:5:1053:5 | a [element 2] | array_flow.rb:1054:5:1054:5 | a [element 2] | -| array_flow.rb:1053:5:1053:5 | a [element 2] | array_flow.rb:1054:5:1054:5 | a [element 2] | -| array_flow.rb:1053:16:1053:26 | call to source | array_flow.rb:1053:5:1053:5 | a [element 2] | | array_flow.rb:1053:16:1053:26 | call to source | array_flow.rb:1053:5:1053:5 | a [element 2] | | array_flow.rb:1054:5:1054:5 | a [element 2] | array_flow.rb:1054:18:1054:18 | x | -| array_flow.rb:1054:5:1054:5 | a [element 2] | array_flow.rb:1054:18:1054:18 | x | -| array_flow.rb:1054:18:1054:18 | x | array_flow.rb:1055:14:1055:14 | x | | array_flow.rb:1054:18:1054:18 | x | array_flow.rb:1055:14:1055:14 | x | | array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1065:9:1065:9 | a [element 0] | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1065:9:1065:9 | a [element 0] | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1071:9:1071:9 | a [element 0] | | array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1071:9:1071:9 | a [element 0] | | array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1077:9:1077:9 | a [element 0] | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1077:9:1077:9 | a [element 0] | -| array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1083:9:1083:9 | a [element 0] | | array_flow.rb:1063:5:1063:5 | a [element 0] | array_flow.rb:1083:9:1083:9 | a [element 0] | | array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1065:9:1065:9 | a [element 2] | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1065:9:1065:9 | a [element 2] | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1071:9:1071:9 | a [element 2] | | array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1071:9:1071:9 | a [element 2] | | array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1077:9:1077:9 | a [element 2] | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1077:9:1077:9 | a [element 2] | -| array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1083:9:1083:9 | a [element 2] | | array_flow.rb:1063:5:1063:5 | a [element 2] | array_flow.rb:1083:9:1083:9 | a [element 2] | | array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1065:9:1065:9 | a [element 3] | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1065:9:1065:9 | a [element 3] | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1071:9:1071:9 | a [element 3] | | array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1071:9:1071:9 | a [element 3] | | array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1077:9:1077:9 | a [element 3] | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1077:9:1077:9 | a [element 3] | -| array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1083:9:1083:9 | a [element 3] | | array_flow.rb:1063:5:1063:5 | a [element 3] | array_flow.rb:1083:9:1083:9 | a [element 3] | | array_flow.rb:1063:10:1063:22 | call to source | array_flow.rb:1063:5:1063:5 | a [element 0] | -| array_flow.rb:1063:10:1063:22 | call to source | array_flow.rb:1063:5:1063:5 | a [element 0] | -| array_flow.rb:1063:28:1063:40 | call to source | array_flow.rb:1063:5:1063:5 | a [element 2] | | array_flow.rb:1063:28:1063:40 | call to source | array_flow.rb:1063:5:1063:5 | a [element 2] | | array_flow.rb:1063:43:1063:55 | call to source | array_flow.rb:1063:5:1063:5 | a [element 3] | -| array_flow.rb:1063:43:1063:55 | call to source | array_flow.rb:1063:5:1063:5 | a [element 3] | -| array_flow.rb:1065:5:1065:5 | b [element 1] | array_flow.rb:1067:10:1067:10 | b [element 1] | | array_flow.rb:1065:5:1065:5 | b [element 1] | array_flow.rb:1067:10:1067:10 | b [element 1] | | array_flow.rb:1065:5:1065:5 | b [element 2] | array_flow.rb:1068:10:1068:10 | b [element 2] | -| array_flow.rb:1065:5:1065:5 | b [element 2] | array_flow.rb:1068:10:1068:10 | b [element 2] | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1066:10:1066:10 | b [element] | | array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1066:10:1066:10 | b [element] | | array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1067:10:1067:10 | b [element] | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1067:10:1067:10 | b [element] | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1068:10:1068:10 | b [element] | | array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1068:10:1068:10 | b [element] | | array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1069:10:1069:10 | b [element] | -| array_flow.rb:1065:5:1065:5 | b [element] | array_flow.rb:1069:10:1069:10 | b [element] | -| array_flow.rb:1065:9:1065:9 | a [element 0] | array_flow.rb:1065:9:1065:16 | call to rotate [element] | | array_flow.rb:1065:9:1065:9 | a [element 0] | array_flow.rb:1065:9:1065:16 | call to rotate [element] | | array_flow.rb:1065:9:1065:9 | a [element 2] | array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | -| array_flow.rb:1065:9:1065:9 | a [element 2] | array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | -| array_flow.rb:1065:9:1065:9 | a [element 3] | array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | | array_flow.rb:1065:9:1065:9 | a [element 3] | array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | | array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | array_flow.rb:1065:5:1065:5 | b [element 1] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | array_flow.rb:1065:5:1065:5 | b [element 1] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | array_flow.rb:1065:5:1065:5 | b [element 2] | | array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | array_flow.rb:1065:5:1065:5 | b [element 2] | | array_flow.rb:1065:9:1065:16 | call to rotate [element] | array_flow.rb:1065:5:1065:5 | b [element] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element] | array_flow.rb:1065:5:1065:5 | b [element] | -| array_flow.rb:1066:10:1066:10 | b [element] | array_flow.rb:1066:10:1066:13 | ...[...] | | array_flow.rb:1066:10:1066:10 | b [element] | array_flow.rb:1066:10:1066:13 | ...[...] | | array_flow.rb:1067:10:1067:10 | b [element 1] | array_flow.rb:1067:10:1067:13 | ...[...] | -| array_flow.rb:1067:10:1067:10 | b [element 1] | array_flow.rb:1067:10:1067:13 | ...[...] | -| array_flow.rb:1067:10:1067:10 | b [element] | array_flow.rb:1067:10:1067:13 | ...[...] | | array_flow.rb:1067:10:1067:10 | b [element] | array_flow.rb:1067:10:1067:13 | ...[...] | | array_flow.rb:1068:10:1068:10 | b [element 2] | array_flow.rb:1068:10:1068:13 | ...[...] | -| array_flow.rb:1068:10:1068:10 | b [element 2] | array_flow.rb:1068:10:1068:13 | ...[...] | -| array_flow.rb:1068:10:1068:10 | b [element] | array_flow.rb:1068:10:1068:13 | ...[...] | | array_flow.rb:1068:10:1068:10 | b [element] | array_flow.rb:1068:10:1068:13 | ...[...] | | array_flow.rb:1069:10:1069:10 | b [element] | array_flow.rb:1069:10:1069:13 | ...[...] | -| array_flow.rb:1069:10:1069:10 | b [element] | array_flow.rb:1069:10:1069:13 | ...[...] | -| array_flow.rb:1071:5:1071:5 | b [element 0] | array_flow.rb:1072:10:1072:10 | b [element 0] | | array_flow.rb:1071:5:1071:5 | b [element 0] | array_flow.rb:1072:10:1072:10 | b [element 0] | | array_flow.rb:1071:5:1071:5 | b [element 1] | array_flow.rb:1073:10:1073:10 | b [element 1] | -| array_flow.rb:1071:5:1071:5 | b [element 1] | array_flow.rb:1073:10:1073:10 | b [element 1] | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1072:10:1072:10 | b [element] | | array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1072:10:1072:10 | b [element] | | array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1073:10:1073:10 | b [element] | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1073:10:1073:10 | b [element] | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1074:10:1074:10 | b [element] | | array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1074:10:1074:10 | b [element] | | array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1075:10:1075:10 | b [element] | -| array_flow.rb:1071:5:1071:5 | b [element] | array_flow.rb:1075:10:1075:10 | b [element] | -| array_flow.rb:1071:9:1071:9 | a [element 0] | array_flow.rb:1071:9:1071:19 | call to rotate [element] | | array_flow.rb:1071:9:1071:9 | a [element 0] | array_flow.rb:1071:9:1071:19 | call to rotate [element] | | array_flow.rb:1071:9:1071:9 | a [element 2] | array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | -| array_flow.rb:1071:9:1071:9 | a [element 2] | array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | -| array_flow.rb:1071:9:1071:9 | a [element 3] | array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | | array_flow.rb:1071:9:1071:9 | a [element 3] | array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | | array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | array_flow.rb:1071:5:1071:5 | b [element 0] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | array_flow.rb:1071:5:1071:5 | b [element 0] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | array_flow.rb:1071:5:1071:5 | b [element 1] | | array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | array_flow.rb:1071:5:1071:5 | b [element 1] | | array_flow.rb:1071:9:1071:19 | call to rotate [element] | array_flow.rb:1071:5:1071:5 | b [element] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element] | array_flow.rb:1071:5:1071:5 | b [element] | -| array_flow.rb:1072:10:1072:10 | b [element 0] | array_flow.rb:1072:10:1072:13 | ...[...] | | array_flow.rb:1072:10:1072:10 | b [element 0] | array_flow.rb:1072:10:1072:13 | ...[...] | | array_flow.rb:1072:10:1072:10 | b [element] | array_flow.rb:1072:10:1072:13 | ...[...] | -| array_flow.rb:1072:10:1072:10 | b [element] | array_flow.rb:1072:10:1072:13 | ...[...] | -| array_flow.rb:1073:10:1073:10 | b [element 1] | array_flow.rb:1073:10:1073:13 | ...[...] | | array_flow.rb:1073:10:1073:10 | b [element 1] | 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:1073:10:1073:10 | b [element] | array_flow.rb:1073:10:1073:13 | ...[...] | -| array_flow.rb:1074:10:1074:10 | b [element] | array_flow.rb:1074:10:1074:13 | ...[...] | | array_flow.rb:1074:10:1074:10 | b [element] | array_flow.rb:1074:10:1074:13 | ...[...] | | array_flow.rb:1075:10:1075:10 | b [element] | array_flow.rb:1075:10:1075:13 | ...[...] | -| array_flow.rb:1075:10:1075:10 | b [element] | array_flow.rb:1075:10:1075:13 | ...[...] | -| array_flow.rb:1077:5:1077:5 | b [element 0] | array_flow.rb:1078:10:1078:10 | b [element 0] | | array_flow.rb:1077:5:1077:5 | b [element 0] | array_flow.rb:1078:10:1078:10 | b [element 0] | | array_flow.rb:1077:5:1077:5 | b [element 2] | array_flow.rb:1080:10:1080:10 | b [element 2] | -| array_flow.rb:1077:5:1077:5 | b [element 2] | array_flow.rb:1080:10:1080:10 | b [element 2] | -| array_flow.rb:1077:5:1077:5 | b [element 3] | array_flow.rb:1081:10:1081:10 | b [element 3] | | array_flow.rb:1077:5:1077:5 | b [element 3] | array_flow.rb:1081:10:1081:10 | b [element 3] | | array_flow.rb:1077:9:1077:9 | a [element 0] | array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | -| array_flow.rb:1077:9:1077:9 | a [element 0] | array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | -| array_flow.rb:1077:9:1077:9 | a [element 2] | array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | | array_flow.rb:1077:9:1077:9 | a [element 2] | array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | | array_flow.rb:1077:9:1077:9 | a [element 3] | array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | -| array_flow.rb:1077:9:1077:9 | a [element 3] | array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | array_flow.rb:1077:5:1077:5 | b [element 0] | | array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | array_flow.rb:1077:5:1077:5 | b [element 0] | | array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | array_flow.rb:1077:5:1077:5 | b [element 2] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | array_flow.rb:1077:5:1077:5 | b [element 2] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | array_flow.rb:1077:5:1077:5 | b [element 3] | | array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | array_flow.rb:1077:5:1077:5 | b [element 3] | | array_flow.rb:1078:10:1078:10 | b [element 0] | array_flow.rb:1078:10:1078:13 | ...[...] | -| array_flow.rb:1078:10:1078:10 | b [element 0] | array_flow.rb:1078:10:1078:13 | ...[...] | -| array_flow.rb:1080:10:1080:10 | b [element 2] | array_flow.rb:1080:10:1080:13 | ...[...] | | array_flow.rb:1080:10:1080:10 | b [element 2] | array_flow.rb:1080:10:1080:13 | ...[...] | | array_flow.rb:1081:10:1081:10 | b [element 3] | array_flow.rb:1081:10:1081:13 | ...[...] | -| array_flow.rb:1081:10:1081:10 | b [element 3] | array_flow.rb:1081:10:1081:13 | ...[...] | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1084:10:1084:10 | b [element] | | array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1084:10:1084:10 | b [element] | | array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1085:10:1085:10 | b [element] | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1085:10:1085:10 | b [element] | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1086:10:1086:10 | b [element] | | array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1086:10:1086:10 | b [element] | | array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1087:10:1087:10 | b [element] | -| array_flow.rb:1083:5:1083:5 | b [element] | array_flow.rb:1087:10:1087:10 | b [element] | -| array_flow.rb:1083:9:1083:9 | a [element 0] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | | array_flow.rb:1083:9:1083:9 | a [element 0] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | | array_flow.rb:1083:9:1083:9 | a [element 2] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | -| array_flow.rb:1083:9:1083:9 | a [element 2] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | -| array_flow.rb:1083:9:1083:9 | a [element 3] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | | array_flow.rb:1083:9:1083:9 | a [element 3] | array_flow.rb:1083:9:1083:19 | call to rotate [element] | | array_flow.rb:1083:9:1083:19 | call to rotate [element] | array_flow.rb:1083:5:1083:5 | b [element] | -| array_flow.rb:1083:9:1083:19 | call to rotate [element] | array_flow.rb:1083:5:1083:5 | b [element] | -| array_flow.rb:1084:10:1084:10 | b [element] | array_flow.rb:1084:10:1084:13 | ...[...] | | array_flow.rb:1084:10:1084:10 | b [element] | array_flow.rb:1084:10:1084:13 | ...[...] | | array_flow.rb:1085:10:1085:10 | b [element] | array_flow.rb:1085:10:1085:13 | ...[...] | -| array_flow.rb:1085:10:1085:10 | b [element] | array_flow.rb:1085:10:1085:13 | ...[...] | -| array_flow.rb:1086:10:1086:10 | b [element] | array_flow.rb:1086:10:1086:13 | ...[...] | | array_flow.rb:1086:10:1086:10 | b [element] | array_flow.rb:1086:10:1086:13 | ...[...] | | array_flow.rb:1087:10:1087:10 | b [element] | array_flow.rb:1087:10:1087:13 | ...[...] | -| array_flow.rb:1087:10:1087:10 | b [element] | array_flow.rb:1087:10:1087:13 | ...[...] | -| array_flow.rb:1095:5:1095:5 | a [element 0] | array_flow.rb:1096:9:1096:9 | a [element 0] | | array_flow.rb:1095:5:1095:5 | a [element 0] | array_flow.rb:1096:9:1096:9 | a [element 0] | | array_flow.rb:1095:5:1095:5 | a [element 2] | array_flow.rb:1096:9:1096:9 | a [element 2] | -| array_flow.rb:1095:5:1095:5 | a [element 2] | array_flow.rb:1096:9:1096:9 | a [element 2] | -| array_flow.rb:1095:5:1095:5 | a [element 3] | array_flow.rb:1096:9:1096:9 | a [element 3] | | array_flow.rb:1095:5:1095:5 | a [element 3] | array_flow.rb:1096:9:1096:9 | a [element 3] | | array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:5:1095:5 | a [element 0] | -| array_flow.rb:1095:10:1095:22 | call to source | array_flow.rb:1095:5:1095:5 | a [element 0] | -| array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:5:1095:5 | a [element 2] | | array_flow.rb:1095:28:1095:40 | call to source | array_flow.rb:1095:5:1095:5 | a [element 2] | | array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:5:1095:5 | a [element 3] | -| array_flow.rb:1095:43:1095:55 | call to source | array_flow.rb:1095:5:1095:5 | a [element 3] | -| array_flow.rb:1096:5:1096:5 | b [element 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 2] | array_flow.rb:1103:10:1103:10 | b [element 2] | -| array_flow.rb:1096:5:1096:5 | b [element 2] | array_flow.rb:1103:10:1103:10 | b [element 2] | -| 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 1] | array_flow.rb:1098:10:1098:10 | a [element 1] | | array_flow.rb:1096:9:1096:9 | [post] a [element 1] | array_flow.rb:1098:10:1098:10 | a [element 1] | | array_flow.rb:1096:9:1096:9 | [post] a [element 2] | array_flow.rb:1099:10:1099:10 | a [element 2] | -| array_flow.rb:1096:9:1096:9 | [post] a [element 2] | array_flow.rb:1099:10:1099:10 | a [element 2] | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1097:10:1097:10 | a [element] | | array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1097:10:1097:10 | a [element] | | array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1098:10:1098:10 | a [element] | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1098:10:1098:10 | a [element] | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1099:10:1099:10 | a [element] | | array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1099:10:1099:10 | a [element] | | array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1100:10:1100:10 | a [element] | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | array_flow.rb:1100:10:1100:10 | a [element] | -| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:9 | [post] a [element] | | array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:9 | [post] a [element] | | array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:17 | call to rotate! [element] | -| array_flow.rb:1096:9:1096:9 | a [element 0] | array_flow.rb:1096:9:1096:17 | call to rotate! [element] | -| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:9 | [post] a [element 1] | | array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:9 | [post] a [element 1] | | array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | -| array_flow.rb:1096:9:1096:9 | a [element 2] | array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | -| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:9 | [post] a [element 2] | | array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:9 | [post] a [element 2] | | array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | -| array_flow.rb:1096:9:1096:9 | a [element 3] | array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | array_flow.rb:1096:5:1096:5 | b [element 1] | | array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | array_flow.rb:1096:5:1096:5 | b [element 1] | | array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | array_flow.rb:1096:5:1096:5 | b [element 2] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | array_flow.rb:1096:5:1096:5 | b [element 2] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element] | array_flow.rb:1096:5:1096:5 | b [element] | | array_flow.rb:1096:9:1096:17 | call to rotate! [element] | array_flow.rb:1096:5:1096:5 | b [element] | | array_flow.rb:1097:10:1097:10 | a [element] | array_flow.rb:1097:10:1097:13 | ...[...] | -| array_flow.rb:1097:10:1097:10 | a [element] | array_flow.rb:1097:10:1097:13 | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element 1] | array_flow.rb:1098:10:1098:13 | ...[...] | | array_flow.rb:1098:10:1098:10 | a [element 1] | array_flow.rb:1098:10:1098:13 | ...[...] | | array_flow.rb:1098:10:1098:10 | a [element] | array_flow.rb:1098:10:1098:13 | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element] | array_flow.rb:1098:10:1098:13 | ...[...] | -| array_flow.rb:1099:10:1099:10 | a [element 2] | array_flow.rb:1099:10:1099:13 | ...[...] | | array_flow.rb:1099:10:1099:10 | a [element 2] | array_flow.rb:1099:10:1099:13 | ...[...] | | array_flow.rb:1099:10:1099:10 | a [element] | array_flow.rb:1099:10:1099:13 | ...[...] | -| array_flow.rb:1099:10:1099:10 | a [element] | array_flow.rb:1099:10:1099:13 | ...[...] | -| array_flow.rb:1100:10:1100:10 | a [element] | array_flow.rb:1100:10:1100:13 | ...[...] | | array_flow.rb:1100:10:1100:10 | a [element] | array_flow.rb:1100:10:1100:13 | ...[...] | | array_flow.rb:1101:10:1101:10 | b [element] | array_flow.rb:1101:10:1101:13 | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element] | array_flow.rb:1101:10:1101:13 | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element 1] | array_flow.rb:1102:10:1102:13 | ...[...] | | array_flow.rb:1102:10:1102:10 | b [element 1] | array_flow.rb:1102:10:1102:13 | ...[...] | | array_flow.rb:1102:10:1102:10 | b [element] | array_flow.rb:1102:10:1102:13 | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element] | array_flow.rb:1102:10:1102:13 | ...[...] | -| array_flow.rb:1103:10:1103:10 | b [element 2] | array_flow.rb:1103:10:1103:13 | ...[...] | | array_flow.rb:1103:10:1103:10 | b [element 2] | array_flow.rb:1103:10:1103:13 | ...[...] | | array_flow.rb:1103:10:1103:10 | b [element] | array_flow.rb:1103:10:1103:13 | ...[...] | -| array_flow.rb:1103:10:1103:10 | b [element] | array_flow.rb:1103:10:1103:13 | ...[...] | -| array_flow.rb:1104:10:1104:10 | b [element] | array_flow.rb:1104:10:1104:13 | ...[...] | | array_flow.rb:1104:10:1104:10 | b [element] | array_flow.rb:1104:10:1104:13 | ...[...] | | array_flow.rb:1106:5:1106:5 | a [element 0] | array_flow.rb:1107:9:1107:9 | a [element 0] | -| array_flow.rb:1106:5:1106:5 | a [element 0] | array_flow.rb:1107:9:1107:9 | a [element 0] | -| array_flow.rb:1106:5:1106:5 | a [element 2] | array_flow.rb:1107:9:1107:9 | a [element 2] | | array_flow.rb:1106:5:1106:5 | a [element 2] | array_flow.rb:1107:9:1107:9 | a [element 2] | | array_flow.rb:1106:5:1106:5 | a [element 3] | array_flow.rb:1107:9:1107:9 | a [element 3] | -| array_flow.rb:1106:5:1106:5 | a [element 3] | array_flow.rb:1107:9:1107:9 | a [element 3] | -| array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:5:1106:5 | a [element 0] | | array_flow.rb:1106:10:1106:22 | call to source | array_flow.rb:1106:5:1106:5 | a [element 0] | | array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:5:1106:5 | a [element 2] | -| array_flow.rb:1106:28:1106:40 | call to source | array_flow.rb:1106:5:1106:5 | a [element 2] | -| array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:5:1106:5 | a [element 3] | | array_flow.rb:1106:43:1106:55 | call to source | array_flow.rb:1106:5:1106:5 | a [element 3] | | array_flow.rb:1107:5:1107:5 | b [element 0] | array_flow.rb:1112:10:1112:10 | b [element 0] | -| array_flow.rb:1107:5:1107:5 | b [element 0] | array_flow.rb:1112:10:1112:10 | b [element 0] | -| array_flow.rb:1107:5:1107:5 | b [element 1] | array_flow.rb:1113:10:1113:10 | b [element 1] | | array_flow.rb:1107:5:1107:5 | b [element 1] | array_flow.rb:1113:10:1113:10 | b [element 1] | | array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1112:10:1112:10 | b [element] | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1112:10:1112:10 | b [element] | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1113:10:1113:10 | b [element] | | array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1113:10:1113:10 | b [element] | | array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1114:10:1114:10 | b [element] | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1114:10:1114:10 | b [element] | -| array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1115:10:1115:10 | b [element] | | array_flow.rb:1107:5:1107:5 | b [element] | array_flow.rb:1115:10:1115:10 | b [element] | | 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 1] | array_flow.rb:1109:10:1109:10 | a [element 1] | | array_flow.rb:1107:9:1107:9 | [post] a [element 1] | array_flow.rb:1109:10:1109:10 | a [element 1] | | array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1108:10:1108:10 | a [element] | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1108:10:1108:10 | a [element] | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1109:10:1109:10 | a [element] | | array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1109:10:1109:10 | a [element] | | array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1110:10:1110:10 | a [element] | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1110:10:1110:10 | a [element] | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1111:10:1111:10 | a [element] | | array_flow.rb:1107:9:1107:9 | [post] a [element] | array_flow.rb:1111:10:1111:10 | a [element] | | array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:9 | [post] a [element] | -| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:9 | [post] a [element] | -| array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:20 | call to rotate! [element] | | array_flow.rb:1107:9:1107:9 | a [element 0] | array_flow.rb:1107:9:1107:20 | call to rotate! [element] | | array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:9 | [post] a [element 0] | -| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:9 | [post] a [element 0] | -| array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | | array_flow.rb:1107:9:1107:9 | a [element 2] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | | array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:9 | [post] a [element 1] | -| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:9 | [post] a [element 1] | -| array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | | array_flow.rb:1107:9:1107:9 | a [element 3] | array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | | 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 1] | array_flow.rb:1107:5:1107:5 | b [element 1] | | array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | array_flow.rb:1107:5:1107:5 | b [element 1] | | array_flow.rb:1107:9:1107:20 | call to rotate! [element] | array_flow.rb:1107:5:1107:5 | b [element] | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element] | array_flow.rb:1107:5:1107:5 | b [element] | -| 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:1108:10:1108:10 | a [element] | array_flow.rb:1108:10:1108:13 | ...[...] | -| array_flow.rb:1108:10:1108:10 | a [element] | array_flow.rb:1108:10:1108:13 | ...[...] | -| array_flow.rb:1109:10:1109:10 | a [element 1] | array_flow.rb:1109:10:1109:13 | ...[...] | | array_flow.rb:1109:10:1109:10 | a [element 1] | array_flow.rb:1109:10:1109:13 | ...[...] | | array_flow.rb:1109:10:1109:10 | a [element] | array_flow.rb:1109:10:1109:13 | ...[...] | -| array_flow.rb:1109:10:1109:10 | a [element] | array_flow.rb:1109:10:1109:13 | ...[...] | -| array_flow.rb:1110:10:1110:10 | a [element] | array_flow.rb:1110:10:1110:13 | ...[...] | | array_flow.rb:1110:10:1110:10 | a [element] | array_flow.rb:1110:10:1110:13 | ...[...] | | array_flow.rb:1111:10:1111:10 | a [element] | array_flow.rb:1111:10:1111:13 | ...[...] | -| array_flow.rb:1111:10:1111:10 | a [element] | array_flow.rb:1111:10:1111:13 | ...[...] | -| array_flow.rb:1112:10:1112:10 | b [element 0] | array_flow.rb:1112:10:1112:13 | ...[...] | | array_flow.rb:1112:10:1112:10 | b [element 0] | array_flow.rb:1112:10:1112:13 | ...[...] | | array_flow.rb:1112:10:1112:10 | b [element] | array_flow.rb:1112:10:1112:13 | ...[...] | -| array_flow.rb:1112:10:1112:10 | b [element] | array_flow.rb:1112:10:1112:13 | ...[...] | -| array_flow.rb:1113:10:1113:10 | b [element 1] | array_flow.rb:1113:10:1113:13 | ...[...] | | array_flow.rb:1113:10:1113:10 | b [element 1] | array_flow.rb:1113:10:1113:13 | ...[...] | | array_flow.rb:1113:10:1113:10 | b [element] | array_flow.rb:1113:10:1113:13 | ...[...] | -| array_flow.rb:1113:10:1113:10 | b [element] | array_flow.rb:1113:10:1113:13 | ...[...] | -| array_flow.rb:1114:10:1114:10 | b [element] | array_flow.rb:1114:10:1114:13 | ...[...] | | array_flow.rb:1114:10:1114:10 | b [element] | array_flow.rb:1114:10:1114:13 | ...[...] | | array_flow.rb:1115:10:1115:10 | b [element] | array_flow.rb:1115:10:1115:13 | ...[...] | -| array_flow.rb:1115:10:1115:10 | b [element] | array_flow.rb:1115:10:1115:13 | ...[...] | -| array_flow.rb:1117:5:1117:5 | a [element 0] | array_flow.rb:1118:9:1118:9 | a [element 0] | | array_flow.rb:1117:5:1117:5 | a [element 0] | array_flow.rb:1118:9:1118:9 | a [element 0] | | array_flow.rb:1117:5:1117:5 | a [element 2] | array_flow.rb:1118:9:1118:9 | a [element 2] | -| array_flow.rb:1117:5:1117:5 | a [element 2] | array_flow.rb:1118:9:1118:9 | a [element 2] | -| array_flow.rb:1117:5:1117:5 | a [element 3] | array_flow.rb:1118:9:1118:9 | a [element 3] | | array_flow.rb:1117:5:1117:5 | a [element 3] | array_flow.rb:1118:9:1118:9 | a [element 3] | | array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:5:1117:5 | a [element 0] | -| array_flow.rb:1117:10:1117:22 | call to source | array_flow.rb:1117:5:1117:5 | a [element 0] | -| array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:5:1117:5 | a [element 2] | | array_flow.rb:1117:28:1117:40 | call to source | array_flow.rb:1117:5:1117:5 | a [element 2] | | array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:5:1117:5 | a [element 3] | -| array_flow.rb:1117:43:1117:55 | call to source | array_flow.rb:1117:5:1117:5 | a [element 3] | -| array_flow.rb:1118:5:1118:5 | b [element 0] | array_flow.rb:1123:10:1123:10 | b [element 0] | | array_flow.rb:1118:5:1118:5 | b [element 0] | array_flow.rb:1123:10:1123:10 | b [element 0] | | array_flow.rb:1118:5:1118:5 | b [element 2] | array_flow.rb:1125:10:1125:10 | b [element 2] | -| array_flow.rb:1118:5:1118:5 | b [element 2] | array_flow.rb:1125:10:1125:10 | b [element 2] | -| array_flow.rb:1118:5:1118:5 | b [element 3] | array_flow.rb:1126:10:1126:10 | b [element 3] | | array_flow.rb:1118:5:1118:5 | b [element 3] | array_flow.rb:1126:10:1126:10 | b [element 3] | | array_flow.rb:1118:9:1118:9 | [post] a [element 0] | array_flow.rb:1119:10:1119:10 | a [element 0] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 0] | array_flow.rb:1119:10:1119:10 | a [element 0] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 2] | array_flow.rb:1121:10:1121:10 | a [element 2] | | array_flow.rb:1118:9:1118:9 | [post] a [element 2] | array_flow.rb:1121:10:1121:10 | a [element 2] | | array_flow.rb:1118:9:1118:9 | [post] a [element 3] | array_flow.rb:1122:10:1122:10 | a [element 3] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 3] | array_flow.rb:1122:10:1122:10 | a [element 3] | -| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:9 | [post] a [element 0] | | array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:9 | [post] a [element 0] | | array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | -| array_flow.rb:1118:9:1118:9 | a [element 0] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | -| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:9 | [post] a [element 2] | | array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:9 | [post] a [element 2] | | array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | -| array_flow.rb:1118:9:1118:9 | a [element 2] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | -| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:9 | [post] a [element 3] | | array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:9 | [post] a [element 3] | | array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | -| array_flow.rb:1118:9:1118:9 | a [element 3] | array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | array_flow.rb:1118:5:1118:5 | b [element 0] | | array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | array_flow.rb:1118:5:1118:5 | b [element 0] | | array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | array_flow.rb:1118:5:1118:5 | b [element 2] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | array_flow.rb:1118:5:1118:5 | b [element 2] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | array_flow.rb:1118:5:1118:5 | b [element 3] | | array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | array_flow.rb:1118:5:1118:5 | b [element 3] | | array_flow.rb:1119:10:1119:10 | a [element 0] | array_flow.rb:1119:10:1119:13 | ...[...] | -| array_flow.rb:1119:10:1119:10 | a [element 0] | array_flow.rb:1119:10:1119:13 | ...[...] | -| array_flow.rb:1121:10:1121:10 | a [element 2] | array_flow.rb:1121:10:1121:13 | ...[...] | | array_flow.rb:1121:10:1121:10 | a [element 2] | array_flow.rb:1121:10:1121:13 | ...[...] | | array_flow.rb:1122:10:1122:10 | a [element 3] | array_flow.rb:1122:10:1122:13 | ...[...] | -| array_flow.rb:1122:10:1122:10 | a [element 3] | array_flow.rb:1122:10:1122:13 | ...[...] | -| array_flow.rb:1123:10:1123:10 | b [element 0] | array_flow.rb:1123:10:1123:13 | ...[...] | | array_flow.rb:1123:10:1123:10 | b [element 0] | array_flow.rb:1123:10:1123:13 | ...[...] | | array_flow.rb:1125:10:1125:10 | b [element 2] | array_flow.rb:1125:10:1125:13 | ...[...] | -| array_flow.rb:1125:10:1125:10 | b [element 2] | array_flow.rb:1125:10:1125:13 | ...[...] | -| array_flow.rb:1126:10:1126:10 | b [element 3] | array_flow.rb:1126:10:1126:13 | ...[...] | | array_flow.rb:1126:10:1126:10 | b [element 3] | array_flow.rb:1126:10:1126:13 | ...[...] | | array_flow.rb:1128:5:1128:5 | a [element 0] | array_flow.rb:1129:9:1129:9 | a [element 0] | -| array_flow.rb:1128:5:1128:5 | a [element 0] | array_flow.rb:1129:9:1129:9 | a [element 0] | -| array_flow.rb:1128:5:1128:5 | a [element 2] | array_flow.rb:1129:9:1129:9 | a [element 2] | | array_flow.rb:1128:5:1128:5 | a [element 2] | array_flow.rb:1129:9:1129:9 | a [element 2] | | array_flow.rb:1128:5:1128:5 | a [element 3] | array_flow.rb:1129:9:1129:9 | a [element 3] | -| array_flow.rb:1128:5:1128:5 | a [element 3] | array_flow.rb:1129:9:1129:9 | a [element 3] | -| array_flow.rb:1128:10:1128:22 | call to source | array_flow.rb:1128:5:1128:5 | a [element 0] | | array_flow.rb:1128:10:1128:22 | call to source | array_flow.rb:1128:5:1128:5 | a [element 0] | | array_flow.rb:1128:28:1128:40 | call to source | array_flow.rb:1128:5:1128:5 | a [element 2] | -| array_flow.rb:1128:28:1128:40 | call to source | array_flow.rb:1128:5:1128:5 | a [element 2] | -| array_flow.rb:1128:43:1128:55 | call to source | array_flow.rb:1128:5:1128:5 | a [element 3] | | array_flow.rb:1128:43:1128:55 | call to source | array_flow.rb:1128:5:1128:5 | a [element 3] | | array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1134:10:1134:10 | b [element] | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1134:10:1134:10 | b [element] | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1135:10:1135:10 | b [element] | | array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1135:10:1135:10 | b [element] | | array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1136:10:1136:10 | b [element] | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1136:10:1136:10 | b [element] | -| array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1137:10:1137:10 | b [element] | | array_flow.rb:1129:5:1129:5 | b [element] | array_flow.rb:1137:10:1137:10 | b [element] | | array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1130:10:1130:10 | a [element] | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1130:10:1130:10 | a [element] | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1131:10:1131:10 | a [element] | | array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1131:10:1131:10 | a [element] | | array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1132:10:1132:10 | a [element] | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1132:10:1132:10 | a [element] | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1133:10:1133:10 | a [element] | | array_flow.rb:1129:9:1129:9 | [post] a [element] | array_flow.rb:1133:10:1133:10 | a [element] | | array_flow.rb:1129:9:1129:9 | a [element 0] | array_flow.rb:1129:9:1129:9 | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 0] | array_flow.rb:1129:9:1129:9 | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 0] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | | array_flow.rb:1129:9:1129:9 | a [element 0] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | | array_flow.rb:1129:9:1129:9 | a [element 2] | array_flow.rb:1129:9:1129:9 | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 2] | array_flow.rb:1129:9:1129:9 | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 2] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | | array_flow.rb:1129:9:1129:9 | a [element 2] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | | array_flow.rb:1129:9:1129:9 | a [element 3] | array_flow.rb:1129:9:1129:9 | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 3] | array_flow.rb:1129:9:1129:9 | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 3] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | | array_flow.rb:1129:9:1129:9 | a [element 3] | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | array_flow.rb:1129:5:1129:5 | b [element] | -| array_flow.rb:1129:9:1129:20 | call to rotate! [element] | array_flow.rb:1129:5:1129:5 | b [element] | -| array_flow.rb:1130:10:1130:10 | a [element] | array_flow.rb:1130:10:1130:13 | ...[...] | | array_flow.rb:1130:10:1130:10 | a [element] | array_flow.rb:1130:10:1130:13 | ...[...] | | array_flow.rb:1131:10:1131:10 | a [element] | array_flow.rb:1131:10:1131:13 | ...[...] | -| array_flow.rb:1131:10:1131:10 | a [element] | array_flow.rb:1131:10:1131:13 | ...[...] | -| array_flow.rb:1132:10:1132:10 | a [element] | array_flow.rb:1132:10:1132:13 | ...[...] | | array_flow.rb:1132:10:1132:10 | a [element] | array_flow.rb:1132:10:1132:13 | ...[...] | | array_flow.rb:1133:10:1133:10 | a [element] | array_flow.rb:1133:10:1133:13 | ...[...] | -| array_flow.rb:1133:10:1133:10 | a [element] | array_flow.rb:1133:10:1133:13 | ...[...] | -| 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:1135:10:1135:10 | b [element] | array_flow.rb:1135:10:1135:13 | ...[...] | -| array_flow.rb:1135:10:1135:10 | b [element] | array_flow.rb:1135:10:1135:13 | ...[...] | -| array_flow.rb:1136:10:1136:10 | b [element] | array_flow.rb:1136:10:1136:13 | ...[...] | | array_flow.rb:1136:10:1136:10 | b [element] | array_flow.rb:1136:10:1136:13 | ...[...] | | array_flow.rb:1137:10:1137:10 | b [element] | array_flow.rb:1137:10:1137:13 | ...[...] | -| array_flow.rb:1137:10:1137:10 | b [element] | array_flow.rb:1137:10:1137:13 | ...[...] | -| array_flow.rb:1141:5:1141:5 | a [element 3] | array_flow.rb:1142:9:1142:9 | a [element 3] | | array_flow.rb:1141:5:1141:5 | a [element 3] | array_flow.rb:1142:9:1142:9 | a [element 3] | | array_flow.rb:1141:19:1141:29 | call to source | array_flow.rb:1141:5:1141:5 | a [element 3] | -| array_flow.rb:1141:19:1141:29 | call to source | array_flow.rb:1141:5:1141:5 | a [element 3] | -| array_flow.rb:1142:5:1142:5 | b [element] | array_flow.rb:1145:10:1145:10 | b [element] | | array_flow.rb:1142:5:1142:5 | b [element] | array_flow.rb:1145:10:1145:10 | b [element] | | array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:9:1144:7 | call to select [element] | -| array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:9:1144:7 | call to select [element] | -| array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:22:1142:22 | x | | array_flow.rb:1142:9:1142:9 | a [element 3] | array_flow.rb:1142:22:1142:22 | x | | array_flow.rb:1142:9:1144:7 | call to select [element] | array_flow.rb:1142:5:1142:5 | b [element] | -| array_flow.rb:1142:9:1144:7 | call to select [element] | array_flow.rb:1142:5:1142:5 | b [element] | -| array_flow.rb:1142:22:1142:22 | x | array_flow.rb:1143:14:1143:14 | x | | array_flow.rb:1142:22:1142:22 | x | array_flow.rb:1143:14:1143:14 | x | | array_flow.rb:1145:10:1145:10 | b [element] | array_flow.rb:1145:10:1145:13 | ...[...] | -| array_flow.rb:1145:10:1145:10 | b [element] | array_flow.rb:1145:10:1145:13 | ...[...] | -| array_flow.rb:1149:5:1149:5 | a [element 2] | array_flow.rb:1150:9:1150:9 | a [element 2] | | array_flow.rb:1149:5:1149:5 | a [element 2] | array_flow.rb:1150:9:1150:9 | a [element 2] | | array_flow.rb:1149:16:1149:26 | call to source | array_flow.rb:1149:5:1149:5 | a [element 2] | -| array_flow.rb:1149:16:1149:26 | call to source | array_flow.rb:1149:5:1149:5 | a [element 2] | -| array_flow.rb:1150:5:1150:5 | b [element] | array_flow.rb:1155:10:1155:10 | b [element] | | array_flow.rb:1150:5:1150:5 | b [element] | array_flow.rb:1155:10:1155:10 | b [element] | | array_flow.rb:1150:9:1150:9 | [post] a [element] | array_flow.rb:1154:10:1154:10 | a [element] | -| array_flow.rb:1150:9:1150:9 | [post] a [element] | array_flow.rb:1154:10:1154:10 | a [element] | -| array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:9:1150:9 | [post] a [element] | | array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:9:1150:9 | [post] a [element] | | array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:9:1153:7 | call to select! [element] | -| array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:9:1153:7 | call to select! [element] | -| array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:23:1150:23 | x | | array_flow.rb:1150:9:1150:9 | a [element 2] | array_flow.rb:1150:23:1150:23 | x | | array_flow.rb:1150:9:1153:7 | call to select! [element] | array_flow.rb:1150:5:1150:5 | b [element] | -| array_flow.rb:1150:9:1153:7 | call to select! [element] | array_flow.rb:1150:5:1150:5 | b [element] | -| array_flow.rb:1150:23:1150:23 | x | array_flow.rb:1151:14:1151:14 | x | | array_flow.rb:1150:23:1150:23 | x | array_flow.rb:1151:14:1151:14 | x | | array_flow.rb:1154:10:1154:10 | a [element] | array_flow.rb:1154:10:1154:13 | ...[...] | -| array_flow.rb:1154:10:1154:10 | a [element] | array_flow.rb:1154:10:1154:13 | ...[...] | -| array_flow.rb:1155:10:1155:10 | b [element] | array_flow.rb:1155:10:1155:13 | ...[...] | | array_flow.rb:1155:10:1155:10 | b [element] | array_flow.rb:1155:10:1155:13 | ...[...] | | array_flow.rb:1159:5:1159:5 | a [element 0] | array_flow.rb:1160:9:1160:9 | a [element 0] | -| array_flow.rb:1159:5:1159:5 | a [element 0] | array_flow.rb:1160:9:1160:9 | a [element 0] | -| array_flow.rb:1159:5:1159:5 | a [element 2] | array_flow.rb:1160:9:1160:9 | a [element 2] | | array_flow.rb:1159:5:1159:5 | a [element 2] | array_flow.rb:1160:9:1160:9 | a [element 2] | | array_flow.rb:1159:10:1159:22 | call to source | array_flow.rb:1159:5:1159:5 | a [element 0] | -| array_flow.rb:1159:10:1159:22 | call to source | array_flow.rb:1159:5:1159:5 | a [element 0] | -| array_flow.rb:1159:28:1159:40 | call to source | array_flow.rb:1159:5:1159:5 | a [element 2] | | array_flow.rb:1159:28:1159:40 | call to source | array_flow.rb:1159:5:1159:5 | a [element 2] | | array_flow.rb:1160:5:1160:5 | b | array_flow.rb:1161:10:1161:10 | b | -| array_flow.rb:1160:5:1160:5 | b | array_flow.rb:1161:10:1161:10 | b | -| array_flow.rb:1160:9:1160:9 | [post] a [element 1] | array_flow.rb:1163:10:1163:10 | a [element 1] | | array_flow.rb:1160:9:1160:9 | [post] a [element 1] | array_flow.rb:1163:10:1163:10 | a [element 1] | | array_flow.rb:1160:9:1160:9 | a [element 0] | array_flow.rb:1160:9:1160:15 | call to shift | -| array_flow.rb:1160:9:1160:9 | a [element 0] | array_flow.rb:1160:9:1160:15 | call to shift | -| array_flow.rb:1160:9:1160:9 | a [element 2] | array_flow.rb:1160:9:1160:9 | [post] a [element 1] | | array_flow.rb:1160:9:1160:9 | a [element 2] | array_flow.rb:1160:9:1160:9 | [post] a [element 1] | | array_flow.rb:1160:9:1160:15 | call to shift | array_flow.rb:1160:5:1160:5 | b | -| array_flow.rb:1160:9:1160:15 | call to shift | array_flow.rb:1160:5:1160:5 | b | -| array_flow.rb:1163:10:1163:10 | a [element 1] | array_flow.rb:1163:10:1163:13 | ...[...] | | array_flow.rb:1163:10:1163:10 | a [element 1] | array_flow.rb:1163:10:1163:13 | ...[...] | | array_flow.rb:1166:5:1166:5 | a [element 0] | array_flow.rb:1167:9:1167:9 | a [element 0] | -| array_flow.rb:1166:5:1166:5 | a [element 0] | array_flow.rb:1167:9:1167:9 | a [element 0] | -| array_flow.rb:1166:5:1166:5 | a [element 2] | array_flow.rb:1167:9:1167:9 | a [element 2] | | array_flow.rb:1166:5:1166:5 | a [element 2] | array_flow.rb:1167:9:1167:9 | a [element 2] | | array_flow.rb:1166:10:1166:22 | call to source | array_flow.rb:1166:5:1166:5 | a [element 0] | -| array_flow.rb:1166:10:1166:22 | call to source | array_flow.rb:1166:5:1166:5 | a [element 0] | -| array_flow.rb:1166:28:1166:40 | call to source | array_flow.rb:1166:5:1166:5 | a [element 2] | | array_flow.rb:1166:28:1166:40 | call to source | array_flow.rb:1166:5:1166:5 | a [element 2] | | array_flow.rb:1167:5:1167:5 | b [element 0] | array_flow.rb:1168:10:1168:10 | b [element 0] | -| array_flow.rb:1167:5:1167:5 | b [element 0] | array_flow.rb:1168:10:1168:10 | b [element 0] | -| array_flow.rb:1167:9:1167:9 | [post] a [element 0] | array_flow.rb:1170:10:1170:10 | a [element 0] | | array_flow.rb:1167:9:1167:9 | [post] a [element 0] | array_flow.rb:1170:10:1170:10 | a [element 0] | | array_flow.rb:1167:9:1167:9 | a [element 0] | array_flow.rb:1167:9:1167:18 | call to shift [element 0] | -| array_flow.rb:1167:9:1167:9 | a [element 0] | array_flow.rb:1167:9:1167:18 | call to shift [element 0] | -| array_flow.rb:1167:9:1167:9 | a [element 2] | array_flow.rb:1167:9:1167:9 | [post] a [element 0] | | array_flow.rb:1167:9:1167:9 | a [element 2] | array_flow.rb:1167:9:1167:9 | [post] a [element 0] | | array_flow.rb:1167:9:1167:18 | call to shift [element 0] | array_flow.rb:1167:5:1167:5 | b [element 0] | -| array_flow.rb:1167:9:1167:18 | call to shift [element 0] | array_flow.rb:1167:5:1167:5 | b [element 0] | -| array_flow.rb:1168:10:1168:10 | b [element 0] | array_flow.rb:1168:10:1168:13 | ...[...] | | array_flow.rb:1168:10:1168:10 | b [element 0] | array_flow.rb:1168:10:1168:13 | ...[...] | | array_flow.rb:1170:10:1170:10 | a [element 0] | array_flow.rb:1170:10:1170:13 | ...[...] | -| array_flow.rb:1170:10:1170:10 | a [element 0] | array_flow.rb:1170:10:1170:13 | ...[...] | -| array_flow.rb:1174:5:1174:5 | a [element 0] | array_flow.rb:1175:9:1175:9 | a [element 0] | | array_flow.rb:1174:5:1174:5 | a [element 0] | array_flow.rb:1175:9:1175:9 | a [element 0] | | array_flow.rb:1174:5:1174:5 | a [element 0] | array_flow.rb:1178:10:1178:10 | a [element 0] | -| array_flow.rb:1174:5:1174:5 | a [element 0] | array_flow.rb:1178:10:1178:10 | a [element 0] | -| array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1175:9:1175:9 | a [element 2] | | array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1175:9:1175:9 | a [element 2] | | array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1180:10:1180:10 | a [element 2] | -| array_flow.rb:1174:5:1174:5 | a [element 2] | array_flow.rb:1180:10:1180:10 | a [element 2] | -| array_flow.rb:1174:10:1174:22 | call to source | array_flow.rb:1174:5:1174:5 | a [element 0] | | array_flow.rb:1174:10:1174:22 | call to source | array_flow.rb:1174:5:1174:5 | a [element 0] | | array_flow.rb:1174:28:1174:40 | call to source | array_flow.rb:1174:5:1174:5 | a [element 2] | -| array_flow.rb:1174:28:1174:40 | call to source | array_flow.rb:1174:5:1174:5 | a [element 2] | -| array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1176:10:1176:10 | b [element] | | array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1176:10:1176:10 | b [element] | | array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1177:10:1177:10 | b [element] | -| array_flow.rb:1175:5:1175:5 | b [element] | array_flow.rb:1177:10:1177:10 | b [element] | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1178:10:1178:10 | a [element] | | array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1178:10:1178:10 | a [element] | | array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1179:10:1179:10 | a [element] | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1179:10:1179:10 | a [element] | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1180:10:1180:10 | a [element] | | array_flow.rb:1175:9:1175:9 | [post] a [element] | array_flow.rb:1180:10:1180:10 | a [element] | | array_flow.rb:1175:9:1175:9 | a [element 0] | array_flow.rb:1175:9:1175:9 | [post] a [element] | -| array_flow.rb:1175:9:1175:9 | a [element 0] | array_flow.rb:1175:9:1175:9 | [post] a [element] | -| array_flow.rb:1175:9:1175:9 | a [element 0] | array_flow.rb:1175:9:1175:18 | call to shift [element] | | array_flow.rb:1175:9:1175:9 | a [element 0] | array_flow.rb:1175:9:1175:18 | call to shift [element] | | array_flow.rb:1175:9:1175:9 | a [element 2] | array_flow.rb:1175:9:1175:9 | [post] a [element] | -| array_flow.rb:1175:9:1175:9 | a [element 2] | array_flow.rb:1175:9:1175:9 | [post] a [element] | -| array_flow.rb:1175:9:1175:9 | a [element 2] | array_flow.rb:1175:9:1175:18 | call to shift [element] | | array_flow.rb:1175:9:1175:9 | a [element 2] | array_flow.rb:1175:9:1175:18 | call to shift [element] | | array_flow.rb:1175:9:1175:18 | call to shift [element] | array_flow.rb:1175:5:1175:5 | b [element] | -| array_flow.rb:1175:9:1175:18 | call to shift [element] | array_flow.rb:1175:5:1175:5 | b [element] | -| array_flow.rb:1176:10:1176:10 | b [element] | array_flow.rb:1176:10:1176:13 | ...[...] | | array_flow.rb:1176:10:1176:10 | b [element] | array_flow.rb:1176:10:1176:13 | ...[...] | | array_flow.rb:1177:10:1177:10 | b [element] | array_flow.rb:1177:10:1177:13 | ...[...] | -| array_flow.rb:1177:10:1177:10 | b [element] | array_flow.rb:1177:10:1177:13 | ...[...] | -| array_flow.rb:1178:10:1178:10 | a [element 0] | array_flow.rb:1178:10:1178:13 | ...[...] | | array_flow.rb:1178:10:1178:10 | a [element 0] | array_flow.rb:1178:10:1178:13 | ...[...] | | array_flow.rb:1178:10:1178:10 | a [element] | array_flow.rb:1178:10:1178:13 | ...[...] | -| array_flow.rb:1178:10:1178:10 | a [element] | array_flow.rb:1178:10:1178:13 | ...[...] | -| array_flow.rb:1179:10:1179:10 | a [element] | array_flow.rb:1179:10:1179:13 | ...[...] | | array_flow.rb:1179:10:1179:10 | a [element] | array_flow.rb:1179:10:1179:13 | ...[...] | | array_flow.rb:1180:10:1180:10 | a [element 2] | array_flow.rb:1180:10:1180:13 | ...[...] | -| array_flow.rb:1180:10:1180:10 | a [element 2] | array_flow.rb:1180:10:1180:13 | ...[...] | -| array_flow.rb:1180:10:1180:10 | a [element] | array_flow.rb:1180:10:1180:13 | ...[...] | | array_flow.rb:1180:10:1180:10 | a [element] | array_flow.rb:1180:10:1180:13 | ...[...] | | array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1185:9:1185:9 | a [element 2] | -| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1185:9:1185:9 | a [element 2] | -| array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1188:10:1188:10 | a [element 2] | | array_flow.rb:1184:5:1184:5 | a [element 2] | array_flow.rb:1188:10:1188:10 | a [element 2] | | array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:5:1184:5 | a [element 2] | -| array_flow.rb:1184:16:1184:26 | call to source | array_flow.rb:1184:5:1184:5 | a [element 2] | -| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1189:10:1189:10 | b [element] | | array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1189:10:1189:10 | b [element] | | array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1190:10:1190:10 | b [element] | -| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1190:10:1190:10 | b [element] | -| array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1191:10:1191:10 | b [element] | | array_flow.rb:1185:5:1185:5 | b [element] | array_flow.rb:1191:10:1191:10 | b [element] | | array_flow.rb:1185:9:1185:9 | a [element 2] | array_flow.rb:1185:9:1185:17 | call to shuffle [element] | -| array_flow.rb:1185:9:1185:9 | a [element 2] | array_flow.rb:1185:9:1185:17 | call to shuffle [element] | -| array_flow.rb:1185:9:1185:17 | call to shuffle [element] | array_flow.rb:1185:5:1185:5 | b [element] | | array_flow.rb:1185:9:1185:17 | call to shuffle [element] | array_flow.rb:1185:5:1185:5 | b [element] | | array_flow.rb:1188:10:1188:10 | a [element 2] | array_flow.rb:1188:10:1188:13 | ...[...] | -| array_flow.rb:1188:10:1188:10 | a [element 2] | array_flow.rb:1188:10:1188:13 | ...[...] | -| array_flow.rb:1189:10:1189:10 | b [element] | array_flow.rb:1189:10:1189:13 | ...[...] | | array_flow.rb:1189:10:1189:10 | b [element] | array_flow.rb:1189:10:1189:13 | ...[...] | | array_flow.rb:1190:10:1190:10 | b [element] | array_flow.rb:1190:10:1190:13 | ...[...] | -| array_flow.rb:1190:10:1190:10 | b [element] | array_flow.rb:1190:10:1190:13 | ...[...] | -| array_flow.rb:1191:10:1191:10 | b [element] | array_flow.rb:1191:10:1191:13 | ...[...] | | array_flow.rb:1191:10:1191:10 | b [element] | array_flow.rb:1191:10:1191:13 | ...[...] | | array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1196:9:1196:9 | a [element 2] | -| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1196:9:1196:9 | a [element 2] | -| array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1199:10:1199:10 | a [element 2] | | array_flow.rb:1195:5:1195:5 | a [element 2] | array_flow.rb:1199:10:1199:10 | a [element 2] | | array_flow.rb:1195:16:1195:26 | call to source | array_flow.rb:1195:5:1195:5 | a [element 2] | -| array_flow.rb:1195:16:1195:26 | call to source | array_flow.rb:1195:5:1195:5 | a [element 2] | -| array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1200:10:1200:10 | b [element] | | array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1200:10:1200:10 | b [element] | | array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1201:10:1201:10 | b [element] | -| array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1201:10:1201:10 | b [element] | -| array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1202:10:1202:10 | b [element] | | array_flow.rb:1196:5:1196:5 | b [element] | array_flow.rb:1202:10:1202:10 | b [element] | | array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1197:10:1197:10 | a [element] | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1197:10:1197:10 | a [element] | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1198:10:1198:10 | a [element] | | array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1198:10:1198:10 | a [element] | | array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1199:10:1199:10 | a [element] | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | array_flow.rb:1199:10:1199:10 | a [element] | -| array_flow.rb:1196:9:1196:9 | a [element 2] | array_flow.rb:1196:9:1196:9 | [post] a [element] | | array_flow.rb:1196:9:1196:9 | a [element 2] | array_flow.rb:1196:9:1196:9 | [post] a [element] | | array_flow.rb:1196:9:1196:9 | a [element 2] | array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | -| array_flow.rb:1196:9:1196:9 | a [element 2] | array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | -| array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | array_flow.rb:1196:5:1196:5 | b [element] | | array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | array_flow.rb:1196:5:1196:5 | b [element] | | array_flow.rb:1197:10:1197:10 | a [element] | array_flow.rb:1197:10:1197:13 | ...[...] | -| array_flow.rb:1197:10:1197:10 | a [element] | array_flow.rb:1197:10:1197:13 | ...[...] | -| array_flow.rb:1198:10:1198:10 | a [element] | array_flow.rb:1198:10:1198:13 | ...[...] | | array_flow.rb:1198:10:1198:10 | a [element] | array_flow.rb:1198:10:1198:13 | ...[...] | | array_flow.rb:1199:10:1199:10 | a [element 2] | array_flow.rb:1199:10:1199:13 | ...[...] | -| array_flow.rb:1199:10:1199:10 | a [element 2] | array_flow.rb:1199:10:1199:13 | ...[...] | -| array_flow.rb:1199:10:1199:10 | a [element] | array_flow.rb:1199:10:1199:13 | ...[...] | | array_flow.rb:1199:10:1199:10 | a [element] | array_flow.rb:1199:10:1199:13 | ...[...] | | array_flow.rb:1200:10:1200:10 | b [element] | array_flow.rb:1200:10:1200:13 | ...[...] | -| array_flow.rb:1200:10:1200:10 | b [element] | array_flow.rb:1200:10:1200:13 | ...[...] | -| array_flow.rb:1201:10:1201:10 | b [element] | array_flow.rb:1201:10:1201:13 | ...[...] | | array_flow.rb:1201:10:1201:10 | b [element] | array_flow.rb:1201:10:1201:13 | ...[...] | | array_flow.rb:1202:10:1202:10 | b [element] | array_flow.rb:1202:10:1202:13 | ...[...] | -| array_flow.rb:1202:10:1202:10 | b [element] | array_flow.rb:1202:10:1202:13 | ...[...] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1211:9:1211:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1211:9:1211:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1214:9:1214:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1214:9:1214:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1220:9:1220:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1220:9:1220:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1225:9:1225:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1225:9:1225:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1229:9:1229:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1229:9:1229:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1234:9:1234:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1234:9:1234:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1239:9:1239:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1239:9:1239:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1243:9:1243:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1243:9:1243:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1247:9:1247:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1247:9:1247:9 | a [element 2] | | array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1252:9:1252:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | array_flow.rb:1252:9:1252:9 | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1208:9:1208:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1208:9:1208:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1211:9:1211:9 | a [element 4] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1211:9:1211:9 | a [element 4] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1214:9:1214:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1214:9:1214:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1220:9:1220:9 | a [element 4] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1220:9:1220:9 | a [element 4] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1225:9:1225:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1225:9:1225:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1239:9:1239:9 | a [element 4] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1239:9:1239:9 | a [element 4] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1243:9:1243:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1243:9:1243:9 | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1252:9:1252:9 | a [element 4] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | array_flow.rb:1252:9:1252:9 | a [element 4] | -| array_flow.rb:1206:16:1206:28 | call to source | array_flow.rb:1206:5:1206:5 | a [element 2] | | array_flow.rb:1206:16:1206:28 | call to source | array_flow.rb:1206:5:1206:5 | a [element 2] | | array_flow.rb:1206:34:1206:46 | call to source | array_flow.rb:1206:5:1206:5 | a [element 4] | -| array_flow.rb:1206:34:1206:46 | call to source | array_flow.rb:1206:5:1206:5 | a [element 4] | -| array_flow.rb:1208:5:1208:5 | b | array_flow.rb:1209:10:1209:10 | b | | array_flow.rb:1208:5:1208:5 | b | array_flow.rb:1209:10:1209:10 | b | | array_flow.rb:1208:9:1208:9 | a [element 4] | array_flow.rb:1208:9:1208:17 | call to slice | -| array_flow.rb:1208:9:1208:9 | a [element 4] | array_flow.rb:1208:9:1208:17 | call to slice | -| array_flow.rb:1208:9:1208:17 | call to slice | array_flow.rb:1208:5:1208:5 | b | | array_flow.rb:1208:9:1208:17 | call to slice | array_flow.rb:1208:5:1208:5 | b | | array_flow.rb:1211:5:1211:5 | b | array_flow.rb:1212:10:1212:10 | b | -| array_flow.rb:1211:5:1211:5 | b | array_flow.rb:1212:10:1212:10 | b | -| array_flow.rb:1211:9:1211:9 | a [element 2] | array_flow.rb:1211:9:1211:19 | call to slice | | array_flow.rb:1211:9:1211:9 | a [element 2] | array_flow.rb:1211:9:1211:19 | call to slice | | array_flow.rb:1211:9:1211:9 | a [element 4] | array_flow.rb:1211:9:1211:19 | call to slice | -| array_flow.rb:1211:9:1211:9 | a [element 4] | array_flow.rb:1211:9:1211:19 | call to slice | -| array_flow.rb:1211:9:1211:19 | call to slice | array_flow.rb:1211:5:1211:5 | b | | array_flow.rb:1211:9:1211:19 | call to slice | array_flow.rb:1211:5:1211:5 | b | | array_flow.rb:1214:5:1214:5 | b | array_flow.rb:1216:10:1216:10 | b | -| array_flow.rb:1214:5:1214:5 | b | array_flow.rb:1216:10:1216:10 | b | -| array_flow.rb:1214:5:1214:5 | b | array_flow.rb:1218:10:1218:10 | b | -| array_flow.rb:1214:5:1214:5 | b [element] | array_flow.rb:1218:10:1218:10 | b [element] | | array_flow.rb:1214:5:1214:5 | b [element] | array_flow.rb:1218:10:1218:10 | b [element] | | array_flow.rb:1214:9:1214:9 | a [element 2] | array_flow.rb:1214:9:1214:17 | call to slice | -| array_flow.rb:1214:9:1214:9 | a [element 2] | array_flow.rb:1214:9:1214:17 | call to slice | -| array_flow.rb:1214:9:1214:9 | a [element 2] | array_flow.rb:1214:9:1214:17 | call to slice [element] | | array_flow.rb:1214:9:1214:9 | a [element 2] | array_flow.rb:1214:9:1214:17 | call to slice [element] | | array_flow.rb:1214:9:1214:9 | a [element 4] | array_flow.rb:1214:9:1214:17 | call to slice | -| array_flow.rb:1214:9:1214:9 | a [element 4] | array_flow.rb:1214:9:1214:17 | call to slice | -| array_flow.rb:1214:9:1214:9 | a [element 4] | array_flow.rb:1214:9:1214:17 | call to slice [element] | | array_flow.rb:1214:9:1214:9 | a [element 4] | array_flow.rb:1214:9:1214:17 | call to slice [element] | | array_flow.rb:1214:9:1214:17 | call to slice | array_flow.rb:1214:5:1214:5 | b | -| array_flow.rb:1214:9:1214:17 | call to slice | array_flow.rb:1214:5:1214:5 | b | -| array_flow.rb:1214:9:1214:17 | call to slice [element] | array_flow.rb:1214:5:1214:5 | b [element] | | array_flow.rb:1214:9:1214:17 | call to slice [element] | array_flow.rb:1214:5:1214:5 | b [element] | -| array_flow.rb:1218:10:1218:10 | b | array_flow.rb:1218:10:1218:13 | ...[...] | | array_flow.rb:1218:10:1218:10 | b [element] | array_flow.rb:1218:10:1218:13 | ...[...] | -| array_flow.rb:1218:10:1218:10 | b [element] | array_flow.rb:1218:10:1218:13 | ...[...] | -| array_flow.rb:1220:5:1220:5 | b [element 0] | array_flow.rb:1221:10:1221:10 | b [element 0] | | array_flow.rb:1220:5:1220:5 | b [element 0] | array_flow.rb:1221:10:1221:10 | b [element 0] | | array_flow.rb:1220:5:1220:5 | b [element 2] | array_flow.rb:1223:10:1223:10 | b [element 2] | -| array_flow.rb:1220:5:1220:5 | b [element 2] | array_flow.rb:1223:10:1223:10 | b [element 2] | -| array_flow.rb:1220:9:1220:9 | a [element 2] | array_flow.rb:1220:9:1220:21 | call to slice [element 0] | | array_flow.rb:1220:9:1220:9 | a [element 2] | array_flow.rb:1220:9:1220:21 | call to slice [element 0] | | array_flow.rb:1220:9:1220:9 | a [element 4] | array_flow.rb:1220:9:1220:21 | call to slice [element 2] | -| array_flow.rb:1220:9:1220:9 | a [element 4] | array_flow.rb:1220:9:1220:21 | call to slice [element 2] | -| array_flow.rb:1220:9:1220:21 | call to slice [element 0] | array_flow.rb:1220:5:1220:5 | b [element 0] | | array_flow.rb:1220:9:1220:21 | call to slice [element 0] | array_flow.rb:1220:5:1220:5 | b [element 0] | | array_flow.rb:1220:9:1220:21 | call to slice [element 2] | array_flow.rb:1220:5:1220:5 | b [element 2] | -| array_flow.rb:1220:9:1220:21 | call to slice [element 2] | array_flow.rb:1220:5:1220:5 | b [element 2] | -| array_flow.rb:1221:10:1221:10 | b [element 0] | array_flow.rb:1221:10:1221:13 | ...[...] | | array_flow.rb:1221:10:1221:10 | b [element 0] | array_flow.rb:1221:10:1221:13 | ...[...] | | array_flow.rb:1223:10:1223:10 | b [element 2] | array_flow.rb:1223:10:1223:13 | ...[...] | -| array_flow.rb:1223:10:1223:10 | b [element 2] | array_flow.rb:1223:10:1223:13 | ...[...] | -| array_flow.rb:1225:5:1225:5 | b [element] | array_flow.rb:1226:10:1226:10 | b [element] | | array_flow.rb:1225:5:1225:5 | b [element] | array_flow.rb:1226:10:1226:10 | b [element] | | array_flow.rb:1225:5:1225:5 | b [element] | array_flow.rb:1227:10:1227:10 | b [element] | -| array_flow.rb:1225:5:1225:5 | b [element] | array_flow.rb:1227:10:1227:10 | b [element] | -| array_flow.rb:1225:9:1225:9 | a [element 2] | array_flow.rb:1225:9:1225:21 | call to slice [element] | | array_flow.rb:1225:9:1225:9 | a [element 2] | array_flow.rb:1225:9:1225:21 | call to slice [element] | | array_flow.rb:1225:9:1225:9 | a [element 4] | array_flow.rb:1225:9:1225:21 | call to slice [element] | -| array_flow.rb:1225:9:1225:9 | a [element 4] | array_flow.rb:1225:9:1225:21 | call to slice [element] | -| array_flow.rb:1225:9:1225:21 | call to slice [element] | array_flow.rb:1225:5:1225:5 | b [element] | | array_flow.rb:1225:9:1225:21 | call to slice [element] | array_flow.rb:1225:5:1225:5 | b [element] | | array_flow.rb:1226:10:1226:10 | b [element] | array_flow.rb:1226:10:1226:13 | ...[...] | -| array_flow.rb:1226:10:1226:10 | b [element] | array_flow.rb:1226:10:1226:13 | ...[...] | -| array_flow.rb:1227:10:1227:10 | b [element] | array_flow.rb:1227:10:1227:13 | ...[...] | | array_flow.rb:1227:10:1227:10 | b [element] | array_flow.rb:1227:10:1227:13 | ...[...] | | array_flow.rb:1229:5:1229:5 | b [element 0] | array_flow.rb:1230:10:1230:10 | b [element 0] | -| array_flow.rb:1229:5:1229:5 | b [element 0] | array_flow.rb:1230:10:1230:10 | b [element 0] | -| array_flow.rb:1229:9:1229:9 | a [element 2] | array_flow.rb:1229:9:1229:21 | call to slice [element 0] | | array_flow.rb:1229:9:1229:9 | a [element 2] | array_flow.rb:1229:9:1229:21 | call to slice [element 0] | | array_flow.rb:1229:9:1229:21 | call to slice [element 0] | array_flow.rb:1229:5:1229:5 | b [element 0] | -| array_flow.rb:1229:9:1229:21 | call to slice [element 0] | array_flow.rb:1229:5:1229:5 | b [element 0] | -| array_flow.rb:1230:10:1230:10 | b [element 0] | array_flow.rb:1230:10:1230:13 | ...[...] | | array_flow.rb:1230:10:1230:10 | b [element 0] | array_flow.rb:1230:10:1230:13 | ...[...] | | array_flow.rb:1234:5:1234:5 | b [element 0] | array_flow.rb:1235:10:1235:10 | b [element 0] | -| array_flow.rb:1234:5:1234:5 | b [element 0] | array_flow.rb:1235:10:1235:10 | b [element 0] | -| array_flow.rb:1234:9:1234:9 | a [element 2] | array_flow.rb:1234:9:1234:22 | call to slice [element 0] | | array_flow.rb:1234:9:1234:9 | a [element 2] | array_flow.rb:1234:9:1234:22 | call to slice [element 0] | | array_flow.rb:1234:9:1234:22 | call to slice [element 0] | array_flow.rb:1234:5:1234:5 | b [element 0] | -| array_flow.rb:1234:9:1234:22 | call to slice [element 0] | array_flow.rb:1234:5:1234:5 | b [element 0] | -| array_flow.rb:1235:10:1235:10 | b [element 0] | array_flow.rb:1235:10:1235:13 | ...[...] | | array_flow.rb:1235:10:1235:10 | b [element 0] | array_flow.rb:1235:10:1235:13 | ...[...] | | array_flow.rb:1239:5:1239:5 | b [element] | array_flow.rb:1240:10:1240:10 | b [element] | -| array_flow.rb:1239:5:1239:5 | b [element] | array_flow.rb:1240:10:1240:10 | b [element] | -| array_flow.rb:1239:5:1239:5 | b [element] | array_flow.rb:1241:10:1241:10 | b [element] | | array_flow.rb:1239:5:1239:5 | b [element] | array_flow.rb:1241:10:1241:10 | b [element] | | array_flow.rb:1239:9:1239:9 | a [element 2] | array_flow.rb:1239:9:1239:21 | call to slice [element] | -| array_flow.rb:1239:9:1239:9 | a [element 2] | array_flow.rb:1239:9:1239:21 | call to slice [element] | -| array_flow.rb:1239:9:1239:9 | a [element 4] | array_flow.rb:1239:9:1239:21 | call to slice [element] | | array_flow.rb:1239:9:1239:9 | a [element 4] | array_flow.rb:1239:9:1239:21 | call to slice [element] | | array_flow.rb:1239:9:1239:21 | call to slice [element] | array_flow.rb:1239:5:1239:5 | b [element] | -| array_flow.rb:1239:9:1239:21 | call to slice [element] | array_flow.rb:1239:5:1239:5 | b [element] | -| array_flow.rb:1240:10:1240:10 | b [element] | array_flow.rb:1240:10:1240:13 | ...[...] | | array_flow.rb:1240:10:1240:10 | b [element] | array_flow.rb:1240:10:1240:13 | ...[...] | | array_flow.rb:1241:10:1241:10 | b [element] | array_flow.rb:1241:10:1241:13 | ...[...] | -| array_flow.rb:1241:10:1241:10 | b [element] | array_flow.rb:1241:10:1241:13 | ...[...] | -| array_flow.rb:1243:5:1243:5 | b [element] | array_flow.rb:1244:10:1244:10 | b [element] | | array_flow.rb:1243:5:1243:5 | b [element] | array_flow.rb:1244:10:1244:10 | b [element] | | array_flow.rb:1243:5:1243:5 | b [element] | array_flow.rb:1245:10:1245:10 | b [element] | -| array_flow.rb:1243:5:1243:5 | b [element] | array_flow.rb:1245:10:1245:10 | b [element] | -| array_flow.rb:1243:9:1243:9 | a [element 2] | array_flow.rb:1243:9:1243:24 | call to slice [element] | | array_flow.rb:1243:9:1243:9 | a [element 2] | array_flow.rb:1243:9:1243:24 | call to slice [element] | | array_flow.rb:1243:9:1243:9 | a [element 4] | array_flow.rb:1243:9:1243:24 | call to slice [element] | -| array_flow.rb:1243:9:1243:9 | a [element 4] | array_flow.rb:1243:9:1243:24 | call to slice [element] | -| array_flow.rb:1243:9:1243:24 | call to slice [element] | array_flow.rb:1243:5:1243:5 | b [element] | | array_flow.rb:1243:9:1243:24 | call to slice [element] | array_flow.rb:1243:5:1243:5 | b [element] | | 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:1245:10:1245:10 | b [element] | array_flow.rb:1245:10:1245:13 | ...[...] | | array_flow.rb:1245:10:1245:10 | b [element] | array_flow.rb:1245:10:1245:13 | ...[...] | | array_flow.rb:1247:5:1247:5 | b [element 2] | array_flow.rb:1250:10:1250:10 | b [element 2] | -| array_flow.rb:1247:5:1247:5 | b [element 2] | array_flow.rb:1250:10:1250:10 | b [element 2] | -| array_flow.rb:1247:9:1247:9 | a [element 2] | array_flow.rb:1247:9:1247:20 | call to slice [element 2] | | array_flow.rb:1247:9:1247:9 | a [element 2] | array_flow.rb:1247:9:1247:20 | call to slice [element 2] | | array_flow.rb:1247:9:1247:20 | call to slice [element 2] | array_flow.rb:1247:5:1247:5 | b [element 2] | -| array_flow.rb:1247:9:1247:20 | call to slice [element 2] | array_flow.rb:1247:5:1247:5 | b [element 2] | -| array_flow.rb:1250:10:1250:10 | b [element 2] | array_flow.rb:1250:10:1250:13 | ...[...] | | array_flow.rb:1250:10:1250:10 | b [element 2] | array_flow.rb:1250:10:1250:13 | ...[...] | | array_flow.rb:1252:5:1252:5 | b [element] | array_flow.rb:1253:10:1253:10 | b [element] | -| array_flow.rb:1252:5:1252:5 | b [element] | array_flow.rb:1253:10:1253:10 | b [element] | -| array_flow.rb:1252:5:1252:5 | b [element] | array_flow.rb:1254:10:1254:10 | b [element] | | array_flow.rb:1252:5:1252:5 | b [element] | array_flow.rb:1254:10:1254:10 | b [element] | | array_flow.rb:1252:5:1252:5 | b [element] | array_flow.rb:1255:10:1255:10 | b [element] | -| array_flow.rb:1252:5:1252:5 | b [element] | array_flow.rb:1255:10:1255:10 | b [element] | -| array_flow.rb:1252:9:1252:9 | a [element 2] | array_flow.rb:1252:9:1252:20 | call to slice [element] | | array_flow.rb:1252:9:1252:9 | a [element 2] | array_flow.rb:1252:9:1252:20 | call to slice [element] | | array_flow.rb:1252:9:1252:9 | a [element 4] | array_flow.rb:1252:9:1252:20 | call to slice [element] | -| array_flow.rb:1252:9:1252:9 | a [element 4] | array_flow.rb:1252:9:1252:20 | call to slice [element] | -| array_flow.rb:1252:9:1252:20 | call to slice [element] | array_flow.rb:1252:5:1252:5 | b [element] | | array_flow.rb:1252:9:1252:20 | call to slice [element] | array_flow.rb:1252:5:1252:5 | b [element] | | array_flow.rb:1253:10:1253:10 | b [element] | array_flow.rb:1253:10:1253:13 | ...[...] | -| array_flow.rb:1253:10:1253:10 | b [element] | array_flow.rb:1253:10:1253:13 | ...[...] | -| array_flow.rb:1254:10:1254:10 | b [element] | array_flow.rb:1254:10:1254:13 | ...[...] | | array_flow.rb:1254:10:1254:10 | b [element] | array_flow.rb:1254:10:1254:13 | ...[...] | | array_flow.rb:1255:10:1255:10 | b [element] | array_flow.rb:1255:10:1255:13 | ...[...] | -| array_flow.rb:1255:10:1255:10 | b [element] | array_flow.rb:1255:10:1255:13 | ...[...] | -| array_flow.rb:1259:5:1259:5 | a [element 2] | array_flow.rb:1260:9:1260:9 | a [element 2] | | array_flow.rb:1259:5:1259:5 | a [element 2] | array_flow.rb:1260:9:1260:9 | a [element 2] | | array_flow.rb:1259:5:1259:5 | a [element 4] | array_flow.rb:1260:9:1260:9 | a [element 4] | -| array_flow.rb:1259:5:1259:5 | a [element 4] | array_flow.rb:1260:9:1260:9 | a [element 4] | -| array_flow.rb:1259:16:1259:28 | call to source | array_flow.rb:1259:5:1259:5 | a [element 2] | | array_flow.rb:1259:16:1259:28 | call to source | array_flow.rb:1259:5:1259:5 | a [element 2] | | array_flow.rb:1259:34:1259:46 | call to source | array_flow.rb:1259:5:1259:5 | a [element 4] | -| array_flow.rb:1259:34:1259:46 | call to source | array_flow.rb:1259:5:1259:5 | a [element 4] | -| array_flow.rb:1260:5:1260:5 | b | array_flow.rb:1261:10:1261:10 | b | | array_flow.rb:1260:5:1260:5 | b | array_flow.rb:1261:10:1261:10 | b | | array_flow.rb:1260:9:1260:9 | [post] a [element 3] | array_flow.rb:1265:10:1265:10 | a [element 3] | -| array_flow.rb:1260:9:1260:9 | [post] a [element 3] | array_flow.rb:1265:10:1265:10 | a [element 3] | -| array_flow.rb:1260:9:1260:9 | a [element 2] | array_flow.rb:1260:9:1260:19 | call to slice! | | array_flow.rb:1260:9:1260:9 | a [element 2] | array_flow.rb:1260:9:1260:19 | call to slice! | | array_flow.rb:1260:9:1260:9 | a [element 4] | array_flow.rb:1260:9:1260:9 | [post] a [element 3] | -| array_flow.rb:1260:9:1260:9 | a [element 4] | array_flow.rb:1260:9:1260:9 | [post] a [element 3] | -| array_flow.rb:1260:9:1260:19 | call to slice! | array_flow.rb:1260:5:1260:5 | b | | array_flow.rb:1260:9:1260:19 | call to slice! | array_flow.rb:1260:5:1260:5 | b | | array_flow.rb:1265:10:1265:10 | a [element 3] | array_flow.rb:1265:10:1265:13 | ...[...] | -| array_flow.rb:1265:10:1265:10 | a [element 3] | array_flow.rb:1265:10:1265:13 | ...[...] | -| array_flow.rb:1267:5:1267:5 | a [element 2] | array_flow.rb:1268:9:1268:9 | a [element 2] | | array_flow.rb:1267:5:1267:5 | a [element 2] | array_flow.rb:1268:9:1268:9 | a [element 2] | | array_flow.rb:1267:5:1267:5 | a [element 4] | array_flow.rb:1268:9:1268:9 | a [element 4] | -| array_flow.rb:1267:5:1267:5 | a [element 4] | array_flow.rb:1268:9:1268:9 | a [element 4] | -| array_flow.rb:1267:16:1267:28 | call to source | array_flow.rb:1267:5:1267:5 | a [element 2] | | array_flow.rb:1267:16:1267:28 | call to source | array_flow.rb:1267:5:1267:5 | a [element 2] | | array_flow.rb:1267:34:1267:46 | call to source | array_flow.rb:1267:5:1267:5 | a [element 4] | -| array_flow.rb:1267:34:1267:46 | call to source | array_flow.rb:1267:5:1267:5 | a [element 4] | -| array_flow.rb:1268:5:1268:5 | b | array_flow.rb:1274:10:1274:10 | b | | array_flow.rb:1268:5:1268:5 | b | array_flow.rb:1274:10:1274:10 | b | -| array_flow.rb:1268:5:1268:5 | b | array_flow.rb:1276:10:1276:10 | b | | array_flow.rb:1268:5:1268:5 | b [element] | array_flow.rb:1276:10:1276:10 | b [element] | -| array_flow.rb:1268:5:1268:5 | b [element] | array_flow.rb:1276:10:1276:10 | b [element] | -| array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1269:10:1269:10 | a [element] | | array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1269:10:1269:10 | a [element] | | array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1270:10:1270:10 | a [element] | -| array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1270:10:1270:10 | a [element] | -| array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1271:10:1271:10 | a [element] | | array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1271:10:1271:10 | a [element] | | array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1272:10:1272:10 | a [element] | -| array_flow.rb:1268:9:1268:9 | [post] a [element] | array_flow.rb:1272:10:1272:10 | a [element] | -| array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:9 | [post] a [element] | | array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:9 | [post] a [element] | | array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:19 | call to slice! | -| array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:19 | call to slice! | -| array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:19 | call to slice! [element] | | array_flow.rb:1268:9:1268:9 | a [element 2] | array_flow.rb:1268:9:1268:19 | call to slice! [element] | | array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:9 | [post] a [element] | -| array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:9 | [post] a [element] | -| array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:19 | call to slice! | | array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:19 | call to slice! | | array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:19 | call to slice! [element] | -| array_flow.rb:1268:9:1268:9 | a [element 4] | array_flow.rb:1268:9:1268:19 | call to slice! [element] | -| array_flow.rb:1268:9:1268:19 | call to slice! | array_flow.rb:1268:5:1268:5 | b | | array_flow.rb:1268:9:1268:19 | call to slice! | array_flow.rb:1268:5:1268:5 | b | | array_flow.rb:1268:9:1268:19 | call to slice! [element] | array_flow.rb:1268:5:1268:5 | b [element] | -| array_flow.rb:1268:9:1268:19 | call to slice! [element] | array_flow.rb:1268:5:1268:5 | b [element] | -| array_flow.rb:1269:10:1269:10 | a [element] | array_flow.rb:1269:10:1269:13 | ...[...] | | array_flow.rb:1269:10:1269:10 | a [element] | array_flow.rb:1269:10:1269:13 | ...[...] | | array_flow.rb:1270:10:1270:10 | a [element] | array_flow.rb:1270:10:1270:13 | ...[...] | -| array_flow.rb:1270:10:1270:10 | a [element] | array_flow.rb:1270:10:1270:13 | ...[...] | -| array_flow.rb:1271:10:1271:10 | a [element] | array_flow.rb:1271:10:1271:13 | ...[...] | | array_flow.rb:1271:10:1271:10 | a [element] | array_flow.rb:1271:10:1271:13 | ...[...] | | array_flow.rb:1272:10:1272:10 | a [element] | array_flow.rb:1272:10:1272:13 | ...[...] | -| array_flow.rb:1272:10:1272:10 | a [element] | array_flow.rb:1272:10:1272:13 | ...[...] | -| array_flow.rb:1276:10:1276:10 | b | array_flow.rb:1276:10:1276:13 | ...[...] | -| array_flow.rb:1276:10:1276:10 | b [element] | array_flow.rb:1276:10:1276:13 | ...[...] | | array_flow.rb:1276:10:1276:10 | b [element] | array_flow.rb:1276:10:1276:13 | ...[...] | | array_flow.rb:1278:5:1278:5 | a [element 2] | array_flow.rb:1279:9:1279:9 | a [element 2] | -| array_flow.rb:1278:5:1278:5 | a [element 2] | array_flow.rb:1279:9:1279:9 | a [element 2] | -| array_flow.rb:1278:5:1278:5 | a [element 4] | array_flow.rb:1279:9:1279:9 | a [element 4] | | array_flow.rb:1278:5:1278:5 | a [element 4] | array_flow.rb:1279:9:1279:9 | a [element 4] | | array_flow.rb:1278:16:1278:28 | call to source | array_flow.rb:1278:5:1278:5 | a [element 2] | -| array_flow.rb:1278:16:1278:28 | call to source | array_flow.rb:1278:5:1278:5 | a [element 2] | -| array_flow.rb:1278:34:1278:46 | call to source | array_flow.rb:1278:5:1278:5 | a [element 4] | | array_flow.rb:1278:34:1278:46 | call to source | array_flow.rb:1278:5:1278:5 | a [element 4] | | array_flow.rb:1279:5:1279:5 | b [element 0] | array_flow.rb:1280:10:1280:10 | b [element 0] | -| array_flow.rb:1279:5:1279:5 | b [element 0] | array_flow.rb:1280:10:1280:10 | b [element 0] | -| array_flow.rb:1279:5:1279:5 | b [element 2] | array_flow.rb:1282:10:1282:10 | b [element 2] | | array_flow.rb:1279:5:1279:5 | b [element 2] | array_flow.rb:1282:10:1282:10 | b [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:22 | call to slice! [element 2] | | array_flow.rb:1279:9:1279:9 | a [element 4] | array_flow.rb:1279:9:1279:22 | call to slice! [element 2] | | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | array_flow.rb:1279:5:1279:5 | b [element 0] | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | array_flow.rb:1279:5:1279:5 | b [element 0] | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 2] | array_flow.rb:1279:5:1279:5 | b [element 2] | | array_flow.rb:1279:9:1279:22 | call to slice! [element 2] | array_flow.rb:1279:5:1279:5 | b [element 2] | | 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:1282:10:1282:10 | b [element 2] | array_flow.rb:1282:10:1282:13 | ...[...] | | array_flow.rb:1282:10:1282:10 | b [element 2] | array_flow.rb:1282:10:1282:13 | ...[...] | | array_flow.rb:1289:5:1289:5 | a [element 2] | array_flow.rb:1290:9:1290:9 | a [element 2] | -| array_flow.rb:1289:5:1289:5 | a [element 2] | array_flow.rb:1290:9:1290:9 | a [element 2] | -| array_flow.rb:1289:5:1289:5 | a [element 4] | array_flow.rb:1290:9:1290:9 | a [element 4] | | array_flow.rb:1289:5:1289:5 | a [element 4] | array_flow.rb:1290:9:1290:9 | a [element 4] | | array_flow.rb:1289:16:1289:28 | call to source | array_flow.rb:1289:5:1289:5 | a [element 2] | -| array_flow.rb:1289:16:1289:28 | call to source | array_flow.rb:1289:5:1289:5 | a [element 2] | -| array_flow.rb:1289:34:1289:46 | call to source | array_flow.rb:1289:5:1289:5 | a [element 4] | | array_flow.rb:1289:34:1289:46 | call to source | array_flow.rb:1289:5:1289:5 | a [element 4] | | array_flow.rb:1290:5:1290:5 | b [element 0] | array_flow.rb:1291:10:1291:10 | b [element 0] | -| array_flow.rb:1290:5:1290:5 | b [element 0] | array_flow.rb:1291:10:1291:10 | b [element 0] | -| array_flow.rb:1290:9:1290:9 | [post] a [element 2] | array_flow.rb:1296:10:1296:10 | a [element 2] | | array_flow.rb:1290:9:1290:9 | [post] a [element 2] | array_flow.rb:1296:10:1296:10 | a [element 2] | | array_flow.rb:1290:9:1290:9 | a [element 2] | array_flow.rb:1290:9:1290:22 | call to slice! [element 0] | -| array_flow.rb:1290:9:1290:9 | a [element 2] | array_flow.rb:1290:9:1290:22 | 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:22 | call to slice! [element 0] | array_flow.rb:1290:5:1290:5 | b [element 0] | -| array_flow.rb:1290:9:1290:22 | call to slice! [element 0] | array_flow.rb:1290:5:1290:5 | b [element 0] | -| array_flow.rb:1291:10:1291:10 | b [element 0] | array_flow.rb:1291:10:1291:13 | ...[...] | | array_flow.rb:1291:10:1291:10 | b [element 0] | array_flow.rb:1291:10:1291:13 | ...[...] | | array_flow.rb:1296:10:1296:10 | a [element 2] | array_flow.rb:1296:10:1296:13 | ...[...] | -| array_flow.rb:1296:10:1296:10 | a [element 2] | array_flow.rb:1296:10:1296:13 | ...[...] | -| array_flow.rb:1300:5:1300:5 | a [element 2] | array_flow.rb:1301:9:1301:9 | a [element 2] | | array_flow.rb:1300:5:1300:5 | a [element 2] | array_flow.rb:1301:9:1301:9 | a [element 2] | | array_flow.rb:1300:5:1300:5 | a [element 4] | array_flow.rb:1301:9:1301:9 | a [element 4] | -| array_flow.rb:1300:5:1300:5 | a [element 4] | array_flow.rb:1301:9:1301:9 | a [element 4] | -| array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1300:5:1300:5 | a [element 2] | | array_flow.rb:1300:16:1300:28 | call to source | array_flow.rb:1300:5:1300:5 | a [element 2] | | array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1300:5:1300:5 | a [element 4] | -| array_flow.rb:1300:34:1300:46 | call to source | array_flow.rb:1300:5:1300:5 | a [element 4] | -| array_flow.rb:1301:5:1301:5 | b [element 0] | array_flow.rb:1302:10:1302:10 | b [element 0] | | array_flow.rb:1301:5:1301:5 | b [element 0] | array_flow.rb:1302:10:1302:10 | b [element 0] | | array_flow.rb:1301:9:1301:9 | [post] a [element 2] | array_flow.rb:1307:10:1307:10 | a [element 2] | -| array_flow.rb:1301:9:1301:9 | [post] a [element 2] | array_flow.rb:1307:10:1307:10 | a [element 2] | -| array_flow.rb:1301:9:1301:9 | a [element 2] | array_flow.rb:1301:9:1301:23 | call to slice! [element 0] | | array_flow.rb:1301:9:1301:9 | a [element 2] | array_flow.rb:1301:9:1301:23 | call to slice! [element 0] | | array_flow.rb:1301:9:1301:9 | a [element 4] | array_flow.rb:1301:9:1301:9 | [post] a [element 2] | -| array_flow.rb:1301:9:1301:9 | a [element 4] | array_flow.rb:1301:9:1301:9 | [post] a [element 2] | -| array_flow.rb:1301:9:1301:23 | call to slice! [element 0] | array_flow.rb:1301:5:1301:5 | b [element 0] | | array_flow.rb:1301:9:1301:23 | call to slice! [element 0] | array_flow.rb:1301:5:1301:5 | b [element 0] | | array_flow.rb:1302:10:1302:10 | b [element 0] | array_flow.rb:1302:10:1302:13 | ...[...] | -| array_flow.rb:1302:10:1302:10 | b [element 0] | array_flow.rb:1302:10:1302:13 | ...[...] | -| array_flow.rb:1307:10:1307:10 | a [element 2] | array_flow.rb:1307:10:1307:13 | ...[...] | | array_flow.rb:1307:10:1307:10 | a [element 2] | array_flow.rb:1307:10:1307:13 | ...[...] | | array_flow.rb:1311:5:1311:5 | a [element 2] | array_flow.rb:1312:9:1312:9 | a [element 2] | -| array_flow.rb:1311:5:1311:5 | a [element 2] | array_flow.rb:1312:9:1312:9 | a [element 2] | -| array_flow.rb:1311:5:1311:5 | a [element 4] | array_flow.rb:1312:9:1312:9 | a [element 4] | | array_flow.rb:1311:5:1311:5 | a [element 4] | array_flow.rb:1312:9:1312:9 | a [element 4] | | array_flow.rb:1311:16:1311:28 | call to source | array_flow.rb:1311:5:1311:5 | a [element 2] | -| array_flow.rb:1311:16:1311:28 | call to source | array_flow.rb:1311:5:1311:5 | a [element 2] | -| array_flow.rb:1311:34:1311:46 | call to source | array_flow.rb:1311:5:1311:5 | a [element 4] | | array_flow.rb:1311:34:1311:46 | call to source | array_flow.rb:1311:5:1311:5 | a [element 4] | | array_flow.rb:1312:5:1312:5 | b [element] | array_flow.rb:1313:10:1313:10 | b [element] | -| array_flow.rb:1312:5:1312:5 | b [element] | array_flow.rb:1313:10:1313:10 | b [element] | -| array_flow.rb:1312:5:1312:5 | b [element] | array_flow.rb:1314:10:1314:10 | b [element] | | array_flow.rb:1312:5:1312:5 | b [element] | array_flow.rb:1314:10:1314:10 | b [element] | | array_flow.rb:1312:5:1312:5 | b [element] | array_flow.rb:1315:10:1315:10 | b [element] | -| array_flow.rb:1312:5:1312:5 | b [element] | array_flow.rb:1315:10:1315:10 | b [element] | -| array_flow.rb:1312:9:1312:9 | [post] a [element] | array_flow.rb:1316:10:1316:10 | a [element] | | array_flow.rb:1312:9:1312:9 | [post] a [element] | array_flow.rb:1316:10:1316:10 | a [element] | | array_flow.rb:1312:9:1312:9 | [post] a [element] | array_flow.rb:1317:10:1317:10 | a [element] | -| array_flow.rb:1312:9:1312:9 | [post] a [element] | array_flow.rb:1317:10:1317:10 | a [element] | -| array_flow.rb:1312:9:1312:9 | [post] a [element] | array_flow.rb:1318:10:1318:10 | a [element] | | array_flow.rb:1312:9:1312:9 | [post] a [element] | array_flow.rb:1318:10:1318:10 | a [element] | | array_flow.rb:1312:9:1312:9 | a [element 2] | array_flow.rb:1312:9:1312:9 | [post] a [element] | -| array_flow.rb:1312:9:1312:9 | a [element 2] | array_flow.rb:1312:9:1312:9 | [post] a [element] | -| array_flow.rb:1312:9:1312:9 | a [element 2] | array_flow.rb:1312:9:1312:22 | call to slice! [element] | | array_flow.rb:1312:9:1312:9 | a [element 2] | array_flow.rb:1312:9:1312:22 | call to slice! [element] | | array_flow.rb:1312:9:1312:9 | a [element 4] | array_flow.rb:1312:9:1312:9 | [post] a [element] | -| array_flow.rb:1312:9:1312:9 | a [element 4] | array_flow.rb:1312:9:1312:9 | [post] a [element] | -| array_flow.rb:1312:9:1312:9 | a [element 4] | array_flow.rb:1312:9:1312:22 | call to slice! [element] | | array_flow.rb:1312:9:1312:9 | a [element 4] | array_flow.rb:1312:9:1312:22 | call to slice! [element] | | array_flow.rb:1312:9:1312:22 | call to slice! [element] | array_flow.rb:1312:5:1312:5 | b [element] | -| array_flow.rb:1312:9:1312:22 | call to slice! [element] | array_flow.rb:1312:5:1312:5 | b [element] | -| array_flow.rb:1313:10:1313:10 | b [element] | array_flow.rb:1313:10:1313:13 | ...[...] | | array_flow.rb:1313:10:1313:10 | b [element] | array_flow.rb:1313:10:1313:13 | ...[...] | | array_flow.rb:1314:10:1314:10 | b [element] | array_flow.rb:1314:10:1314:13 | ...[...] | -| array_flow.rb:1314:10:1314:10 | b [element] | array_flow.rb:1314:10:1314:13 | ...[...] | -| array_flow.rb:1315:10:1315:10 | b [element] | array_flow.rb:1315:10:1315:13 | ...[...] | | array_flow.rb:1315:10:1315:10 | b [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:1317:10:1317:10 | a [element] | array_flow.rb:1317:10:1317:13 | ...[...] | | array_flow.rb:1317:10:1317:10 | a [element] | array_flow.rb:1317:10:1317:13 | ...[...] | | array_flow.rb:1318:10:1318:10 | a [element] | array_flow.rb:1318:10:1318:13 | ...[...] | -| array_flow.rb:1318:10:1318:10 | a [element] | array_flow.rb:1318:10:1318:13 | ...[...] | -| array_flow.rb:1320:5:1320:5 | a [element 2] | array_flow.rb:1321:9:1321:9 | a [element 2] | | array_flow.rb:1320:5:1320:5 | a [element 2] | array_flow.rb:1321:9:1321:9 | a [element 2] | | array_flow.rb:1320:5:1320:5 | a [element 4] | array_flow.rb:1321:9:1321:9 | a [element 4] | -| array_flow.rb:1320:5:1320:5 | a [element 4] | array_flow.rb:1321:9:1321:9 | a [element 4] | -| array_flow.rb:1320:16:1320:28 | call to source | array_flow.rb:1320:5:1320:5 | a [element 2] | | array_flow.rb:1320:16:1320:28 | call to source | array_flow.rb:1320:5:1320:5 | a [element 2] | | array_flow.rb:1320:34:1320:46 | call to source | array_flow.rb:1320:5:1320:5 | a [element 4] | -| array_flow.rb:1320:34:1320:46 | call to source | array_flow.rb:1320:5:1320:5 | a [element 4] | -| array_flow.rb:1321:5:1321:5 | b [element] | array_flow.rb:1322:10:1322:10 | b [element] | | array_flow.rb:1321:5:1321:5 | b [element] | array_flow.rb:1322:10:1322:10 | b [element] | | array_flow.rb:1321:5:1321:5 | b [element] | array_flow.rb:1323:10:1323:10 | b [element] | -| array_flow.rb:1321:5:1321:5 | b [element] | array_flow.rb:1323:10:1323:10 | b [element] | -| array_flow.rb:1321:5:1321:5 | b [element] | array_flow.rb:1324:10:1324:10 | b [element] | | array_flow.rb:1321:5:1321:5 | b [element] | array_flow.rb:1324:10:1324:10 | b [element] | | array_flow.rb:1321:9:1321:9 | [post] a [element] | array_flow.rb:1325:10:1325:10 | a [element] | -| array_flow.rb:1321:9:1321:9 | [post] a [element] | array_flow.rb:1325:10:1325:10 | a [element] | -| array_flow.rb:1321:9:1321:9 | [post] a [element] | array_flow.rb:1326:10:1326:10 | a [element] | | array_flow.rb:1321:9:1321:9 | [post] a [element] | array_flow.rb:1326:10:1326:10 | a [element] | | array_flow.rb:1321:9:1321:9 | [post] a [element] | array_flow.rb:1327:10:1327:10 | a [element] | -| array_flow.rb:1321:9:1321:9 | [post] a [element] | array_flow.rb:1327:10:1327:10 | a [element] | -| array_flow.rb:1321:9:1321:9 | a [element 2] | array_flow.rb:1321:9:1321:9 | [post] a [element] | | array_flow.rb:1321:9:1321:9 | a [element 2] | array_flow.rb:1321:9:1321:9 | [post] a [element] | | array_flow.rb:1321:9:1321:9 | a [element 2] | array_flow.rb:1321:9:1321:22 | call to slice! [element] | -| array_flow.rb:1321:9:1321:9 | a [element 2] | array_flow.rb:1321:9:1321:22 | call to slice! [element] | -| array_flow.rb:1321:9:1321:9 | a [element 4] | array_flow.rb:1321:9:1321:9 | [post] a [element] | | array_flow.rb:1321:9:1321:9 | a [element 4] | array_flow.rb:1321:9:1321:9 | [post] a [element] | | array_flow.rb:1321:9:1321:9 | a [element 4] | array_flow.rb:1321:9:1321:22 | call to slice! [element] | -| array_flow.rb:1321:9:1321:9 | a [element 4] | array_flow.rb:1321:9:1321:22 | call to slice! [element] | -| array_flow.rb:1321:9:1321:22 | call to slice! [element] | array_flow.rb:1321:5:1321:5 | b [element] | | array_flow.rb:1321:9:1321:22 | call to slice! [element] | array_flow.rb:1321:5:1321:5 | b [element] | | array_flow.rb:1322:10:1322:10 | b [element] | array_flow.rb:1322:10:1322:13 | ...[...] | -| array_flow.rb:1322:10:1322:10 | b [element] | array_flow.rb:1322:10:1322:13 | ...[...] | -| array_flow.rb:1323:10:1323:10 | b [element] | array_flow.rb:1323:10:1323:13 | ...[...] | | array_flow.rb:1323:10:1323:10 | b [element] | array_flow.rb:1323:10:1323:13 | ...[...] | | array_flow.rb:1324:10:1324:10 | b [element] | array_flow.rb:1324:10:1324:13 | ...[...] | -| array_flow.rb:1324:10:1324:10 | b [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:1326:10:1326:10 | a [element] | array_flow.rb:1326:10:1326:13 | ...[...] | -| array_flow.rb:1326:10:1326:10 | a [element] | array_flow.rb:1326:10:1326:13 | ...[...] | -| array_flow.rb:1327:10:1327:10 | a [element] | array_flow.rb:1327:10:1327:13 | ...[...] | | array_flow.rb:1327:10:1327:10 | a [element] | array_flow.rb:1327:10:1327:13 | ...[...] | | array_flow.rb:1329:5:1329:5 | a [element 2] | array_flow.rb:1330:9:1330:9 | a [element 2] | -| array_flow.rb:1329:5:1329:5 | a [element 2] | array_flow.rb:1330:9:1330:9 | a [element 2] | -| array_flow.rb:1329:5:1329:5 | a [element 4] | array_flow.rb:1330:9:1330:9 | a [element 4] | | array_flow.rb:1329:5:1329:5 | a [element 4] | array_flow.rb:1330:9:1330:9 | a [element 4] | | array_flow.rb:1329:16:1329:28 | call to source | array_flow.rb:1329:5:1329:5 | a [element 2] | -| array_flow.rb:1329:16:1329:28 | call to source | array_flow.rb:1329:5:1329:5 | a [element 2] | -| array_flow.rb:1329:34:1329:46 | call to source | array_flow.rb:1329:5:1329:5 | a [element 4] | | array_flow.rb:1329:34:1329:46 | call to source | array_flow.rb:1329:5:1329:5 | a [element 4] | | array_flow.rb:1330:5:1330:5 | b [element] | array_flow.rb:1331:10:1331:10 | b [element] | -| array_flow.rb:1330:5:1330:5 | b [element] | array_flow.rb:1331:10:1331:10 | b [element] | -| array_flow.rb:1330:5:1330:5 | b [element] | array_flow.rb:1332:10:1332:10 | b [element] | | array_flow.rb:1330:5:1330:5 | b [element] | array_flow.rb:1332:10:1332:10 | b [element] | | array_flow.rb:1330:5:1330:5 | b [element] | array_flow.rb:1333:10:1333:10 | b [element] | -| array_flow.rb:1330:5:1330:5 | b [element] | array_flow.rb:1333:10:1333:10 | b [element] | -| array_flow.rb:1330:9:1330:9 | [post] a [element] | array_flow.rb:1334:10:1334:10 | a [element] | | array_flow.rb:1330:9:1330:9 | [post] a [element] | array_flow.rb:1334:10:1334:10 | a [element] | | array_flow.rb:1330:9:1330:9 | [post] a [element] | array_flow.rb:1335:10:1335:10 | a [element] | -| array_flow.rb:1330:9:1330:9 | [post] a [element] | array_flow.rb:1335:10:1335:10 | a [element] | -| array_flow.rb:1330:9:1330:9 | [post] a [element] | array_flow.rb:1336:10:1336:10 | a [element] | | array_flow.rb:1330:9:1330:9 | [post] a [element] | array_flow.rb:1336:10:1336:10 | a [element] | | array_flow.rb:1330:9:1330:9 | a [element 2] | array_flow.rb:1330:9:1330:9 | [post] a [element] | -| array_flow.rb:1330:9:1330:9 | a [element 2] | array_flow.rb:1330:9:1330:9 | [post] a [element] | -| array_flow.rb:1330:9:1330:9 | a [element 2] | array_flow.rb:1330:9:1330:25 | call to slice! [element] | | array_flow.rb:1330:9:1330:9 | a [element 2] | array_flow.rb:1330:9:1330:25 | call to slice! [element] | | array_flow.rb:1330:9:1330:9 | a [element 4] | array_flow.rb:1330:9:1330:9 | [post] a [element] | -| array_flow.rb:1330:9:1330:9 | a [element 4] | array_flow.rb:1330:9:1330:9 | [post] a [element] | -| array_flow.rb:1330:9:1330:9 | a [element 4] | array_flow.rb:1330:9:1330:25 | call to slice! [element] | | array_flow.rb:1330:9:1330:9 | a [element 4] | array_flow.rb:1330:9:1330:25 | call to slice! [element] | | array_flow.rb:1330:9:1330:25 | call to slice! [element] | array_flow.rb:1330:5:1330:5 | b [element] | -| array_flow.rb:1330:9:1330:25 | call to slice! [element] | array_flow.rb:1330:5:1330:5 | b [element] | -| array_flow.rb:1331:10:1331:10 | b [element] | array_flow.rb:1331:10:1331:13 | ...[...] | | array_flow.rb:1331:10:1331:10 | b [element] | array_flow.rb:1331:10:1331:13 | ...[...] | | array_flow.rb:1332:10:1332:10 | b [element] | array_flow.rb:1332:10:1332:13 | ...[...] | -| array_flow.rb:1332:10:1332:10 | b [element] | array_flow.rb:1332:10:1332:13 | ...[...] | -| array_flow.rb:1333:10:1333:10 | b [element] | array_flow.rb:1333:10:1333:13 | ...[...] | | array_flow.rb:1333:10:1333:10 | b [element] | array_flow.rb:1333:10:1333:13 | ...[...] | | array_flow.rb:1334:10:1334:10 | a [element] | array_flow.rb:1334:10:1334:13 | ...[...] | -| array_flow.rb:1334:10:1334:10 | a [element] | array_flow.rb:1334:10:1334:13 | ...[...] | -| array_flow.rb:1335:10:1335:10 | a [element] | array_flow.rb:1335:10:1335:13 | ...[...] | | array_flow.rb:1335:10:1335:10 | a [element] | array_flow.rb:1335:10:1335:13 | ...[...] | | array_flow.rb:1336:10:1336:10 | a [element] | array_flow.rb:1336:10:1336:13 | ...[...] | -| array_flow.rb:1336:10:1336:10 | a [element] | array_flow.rb:1336:10:1336:13 | ...[...] | -| array_flow.rb:1338:5:1338:5 | a [element 2] | array_flow.rb:1339:9:1339:9 | a [element 2] | | array_flow.rb:1338:5:1338:5 | a [element 2] | array_flow.rb:1339:9:1339:9 | a [element 2] | | array_flow.rb:1338:5:1338:5 | a [element 4] | array_flow.rb:1339:9:1339:9 | a [element 4] | -| array_flow.rb:1338:5:1338:5 | a [element 4] | array_flow.rb:1339:9:1339:9 | a [element 4] | -| array_flow.rb:1338:16:1338:28 | call to source | array_flow.rb:1338:5:1338:5 | a [element 2] | | array_flow.rb:1338:16:1338:28 | call to source | array_flow.rb:1338:5:1338:5 | a [element 2] | | array_flow.rb:1338:34:1338:46 | call to source | array_flow.rb:1338:5:1338:5 | a [element 4] | -| array_flow.rb:1338:34:1338:46 | call to source | array_flow.rb:1338:5:1338:5 | a [element 4] | -| array_flow.rb:1339:5:1339:5 | b [element 2] | array_flow.rb:1342:10:1342:10 | b [element 2] | | array_flow.rb:1339:5:1339:5 | b [element 2] | array_flow.rb:1342:10:1342:10 | b [element 2] | | array_flow.rb:1339:9:1339:9 | [post] a [element 1] | array_flow.rb:1344:10:1344:10 | a [element 1] | -| array_flow.rb:1339:9:1339:9 | [post] a [element 1] | array_flow.rb:1344:10:1344:10 | a [element 1] | -| array_flow.rb:1339:9:1339:9 | a [element 2] | array_flow.rb:1339:9:1339:21 | call to slice! [element 2] | | array_flow.rb:1339:9:1339:9 | a [element 2] | array_flow.rb:1339:9:1339:21 | call to slice! [element 2] | | array_flow.rb:1339:9:1339:9 | a [element 4] | array_flow.rb:1339:9:1339:9 | [post] a [element 1] | -| array_flow.rb:1339:9:1339:9 | a [element 4] | array_flow.rb:1339:9:1339:9 | [post] a [element 1] | -| array_flow.rb:1339:9:1339:21 | call to slice! [element 2] | array_flow.rb:1339:5:1339:5 | b [element 2] | | array_flow.rb:1339:9:1339:21 | call to slice! [element 2] | array_flow.rb:1339:5:1339:5 | b [element 2] | | array_flow.rb:1342:10:1342:10 | b [element 2] | array_flow.rb:1342:10:1342:13 | ...[...] | -| array_flow.rb:1342:10:1342:10 | b [element 2] | array_flow.rb:1342:10:1342:13 | ...[...] | -| array_flow.rb:1344:10:1344:10 | a [element 1] | array_flow.rb:1344:10:1344:13 | ...[...] | | array_flow.rb:1344:10:1344:10 | a [element 1] | array_flow.rb:1344:10:1344:13 | ...[...] | | array_flow.rb:1347:5:1347:5 | a [element 2] | array_flow.rb:1348:9:1348:9 | a [element 2] | -| array_flow.rb:1347:5:1347:5 | a [element 2] | array_flow.rb:1348:9:1348:9 | a [element 2] | -| array_flow.rb:1347:5:1347:5 | a [element 4] | array_flow.rb:1348:9:1348:9 | a [element 4] | | array_flow.rb:1347:5:1347:5 | a [element 4] | array_flow.rb:1348:9:1348:9 | a [element 4] | | array_flow.rb:1347:16:1347:28 | call to source | array_flow.rb:1347:5:1347:5 | a [element 2] | -| array_flow.rb:1347:16:1347:28 | call to source | array_flow.rb:1347:5:1347:5 | a [element 2] | -| array_flow.rb:1347:34:1347:46 | call to source | array_flow.rb:1347:5:1347:5 | a [element 4] | | array_flow.rb:1347:34:1347:46 | call to source | array_flow.rb:1347:5:1347:5 | a [element 4] | | array_flow.rb:1348:5:1348:5 | b [element] | array_flow.rb:1349:10:1349:10 | b [element] | -| array_flow.rb:1348:5:1348:5 | b [element] | array_flow.rb:1349:10:1349:10 | b [element] | -| array_flow.rb:1348:5:1348:5 | b [element] | array_flow.rb:1350:10:1350:10 | b [element] | | array_flow.rb:1348:5:1348:5 | b [element] | array_flow.rb:1350:10:1350:10 | b [element] | | array_flow.rb:1348:5:1348:5 | b [element] | array_flow.rb:1351:10:1351:10 | b [element] | -| array_flow.rb:1348:5:1348:5 | b [element] | array_flow.rb:1351:10:1351:10 | b [element] | -| array_flow.rb:1348:9:1348:9 | [post] a [element] | array_flow.rb:1352:10:1352:10 | a [element] | | array_flow.rb:1348:9:1348:9 | [post] a [element] | array_flow.rb:1352:10:1352:10 | a [element] | | array_flow.rb:1348:9:1348:9 | [post] a [element] | array_flow.rb:1353:10:1353:10 | a [element] | -| array_flow.rb:1348:9:1348:9 | [post] a [element] | array_flow.rb:1353:10:1353:10 | a [element] | -| array_flow.rb:1348:9:1348:9 | [post] a [element] | array_flow.rb:1354:10:1354:10 | a [element] | | array_flow.rb:1348:9:1348:9 | [post] a [element] | array_flow.rb:1354:10:1354:10 | a [element] | | array_flow.rb:1348:9:1348:9 | a [element 2] | array_flow.rb:1348:9:1348:9 | [post] a [element] | -| array_flow.rb:1348:9:1348:9 | a [element 2] | array_flow.rb:1348:9:1348:9 | [post] a [element] | -| array_flow.rb:1348:9:1348:9 | a [element 2] | array_flow.rb:1348:9:1348:21 | call to slice! [element] | | array_flow.rb:1348:9:1348:9 | a [element 2] | array_flow.rb:1348:9:1348:21 | call to slice! [element] | | array_flow.rb:1348:9:1348:9 | a [element 4] | array_flow.rb:1348:9:1348:9 | [post] a [element] | -| array_flow.rb:1348:9:1348:9 | a [element 4] | array_flow.rb:1348:9:1348:9 | [post] a [element] | -| array_flow.rb:1348:9:1348:9 | a [element 4] | array_flow.rb:1348:9:1348:21 | call to slice! [element] | | array_flow.rb:1348:9:1348:9 | a [element 4] | array_flow.rb:1348:9:1348:21 | call to slice! [element] | | array_flow.rb:1348:9:1348:21 | call to slice! [element] | array_flow.rb:1348:5:1348:5 | b [element] | -| array_flow.rb:1348:9:1348:21 | call to slice! [element] | array_flow.rb:1348:5:1348:5 | b [element] | -| array_flow.rb:1349:10:1349:10 | b [element] | array_flow.rb:1349:10:1349:13 | ...[...] | | array_flow.rb:1349:10:1349:10 | b [element] | array_flow.rb:1349:10:1349:13 | ...[...] | | array_flow.rb:1350:10:1350:10 | b [element] | array_flow.rb:1350:10:1350:13 | ...[...] | -| array_flow.rb:1350:10:1350:10 | b [element] | array_flow.rb:1350:10:1350:13 | ...[...] | -| array_flow.rb:1351:10:1351:10 | b [element] | array_flow.rb:1351:10:1351:13 | ...[...] | | array_flow.rb:1351:10:1351:10 | b [element] | array_flow.rb:1351:10:1351:13 | ...[...] | | array_flow.rb:1352:10:1352:10 | a [element] | array_flow.rb:1352:10:1352:13 | ...[...] | -| array_flow.rb:1352:10:1352:10 | a [element] | array_flow.rb:1352:10:1352:13 | ...[...] | -| array_flow.rb:1353:10:1353:10 | a [element] | array_flow.rb:1353:10:1353:13 | ...[...] | | array_flow.rb:1353:10:1353:10 | a [element] | array_flow.rb:1353:10:1353:13 | ...[...] | | array_flow.rb:1354:10:1354:10 | a [element] | array_flow.rb:1354:10:1354:13 | ...[...] | -| array_flow.rb:1354:10:1354:10 | a [element] | array_flow.rb:1354:10:1354:13 | ...[...] | -| array_flow.rb:1358:5:1358:5 | a [element 2] | array_flow.rb:1359:9:1359:9 | a [element 2] | | array_flow.rb:1358:5:1358:5 | a [element 2] | array_flow.rb:1359:9:1359:9 | a [element 2] | | array_flow.rb:1358:16:1358:26 | call to source | array_flow.rb:1358:5:1358:5 | a [element 2] | -| array_flow.rb:1358:16:1358:26 | call to source | array_flow.rb:1358:5:1358:5 | a [element 2] | -| array_flow.rb:1359:9:1359:9 | a [element 2] | array_flow.rb:1359:27:1359:27 | x | | array_flow.rb:1359:9:1359:9 | a [element 2] | array_flow.rb:1359:27:1359:27 | x | | array_flow.rb:1359:27:1359:27 | x | array_flow.rb:1360:14:1360:14 | x | -| array_flow.rb:1359:27:1359:27 | x | array_flow.rb:1360:14:1360:14 | x | -| array_flow.rb:1366:5:1366:5 | a [element 2] | array_flow.rb:1367:9:1367:9 | a [element 2] | | array_flow.rb:1366:5:1366:5 | a [element 2] | array_flow.rb:1367:9:1367:9 | a [element 2] | | array_flow.rb:1366:16:1366:26 | call to source | array_flow.rb:1366:5:1366:5 | a [element 2] | -| array_flow.rb:1366:16:1366:26 | call to source | array_flow.rb:1366:5:1366:5 | a [element 2] | -| array_flow.rb:1367:9:1367:9 | a [element 2] | array_flow.rb:1367:28:1367:28 | x | | array_flow.rb:1367:9:1367:9 | a [element 2] | array_flow.rb:1367:28:1367:28 | x | | array_flow.rb:1367:28:1367:28 | x | array_flow.rb:1368:14:1368:14 | x | -| array_flow.rb:1367:28:1367:28 | x | array_flow.rb:1368:14:1368:14 | x | -| array_flow.rb:1374:5:1374:5 | a [element 2] | array_flow.rb:1375:9:1375:9 | a [element 2] | | array_flow.rb:1374:5:1374:5 | a [element 2] | array_flow.rb:1375:9:1375:9 | a [element 2] | | array_flow.rb:1374:16:1374:26 | call to source | array_flow.rb:1374:5:1374:5 | a [element 2] | -| array_flow.rb:1374:16:1374:26 | call to source | array_flow.rb:1374:5:1374:5 | a [element 2] | -| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:26:1375:26 | x | | array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:26:1375:26 | x | | array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:29:1375:29 | y | -| array_flow.rb:1375:9:1375:9 | a [element 2] | array_flow.rb:1375:29:1375:29 | y | -| array_flow.rb:1375:26:1375:26 | x | array_flow.rb:1376:14:1376:14 | x | | array_flow.rb:1375:26:1375:26 | x | array_flow.rb:1376:14:1376:14 | x | | array_flow.rb:1375:29:1375:29 | y | array_flow.rb:1377:14:1377:14 | y | -| array_flow.rb:1375:29:1375:29 | y | array_flow.rb:1377:14:1377:14 | y | -| array_flow.rb:1382:5:1382:5 | a [element 2] | array_flow.rb:1383:9:1383:9 | a [element 2] | | array_flow.rb:1382:5:1382:5 | a [element 2] | array_flow.rb:1383:9:1383:9 | a [element 2] | | array_flow.rb:1382:5:1382:5 | a [element 2] | array_flow.rb:1386:9:1386:9 | a [element 2] | -| array_flow.rb:1382:5:1382:5 | a [element 2] | array_flow.rb:1386:9:1386:9 | a [element 2] | -| array_flow.rb:1382:16:1382:26 | call to source | array_flow.rb:1382:5:1382:5 | a [element 2] | | array_flow.rb:1382:16:1382:26 | call to source | array_flow.rb:1382:5:1382:5 | a [element 2] | | array_flow.rb:1383:5:1383:5 | b [element] | array_flow.rb:1384:10:1384:10 | b [element] | -| array_flow.rb:1383:5:1383:5 | b [element] | array_flow.rb:1384:10:1384:10 | b [element] | -| array_flow.rb:1383:5:1383:5 | b [element] | array_flow.rb:1385:10:1385:10 | b [element] | | array_flow.rb:1383:5:1383:5 | b [element] | array_flow.rb:1385:10:1385:10 | b [element] | | array_flow.rb:1383:9:1383:9 | a [element 2] | array_flow.rb:1383:9:1383:14 | call to sort [element] | -| array_flow.rb:1383:9:1383:9 | a [element 2] | array_flow.rb:1383:9:1383:14 | call to sort [element] | -| array_flow.rb:1383:9:1383:14 | call to sort [element] | array_flow.rb:1383:5:1383:5 | b [element] | | array_flow.rb:1383:9:1383:14 | call to sort [element] | array_flow.rb:1383:5:1383:5 | b [element] | | array_flow.rb:1384:10:1384:10 | b [element] | array_flow.rb:1384:10:1384:13 | ...[...] | -| array_flow.rb:1384:10:1384:10 | b [element] | array_flow.rb:1384:10:1384:13 | ...[...] | -| array_flow.rb:1385:10:1385:10 | b [element] | array_flow.rb:1385:10:1385:13 | ...[...] | | array_flow.rb:1385:10:1385:10 | b [element] | array_flow.rb:1385:10:1385:13 | ...[...] | | array_flow.rb:1386:5:1386:5 | c [element] | array_flow.rb:1391:10:1391:10 | c [element] | -| array_flow.rb:1386:5:1386:5 | c [element] | array_flow.rb:1391:10:1391:10 | c [element] | -| array_flow.rb:1386:5:1386:5 | c [element] | array_flow.rb:1392:10:1392:10 | c [element] | | array_flow.rb:1386:5:1386:5 | c [element] | array_flow.rb:1392:10:1392:10 | c [element] | | array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:9:1390:7 | call to sort [element] | -| array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:9:1390:7 | call to sort [element] | -| array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:20:1386:20 | x | | array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:20:1386:20 | x | | array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:23:1386:23 | y | -| array_flow.rb:1386:9:1386:9 | a [element 2] | array_flow.rb:1386:23:1386:23 | y | -| array_flow.rb:1386:9:1390:7 | call to sort [element] | array_flow.rb:1386:5:1386:5 | c [element] | | array_flow.rb:1386:9:1390:7 | call to sort [element] | array_flow.rb:1386:5:1386:5 | c [element] | | array_flow.rb:1386:20:1386:20 | x | array_flow.rb:1387:14:1387:14 | x | -| array_flow.rb:1386:20:1386:20 | x | array_flow.rb:1387:14:1387:14 | x | -| array_flow.rb:1386:23:1386:23 | y | array_flow.rb:1388:14:1388:14 | y | | array_flow.rb:1386:23:1386:23 | y | array_flow.rb:1388:14:1388:14 | y | | array_flow.rb:1391:10:1391:10 | c [element] | array_flow.rb:1391:10:1391:13 | ...[...] | -| array_flow.rb:1391:10:1391:10 | c [element] | array_flow.rb:1391:10:1391:13 | ...[...] | -| array_flow.rb:1392:10:1392:10 | c [element] | array_flow.rb:1392:10:1392:13 | ...[...] | | array_flow.rb:1392:10:1392:10 | c [element] | array_flow.rb:1392:10:1392:13 | ...[...] | | array_flow.rb:1396:5:1396:5 | a [element 2] | array_flow.rb:1397:9:1397:9 | a [element 2] | -| array_flow.rb:1396:5:1396:5 | a [element 2] | array_flow.rb:1397:9:1397:9 | a [element 2] | -| array_flow.rb:1396:16:1396:26 | call to source | array_flow.rb:1396:5:1396:5 | a [element 2] | | array_flow.rb:1396:16:1396:26 | call to source | array_flow.rb:1396:5:1396:5 | a [element 2] | | array_flow.rb:1397:5:1397:5 | b [element] | array_flow.rb:1398:10:1398:10 | b [element] | -| array_flow.rb:1397:5:1397:5 | b [element] | array_flow.rb:1398:10:1398:10 | b [element] | -| array_flow.rb:1397:5:1397:5 | b [element] | array_flow.rb:1399:10:1399:10 | b [element] | | array_flow.rb:1397:5:1397:5 | b [element] | array_flow.rb:1399:10:1399:10 | b [element] | | array_flow.rb:1397:9:1397:9 | [post] a [element] | array_flow.rb:1400:10:1400:10 | a [element] | -| array_flow.rb:1397:9:1397:9 | [post] a [element] | array_flow.rb:1400:10:1400:10 | a [element] | -| array_flow.rb:1397:9:1397:9 | [post] a [element] | array_flow.rb:1401:10:1401:10 | a [element] | | array_flow.rb:1397:9:1397:9 | [post] a [element] | array_flow.rb:1401:10:1401:10 | a [element] | | array_flow.rb:1397:9:1397:9 | a [element 2] | array_flow.rb:1397:9:1397:9 | [post] a [element] | -| array_flow.rb:1397:9:1397:9 | a [element 2] | array_flow.rb:1397:9:1397:9 | [post] a [element] | -| array_flow.rb:1397:9:1397:9 | a [element 2] | array_flow.rb:1397:9:1397:15 | call to sort! [element] | | array_flow.rb:1397:9:1397:9 | a [element 2] | array_flow.rb:1397:9:1397:15 | call to sort! [element] | | array_flow.rb:1397:9:1397:15 | call to sort! [element] | array_flow.rb:1397:5:1397:5 | b [element] | -| array_flow.rb:1397:9:1397:15 | call to sort! [element] | array_flow.rb:1397:5:1397:5 | b [element] | -| array_flow.rb:1398:10:1398:10 | b [element] | array_flow.rb:1398:10:1398:13 | ...[...] | | array_flow.rb:1398:10:1398:10 | b [element] | array_flow.rb:1398:10:1398:13 | ...[...] | | array_flow.rb:1399:10:1399:10 | b [element] | array_flow.rb:1399:10:1399:13 | ...[...] | -| array_flow.rb:1399:10:1399:10 | b [element] | array_flow.rb:1399:10:1399:13 | ...[...] | -| array_flow.rb:1400:10:1400:10 | a [element] | array_flow.rb:1400:10:1400:13 | ...[...] | | array_flow.rb:1400:10:1400:10 | a [element] | array_flow.rb:1400:10:1400:13 | ...[...] | | array_flow.rb:1401:10:1401:10 | a [element] | array_flow.rb:1401:10:1401:13 | ...[...] | -| array_flow.rb:1401:10:1401:10 | a [element] | array_flow.rb:1401:10:1401:13 | ...[...] | -| array_flow.rb:1403:5:1403:5 | a [element 2] | array_flow.rb:1404:9:1404:9 | a [element 2] | | array_flow.rb:1403:5:1403:5 | a [element 2] | array_flow.rb:1404:9:1404:9 | a [element 2] | | array_flow.rb:1403:16:1403:26 | call to source | array_flow.rb:1403:5:1403:5 | a [element 2] | -| array_flow.rb:1403:16:1403:26 | call to source | array_flow.rb:1403:5:1403:5 | a [element 2] | -| array_flow.rb:1404:5:1404:5 | b [element] | array_flow.rb:1409:10:1409:10 | b [element] | | array_flow.rb:1404:5:1404:5 | b [element] | array_flow.rb:1409:10:1409:10 | b [element] | | array_flow.rb:1404:5:1404:5 | b [element] | array_flow.rb:1410:10:1410:10 | b [element] | -| array_flow.rb:1404:5:1404:5 | b [element] | array_flow.rb:1410:10:1410:10 | b [element] | -| array_flow.rb:1404:9:1404:9 | [post] a [element] | array_flow.rb:1411:10:1411:10 | a [element] | | array_flow.rb:1404:9:1404:9 | [post] a [element] | array_flow.rb:1411:10:1411:10 | a [element] | | array_flow.rb:1404:9:1404:9 | [post] a [element] | array_flow.rb:1412:10:1412:10 | a [element] | -| array_flow.rb:1404:9:1404:9 | [post] a [element] | array_flow.rb:1412:10:1412:10 | a [element] | -| array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:9:1404:9 | [post] a [element] | | array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:9:1404:9 | [post] a [element] | | array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:9:1408:7 | call to sort! [element] | -| array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:9:1408:7 | call to sort! [element] | -| array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:21:1404:21 | x | | array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:21:1404:21 | x | | array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:24:1404:24 | y | -| array_flow.rb:1404:9:1404:9 | a [element 2] | array_flow.rb:1404:24:1404:24 | y | -| array_flow.rb:1404:9:1408:7 | call to sort! [element] | array_flow.rb:1404:5:1404:5 | b [element] | | array_flow.rb:1404:9:1408:7 | call to sort! [element] | array_flow.rb:1404:5:1404:5 | b [element] | | array_flow.rb:1404:21:1404:21 | x | array_flow.rb:1405:14:1405:14 | x | -| array_flow.rb:1404:21:1404:21 | x | array_flow.rb:1405:14:1405:14 | x | -| array_flow.rb:1404:24:1404:24 | y | array_flow.rb:1406:14:1406:14 | y | | array_flow.rb:1404:24:1404:24 | y | array_flow.rb:1406:14:1406:14 | y | | array_flow.rb:1409:10:1409:10 | b [element] | array_flow.rb:1409:10:1409:13 | ...[...] | -| array_flow.rb:1409:10:1409:10 | b [element] | array_flow.rb:1409:10:1409:13 | ...[...] | -| 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 | a [element] | array_flow.rb:1411:10:1411:13 | ...[...] | -| array_flow.rb:1411:10:1411:10 | a [element] | array_flow.rb:1411:10:1411:13 | ...[...] | -| array_flow.rb:1412:10:1412:10 | a [element] | array_flow.rb:1412:10:1412:13 | ...[...] | | array_flow.rb:1412:10:1412:10 | a [element] | array_flow.rb:1412:10:1412:13 | ...[...] | | array_flow.rb:1416:5:1416:5 | a [element 2] | array_flow.rb:1417:9:1417:9 | a [element 2] | -| array_flow.rb:1416:5:1416:5 | a [element 2] | array_flow.rb:1417:9:1417:9 | a [element 2] | -| array_flow.rb:1416:16:1416:26 | call to source | array_flow.rb:1416:5:1416:5 | a [element 2] | | array_flow.rb:1416:16:1416:26 | call to source | array_flow.rb:1416:5:1416:5 | a [element 2] | | array_flow.rb:1417:5:1417:5 | b [element] | array_flow.rb:1421:10:1421:10 | b [element] | -| array_flow.rb:1417:5:1417:5 | b [element] | array_flow.rb:1421:10:1421:10 | b [element] | -| array_flow.rb:1417:5:1417:5 | b [element] | array_flow.rb:1422:10:1422:10 | b [element] | | array_flow.rb:1417:5:1417:5 | b [element] | array_flow.rb:1422:10:1422:10 | b [element] | | array_flow.rb:1417:9:1417:9 | a [element 2] | array_flow.rb:1417:9:1420:7 | call to sort_by [element] | -| array_flow.rb:1417:9:1417:9 | a [element 2] | array_flow.rb:1417:9:1420:7 | call to sort_by [element] | -| array_flow.rb:1417:9:1417:9 | a [element 2] | array_flow.rb:1417:23:1417:23 | x | | array_flow.rb:1417:9:1417:9 | a [element 2] | array_flow.rb:1417:23:1417:23 | x | | array_flow.rb:1417:9:1420:7 | call to sort_by [element] | array_flow.rb:1417:5:1417:5 | b [element] | -| array_flow.rb:1417:9:1420:7 | call to sort_by [element] | array_flow.rb:1417:5:1417:5 | b [element] | -| array_flow.rb:1417:23:1417:23 | x | array_flow.rb:1418:14:1418:14 | x | | array_flow.rb:1417:23:1417:23 | x | array_flow.rb:1418:14:1418:14 | x | | array_flow.rb:1421:10:1421:10 | b [element] | array_flow.rb:1421:10:1421:13 | ...[...] | -| array_flow.rb:1421:10:1421:10 | b [element] | array_flow.rb:1421:10:1421:13 | ...[...] | -| array_flow.rb:1422:10:1422:10 | b [element] | array_flow.rb:1422:10:1422:13 | ...[...] | | array_flow.rb:1422:10:1422:10 | b [element] | array_flow.rb:1422:10:1422:13 | ...[...] | | array_flow.rb:1426:5:1426:5 | a [element 2] | array_flow.rb:1427:9:1427:9 | a [element 2] | -| array_flow.rb:1426:5:1426:5 | a [element 2] | array_flow.rb:1427:9:1427:9 | a [element 2] | -| array_flow.rb:1426:16:1426:26 | call to source | array_flow.rb:1426:5:1426:5 | a [element 2] | | array_flow.rb:1426:16:1426:26 | call to source | array_flow.rb:1426:5:1426:5 | a [element 2] | | array_flow.rb:1427:5:1427:5 | b [element] | array_flow.rb:1433:10:1433:10 | b [element] | -| array_flow.rb:1427:5:1427:5 | b [element] | array_flow.rb:1433:10:1433:10 | b [element] | -| array_flow.rb:1427:5:1427:5 | b [element] | array_flow.rb:1434:10:1434:10 | b [element] | | array_flow.rb:1427:5:1427:5 | b [element] | array_flow.rb:1434:10:1434:10 | b [element] | | array_flow.rb:1427:9:1427:9 | [post] a [element] | array_flow.rb:1431:10:1431:10 | a [element] | -| array_flow.rb:1427:9:1427:9 | [post] a [element] | array_flow.rb:1431:10:1431:10 | a [element] | -| array_flow.rb:1427:9:1427:9 | [post] a [element] | array_flow.rb:1432:10:1432:10 | a [element] | | array_flow.rb:1427:9:1427:9 | [post] a [element] | array_flow.rb:1432:10:1432:10 | a [element] | | array_flow.rb:1427:9:1427:9 | a [element 2] | array_flow.rb:1427:9:1427:9 | [post] a [element] | -| array_flow.rb:1427:9:1427:9 | a [element 2] | array_flow.rb:1427:9:1427:9 | [post] a [element] | -| array_flow.rb:1427:9:1427:9 | a [element 2] | array_flow.rb:1427:9:1430:7 | call to sort_by! [element] | | array_flow.rb:1427:9:1427:9 | a [element 2] | array_flow.rb:1427:9:1430:7 | call to sort_by! [element] | | array_flow.rb:1427:9:1427:9 | a [element 2] | array_flow.rb:1427:24:1427:24 | x | -| array_flow.rb:1427:9:1427:9 | a [element 2] | array_flow.rb:1427:24:1427:24 | x | -| array_flow.rb:1427:9:1430:7 | call to sort_by! [element] | array_flow.rb:1427:5:1427:5 | b [element] | | array_flow.rb:1427:9:1430:7 | call to sort_by! [element] | array_flow.rb:1427:5:1427:5 | b [element] | | array_flow.rb:1427:24:1427:24 | x | array_flow.rb:1428:14:1428:14 | x | -| array_flow.rb:1427:24:1427:24 | x | array_flow.rb:1428:14:1428:14 | x | -| array_flow.rb:1431:10:1431:10 | a [element] | array_flow.rb:1431:10:1431:13 | ...[...] | | array_flow.rb:1431:10:1431:10 | a [element] | array_flow.rb:1431:10:1431:13 | ...[...] | | array_flow.rb:1432:10:1432:10 | a [element] | array_flow.rb:1432:10:1432:13 | ...[...] | -| array_flow.rb:1432:10:1432:10 | a [element] | array_flow.rb:1432:10:1432:13 | ...[...] | -| array_flow.rb:1433:10:1433:10 | b [element] | array_flow.rb:1433:10:1433:13 | ...[...] | | array_flow.rb:1433:10:1433:10 | b [element] | array_flow.rb:1433:10:1433:13 | ...[...] | | array_flow.rb:1434:10:1434:10 | b [element] | array_flow.rb:1434:10:1434:13 | ...[...] | -| array_flow.rb:1434:10:1434:10 | b [element] | array_flow.rb:1434:10:1434:13 | ...[...] | -| array_flow.rb:1438:5:1438:5 | a [element 2] | array_flow.rb:1439:9:1439:9 | a [element 2] | | array_flow.rb:1438:5:1438:5 | a [element 2] | array_flow.rb:1439:9:1439:9 | a [element 2] | | array_flow.rb:1438:16:1438:26 | call to source | array_flow.rb:1438:5:1438:5 | a [element 2] | -| array_flow.rb:1438:16:1438:26 | call to source | array_flow.rb:1438:5:1438:5 | a [element 2] | -| array_flow.rb:1439:9:1439:9 | a [element 2] | array_flow.rb:1439:19:1439:19 | x | | array_flow.rb:1439:9:1439:9 | a [element 2] | array_flow.rb:1439:19:1439:19 | x | | array_flow.rb:1439:19:1439:19 | x | array_flow.rb:1440:14:1440:14 | x | -| array_flow.rb:1439:19:1439:19 | x | array_flow.rb:1440:14:1440:14 | x | -| array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1447:9:1447:9 | a [element 2] | | array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1447:9:1447:9 | a [element 2] | | array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1452:9:1452:9 | a [element 2] | -| array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1452:9:1452:9 | a [element 2] | -| array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1458:9:1458:9 | a [element 2] | | array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1458:9:1458:9 | a [element 2] | | array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1465:9:1465:9 | a [element 2] | -| array_flow.rb:1446:5:1446:5 | a [element 2] | array_flow.rb:1465:9:1465:9 | a [element 2] | -| array_flow.rb:1446:5:1446:5 | a [element 3] | array_flow.rb:1447:9:1447:9 | a [element 3] | | array_flow.rb:1446:5:1446:5 | a [element 3] | array_flow.rb:1447:9:1447:9 | a [element 3] | | array_flow.rb:1446:5:1446:5 | a [element 3] | array_flow.rb:1458:9:1458:9 | a [element 3] | -| array_flow.rb:1446:5:1446:5 | a [element 3] | array_flow.rb:1458:9:1458:9 | a [element 3] | -| array_flow.rb:1446:16:1446:28 | call to source | array_flow.rb:1446:5:1446:5 | a [element 2] | | array_flow.rb:1446:16:1446:28 | call to source | array_flow.rb:1446:5:1446:5 | a [element 2] | | array_flow.rb:1446:31:1446:43 | call to source | array_flow.rb:1446:5:1446:5 | a [element 3] | -| array_flow.rb:1446:31:1446:43 | call to source | array_flow.rb:1446:5:1446:5 | a [element 3] | -| 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 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:9:1447:9 | a [element 2] | array_flow.rb:1447:9:1447:17 | call to take [element 2] | | array_flow.rb:1447:9:1447:9 | a [element 2] | array_flow.rb:1447:9:1447:17 | call to take [element 2] | | array_flow.rb:1447:9:1447:9 | a [element 3] | array_flow.rb:1447:9:1447:17 | call to take [element 3] | -| array_flow.rb:1447:9:1447:9 | a [element 3] | array_flow.rb:1447:9:1447:17 | call to take [element 3] | -| array_flow.rb:1447:9:1447:17 | call to take [element 2] | array_flow.rb:1447:5:1447:5 | b [element 2] | | array_flow.rb:1447:9:1447:17 | call to take [element 2] | array_flow.rb:1447:5:1447:5 | b [element 2] | | array_flow.rb:1447:9:1447:17 | call to take [element 3] | array_flow.rb:1447:5:1447:5 | b [element 3] | -| array_flow.rb:1447:9:1447:17 | call to take [element 3] | array_flow.rb:1447:5:1447:5 | b [element 3] | -| array_flow.rb:1450:10:1450:10 | b [element 2] | array_flow.rb:1450:10:1450:13 | ...[...] | | array_flow.rb:1450:10:1450:10 | b [element 2] | array_flow.rb:1450:10:1450:13 | ...[...] | | array_flow.rb:1451:10:1451:10 | b [element 3] | array_flow.rb:1451:10:1451:13 | ...[...] | -| array_flow.rb:1451:10:1451:10 | b [element 3] | array_flow.rb:1451:10:1451:13 | ...[...] | -| array_flow.rb:1452:5:1452:5 | b [element 2] | array_flow.rb:1455:10:1455:10 | b [element 2] | | array_flow.rb:1452:5:1452:5 | b [element 2] | array_flow.rb:1455:10:1455:10 | b [element 2] | | array_flow.rb:1452:5:1452:5 | b [element 2] | array_flow.rb:1457:10:1457:10 | b [element 2] | -| array_flow.rb:1452:5:1452:5 | b [element 2] | array_flow.rb:1457:10:1457:10 | b [element 2] | -| array_flow.rb:1452:9:1452:9 | a [element 2] | array_flow.rb:1452:9:1452:17 | call to take [element 2] | | array_flow.rb:1452:9:1452:9 | a [element 2] | array_flow.rb:1452:9:1452:17 | call to take [element 2] | | array_flow.rb:1452:9:1452:17 | call to take [element 2] | array_flow.rb:1452:5:1452:5 | b [element 2] | -| array_flow.rb:1452:9:1452:17 | call to take [element 2] | array_flow.rb:1452:5:1452:5 | b [element 2] | -| 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:1457:10:1457:10 | b [element 2] | array_flow.rb:1457:10:1457:13 | ...[...] | -| array_flow.rb:1457:10:1457:10 | b [element 2] | array_flow.rb:1457:10:1457:13 | ...[...] | -| array_flow.rb:1458:5:1458:5 | b [element 2] | array_flow.rb:1461:10:1461:10 | b [element 2] | | array_flow.rb:1458:5:1458:5 | b [element 2] | array_flow.rb:1461:10:1461:10 | b [element 2] | | array_flow.rb:1458:5:1458:5 | b [element 2] | array_flow.rb:1463:10:1463:10 | b [element 2] | -| array_flow.rb:1458:5:1458:5 | b [element 2] | array_flow.rb:1463:10:1463:10 | b [element 2] | -| array_flow.rb:1458:5:1458:5 | b [element 3] | array_flow.rb:1462:10:1462:10 | b [element 3] | | array_flow.rb:1458:5:1458:5 | b [element 3] | array_flow.rb:1462:10:1462:10 | b [element 3] | | array_flow.rb:1458:5:1458:5 | b [element 3] | array_flow.rb:1463:10:1463:10 | b [element 3] | -| array_flow.rb:1458:5:1458:5 | b [element 3] | array_flow.rb:1463:10:1463:10 | b [element 3] | -| array_flow.rb:1458:9:1458:9 | a [element 2] | array_flow.rb:1458:9:1458:19 | call to take [element 2] | | array_flow.rb:1458:9:1458:9 | a [element 2] | array_flow.rb:1458:9:1458:19 | call to take [element 2] | | array_flow.rb:1458:9:1458:9 | a [element 3] | array_flow.rb:1458:9:1458:19 | call to take [element 3] | -| array_flow.rb:1458:9:1458:9 | a [element 3] | array_flow.rb:1458:9:1458:19 | call to take [element 3] | -| array_flow.rb:1458:9:1458:19 | call to take [element 2] | array_flow.rb:1458:5:1458:5 | b [element 2] | | array_flow.rb:1458:9:1458:19 | call to take [element 2] | array_flow.rb:1458:5:1458:5 | b [element 2] | | array_flow.rb:1458:9:1458:19 | call to take [element 3] | array_flow.rb:1458:5:1458:5 | b [element 3] | -| array_flow.rb:1458:9:1458:19 | call to take [element 3] | array_flow.rb:1458:5:1458:5 | b [element 3] | -| array_flow.rb:1461:10:1461:10 | b [element 2] | array_flow.rb:1461:10:1461:13 | ...[...] | | array_flow.rb:1461:10:1461:10 | b [element 2] | array_flow.rb:1461:10:1461:13 | ...[...] | | array_flow.rb:1462:10:1462:10 | b [element 3] | array_flow.rb:1462:10:1462:13 | ...[...] | -| array_flow.rb:1462:10:1462:10 | b [element 3] | array_flow.rb:1462:10:1462:13 | ...[...] | -| array_flow.rb:1463:10:1463:10 | b [element 2] | array_flow.rb:1463:10:1463:13 | ...[...] | | array_flow.rb:1463:10:1463:10 | b [element 2] | array_flow.rb:1463:10:1463:13 | ...[...] | | array_flow.rb:1463:10:1463:10 | b [element 3] | array_flow.rb:1463:10:1463:13 | ...[...] | -| array_flow.rb:1463:10:1463:10 | b [element 3] | array_flow.rb:1463:10:1463:13 | ...[...] | -| array_flow.rb:1464:5:1464:5 | [post] a [element] | array_flow.rb:1465:9:1465:9 | a [element] | | array_flow.rb:1464:5:1464:5 | [post] a [element] | array_flow.rb:1465:9:1465:9 | a [element] | | array_flow.rb:1464:12:1464:24 | call to source | array_flow.rb:1464:5:1464:5 | [post] a [element] | -| array_flow.rb:1464:12:1464:24 | call to source | array_flow.rb:1464:5:1464:5 | [post] a [element] | -| array_flow.rb:1465:5:1465:5 | b [element 2] | array_flow.rb:1466:10:1466:10 | b [element 2] | | array_flow.rb:1465:5:1465:5 | b [element 2] | array_flow.rb:1466:10:1466:10 | b [element 2] | | array_flow.rb:1465:5:1465:5 | b [element] | array_flow.rb:1466:10:1466:10 | b [element] | -| array_flow.rb:1465:5:1465:5 | b [element] | array_flow.rb:1466:10:1466:10 | b [element] | -| array_flow.rb:1465:9:1465:9 | a [element 2] | array_flow.rb:1465:9:1465:17 | call to take [element 2] | | array_flow.rb:1465:9:1465:9 | a [element 2] | array_flow.rb:1465:9:1465:17 | call to take [element 2] | | array_flow.rb:1465:9:1465:9 | a [element] | array_flow.rb:1465:9:1465:17 | call to take [element] | -| array_flow.rb:1465:9:1465:9 | a [element] | array_flow.rb:1465:9:1465:17 | call to take [element] | -| array_flow.rb:1465:9:1465:17 | call to take [element 2] | array_flow.rb:1465:5:1465:5 | b [element 2] | | array_flow.rb:1465:9:1465:17 | call to take [element 2] | array_flow.rb:1465:5:1465:5 | b [element 2] | | array_flow.rb:1465:9:1465:17 | call to take [element] | array_flow.rb:1465:5:1465:5 | b [element] | -| array_flow.rb:1465:9:1465:17 | call to take [element] | array_flow.rb:1465:5:1465:5 | b [element] | -| 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:1466:10:1466:10 | b [element] | array_flow.rb:1466:10:1466:13 | ...[...] | -| array_flow.rb:1466:10:1466:10 | b [element] | array_flow.rb:1466:10:1466:13 | ...[...] | -| array_flow.rb:1470:5:1470:5 | a [element 2] | array_flow.rb:1471:9:1471:9 | a [element 2] | | array_flow.rb:1470:5:1470:5 | a [element 2] | array_flow.rb:1471:9:1471:9 | a [element 2] | | array_flow.rb:1470:16:1470:26 | call to source | array_flow.rb:1470:5:1470:5 | a [element 2] | -| array_flow.rb:1470:16:1470:26 | call to source | array_flow.rb:1470:5:1470:5 | a [element 2] | -| array_flow.rb:1471:5:1471:5 | b [element 2] | array_flow.rb:1477:10:1477:10 | b [element 2] | | array_flow.rb:1471:5:1471:5 | b [element 2] | array_flow.rb:1477:10:1477:10 | b [element 2] | | array_flow.rb:1471:9:1471:9 | a [element 2] | array_flow.rb:1471:9:1474:7 | call to take_while [element 2] | -| array_flow.rb:1471:9:1471:9 | a [element 2] | array_flow.rb:1471:9:1474:7 | call to take_while [element 2] | -| array_flow.rb:1471:9:1471:9 | a [element 2] | array_flow.rb:1471:26:1471:26 | x | | array_flow.rb:1471:9:1471:9 | a [element 2] | array_flow.rb:1471:26:1471:26 | x | | array_flow.rb:1471:9:1474:7 | call to take_while [element 2] | array_flow.rb:1471:5:1471:5 | b [element 2] | -| array_flow.rb:1471:9:1474:7 | call to take_while [element 2] | array_flow.rb:1471:5:1471:5 | b [element 2] | -| array_flow.rb:1471:26:1471:26 | x | array_flow.rb:1472:14:1472:14 | x | | array_flow.rb:1471:26:1471:26 | x | array_flow.rb:1472:14:1472:14 | x | | array_flow.rb:1477:10:1477:10 | b [element 2] | array_flow.rb:1477:10:1477:13 | ...[...] | -| array_flow.rb:1477:10:1477:10 | b [element 2] | array_flow.rb:1477:10:1477:13 | ...[...] | -| array_flow.rb:1483:5:1483:5 | a [element 3] | array_flow.rb:1484:9:1484:9 | a [element 3] | | array_flow.rb:1483:5:1483:5 | a [element 3] | array_flow.rb:1484:9:1484:9 | a [element 3] | | array_flow.rb:1483:19:1483:29 | call to source | array_flow.rb:1483:5:1483:5 | a [element 3] | -| array_flow.rb:1483:19:1483:29 | call to source | array_flow.rb:1483:5:1483:5 | a [element 3] | -| array_flow.rb:1484:5:1484:5 | b [element 3] | array_flow.rb:1485:10:1485:10 | b [element 3] | | array_flow.rb:1484:5:1484:5 | b [element 3] | array_flow.rb:1485:10:1485:10 | b [element 3] | | array_flow.rb:1484:9:1484:9 | a [element 3] | array_flow.rb:1484:9:1484:14 | call to to_a [element 3] | -| array_flow.rb:1484:9:1484:9 | a [element 3] | array_flow.rb:1484:9:1484:14 | call to to_a [element 3] | -| array_flow.rb:1484:9:1484:14 | call to to_a [element 3] | array_flow.rb:1484:5:1484:5 | b [element 3] | | array_flow.rb:1484:9:1484:14 | call to to_a [element 3] | array_flow.rb:1484:5:1484:5 | b [element 3] | | array_flow.rb:1485:10:1485:10 | b [element 3] | array_flow.rb:1485:10:1485:13 | ...[...] | -| array_flow.rb:1485:10:1485:10 | b [element 3] | array_flow.rb:1485:10:1485:13 | ...[...] | -| array_flow.rb:1489:5:1489:5 | a [element 2] | array_flow.rb:1490:9:1490:9 | a [element 2] | | array_flow.rb:1489:5:1489:5 | a [element 2] | array_flow.rb:1490:9:1490:9 | a [element 2] | | array_flow.rb:1489:16:1489:26 | call to source | array_flow.rb:1489:5:1489:5 | a [element 2] | -| array_flow.rb:1489:16:1489:26 | call to source | array_flow.rb:1489:5:1489:5 | a [element 2] | -| array_flow.rb:1490:5:1490:5 | b [element 2] | array_flow.rb:1493:10:1493:10 | b [element 2] | | array_flow.rb:1490:5:1490:5 | b [element 2] | array_flow.rb:1493:10:1493:10 | b [element 2] | | array_flow.rb:1490:9:1490:9 | a [element 2] | array_flow.rb:1490:9:1490:16 | call to to_ary [element 2] | -| array_flow.rb:1490:9:1490:9 | a [element 2] | array_flow.rb:1490:9:1490:16 | call to to_ary [element 2] | -| array_flow.rb:1490:9:1490:16 | call to to_ary [element 2] | array_flow.rb:1490:5:1490:5 | b [element 2] | | array_flow.rb:1490:9:1490:16 | call to to_ary [element 2] | array_flow.rb:1490:5:1490:5 | b [element 2] | | array_flow.rb:1493:10:1493:10 | b [element 2] | array_flow.rb:1493:10:1493:13 | ...[...] | -| array_flow.rb:1493:10:1493:10 | b [element 2] | array_flow.rb:1493:10:1493:13 | ...[...] | -| array_flow.rb:1506:5:1506:5 | a [element 0, element 1] | array_flow.rb:1507:9:1507:9 | a [element 0, element 1] | | array_flow.rb:1506:5:1506:5 | a [element 0, element 1] | array_flow.rb:1507:9:1507:9 | a [element 0, element 1] | | array_flow.rb:1506:5:1506:5 | a [element 1, element 1] | array_flow.rb:1507:9:1507:9 | a [element 1, element 1] | -| array_flow.rb:1506:5:1506:5 | a [element 1, element 1] | array_flow.rb:1507:9:1507:9 | a [element 1, element 1] | -| array_flow.rb:1506:5:1506:5 | a [element 2, element 1] | array_flow.rb:1507:9:1507:9 | a [element 2, element 1] | | array_flow.rb:1506:5:1506:5 | a [element 2, element 1] | array_flow.rb:1507:9:1507:9 | a [element 2, element 1] | | array_flow.rb:1506:14:1506:26 | call to source | array_flow.rb:1506:5:1506:5 | a [element 0, element 1] | -| array_flow.rb:1506:14:1506:26 | call to source | array_flow.rb:1506:5:1506:5 | a [element 0, element 1] | -| array_flow.rb:1506:34:1506:46 | call to source | array_flow.rb:1506:5:1506:5 | a [element 1, element 1] | | array_flow.rb:1506:34:1506:46 | call to source | array_flow.rb:1506:5:1506:5 | a [element 1, element 1] | | array_flow.rb:1506:54:1506:66 | call to source | array_flow.rb:1506:5:1506:5 | a [element 2, element 1] | -| array_flow.rb:1506:54:1506:66 | call to source | array_flow.rb:1506:5:1506:5 | a [element 2, element 1] | -| array_flow.rb:1507:5:1507:5 | b [element 1, element 0] | array_flow.rb:1511:10:1511:10 | b [element 1, element 0] | | array_flow.rb:1507:5:1507:5 | b [element 1, element 0] | array_flow.rb:1511:10:1511:10 | b [element 1, element 0] | | array_flow.rb:1507:5:1507:5 | b [element 1, element 1] | array_flow.rb:1512:10:1512:10 | b [element 1, element 1] | -| array_flow.rb:1507:5:1507:5 | b [element 1, element 1] | array_flow.rb:1512:10:1512:10 | b [element 1, element 1] | -| array_flow.rb:1507:5:1507:5 | b [element 1, element 2] | array_flow.rb:1513:10:1513:10 | b [element 1, element 2] | | array_flow.rb:1507:5:1507:5 | b [element 1, element 2] | array_flow.rb:1513:10:1513:10 | b [element 1, element 2] | | array_flow.rb:1507:9:1507:9 | a [element 0, element 1] | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 0] | -| array_flow.rb:1507:9:1507:9 | a [element 0, element 1] | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 0] | -| array_flow.rb:1507:9:1507:9 | a [element 1, element 1] | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 1] | | array_flow.rb:1507:9:1507:9 | a [element 1, element 1] | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 1] | | array_flow.rb:1507:9:1507:9 | a [element 2, element 1] | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 2] | -| array_flow.rb:1507:9:1507:9 | a [element 2, element 1] | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 2] | -| array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 0] | array_flow.rb:1507:5:1507:5 | b [element 1, element 0] | | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 0] | array_flow.rb:1507:5:1507:5 | b [element 1, element 0] | | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 1] | array_flow.rb:1507:5:1507:5 | b [element 1, element 1] | -| array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 1] | array_flow.rb:1507:5:1507:5 | b [element 1, element 1] | -| array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 2] | array_flow.rb:1507:5:1507:5 | b [element 1, element 2] | | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 2] | array_flow.rb:1507:5:1507:5 | b [element 1, element 2] | | array_flow.rb:1511:10:1511:10 | b [element 1, element 0] | array_flow.rb:1511:10:1511:13 | ...[...] [element 0] | -| array_flow.rb:1511:10:1511:10 | b [element 1, element 0] | array_flow.rb:1511:10:1511:13 | ...[...] [element 0] | -| array_flow.rb:1511:10:1511:13 | ...[...] [element 0] | array_flow.rb:1511:10:1511:16 | ...[...] | | array_flow.rb:1511:10:1511:13 | ...[...] [element 0] | array_flow.rb:1511:10:1511:16 | ...[...] | | array_flow.rb:1512:10:1512:10 | b [element 1, element 1] | array_flow.rb:1512:10:1512:13 | ...[...] [element 1] | -| array_flow.rb:1512:10:1512:10 | b [element 1, element 1] | array_flow.rb:1512:10:1512:13 | ...[...] [element 1] | -| array_flow.rb:1512:10:1512:13 | ...[...] [element 1] | array_flow.rb:1512:10:1512:16 | ...[...] | | array_flow.rb:1512:10:1512:13 | ...[...] [element 1] | array_flow.rb:1512:10:1512:16 | ...[...] | | array_flow.rb:1513:10:1513:10 | b [element 1, element 2] | array_flow.rb:1513:10:1513:13 | ...[...] [element 2] | -| array_flow.rb:1513:10:1513:10 | b [element 1, element 2] | array_flow.rb:1513:10:1513:13 | ...[...] [element 2] | -| array_flow.rb:1513:10:1513:13 | ...[...] [element 2] | array_flow.rb:1513:10:1513:16 | ...[...] | | array_flow.rb:1513:10:1513:13 | ...[...] [element 2] | array_flow.rb:1513:10:1513:16 | ...[...] | | array_flow.rb:1517:5:1517:5 | a [element 2] | array_flow.rb:1520:9:1520:9 | a [element 2] | -| array_flow.rb:1517:5:1517:5 | a [element 2] | array_flow.rb:1520:9:1520:9 | a [element 2] | -| array_flow.rb:1517:16:1517:28 | call to source | array_flow.rb:1517:5:1517:5 | a [element 2] | | array_flow.rb:1517:16:1517:28 | call to source | array_flow.rb:1517:5:1517:5 | a [element 2] | | array_flow.rb:1518:5:1518:5 | b [element 1] | array_flow.rb:1520:17:1520:17 | b [element 1] | -| array_flow.rb:1518:5:1518:5 | b [element 1] | array_flow.rb:1520:17:1520:17 | b [element 1] | -| array_flow.rb:1518:13:1518:25 | call to source | array_flow.rb:1518:5:1518:5 | b [element 1] | | array_flow.rb:1518:13:1518:25 | call to source | array_flow.rb:1518:5:1518:5 | b [element 1] | | array_flow.rb:1519:5:1519:5 | c [element 1] | array_flow.rb:1520:20:1520:20 | c [element 1] | -| array_flow.rb:1519:5:1519:5 | c [element 1] | array_flow.rb:1520:20:1520:20 | c [element 1] | -| array_flow.rb:1519:13:1519:25 | call to source | array_flow.rb:1519:5:1519:5 | c [element 1] | | array_flow.rb:1519:13:1519:25 | call to source | array_flow.rb:1519:5:1519:5 | c [element 1] | | array_flow.rb:1520:5:1520:5 | d [element] | array_flow.rb:1521:10:1521:10 | d [element] | -| array_flow.rb:1520:5:1520:5 | d [element] | array_flow.rb:1521:10:1521:10 | d [element] | -| array_flow.rb:1520:5:1520:5 | d [element] | array_flow.rb:1522:10:1522:10 | d [element] | | array_flow.rb:1520:5:1520:5 | d [element] | array_flow.rb:1522:10:1522:10 | d [element] | | array_flow.rb:1520:5:1520:5 | d [element] | array_flow.rb:1523:10:1523:10 | d [element] | -| array_flow.rb:1520:5:1520:5 | d [element] | array_flow.rb:1523:10:1523:10 | d [element] | -| array_flow.rb:1520:9:1520:9 | a [element 2] | array_flow.rb:1520:9:1520:21 | call to union [element] | | array_flow.rb:1520:9:1520:9 | a [element 2] | array_flow.rb:1520:9:1520:21 | call to union [element] | | array_flow.rb:1520:9:1520:21 | call to union [element] | array_flow.rb:1520:5:1520:5 | d [element] | -| array_flow.rb:1520:9:1520:21 | call to union [element] | array_flow.rb:1520:5:1520:5 | d [element] | -| array_flow.rb:1520:17:1520:17 | b [element 1] | array_flow.rb:1520:9:1520:21 | call to union [element] | | array_flow.rb:1520:17:1520:17 | b [element 1] | array_flow.rb:1520:9:1520:21 | call to union [element] | | array_flow.rb:1520:20:1520:20 | c [element 1] | array_flow.rb:1520:9:1520:21 | call to union [element] | -| array_flow.rb:1520:20:1520:20 | c [element 1] | array_flow.rb:1520:9:1520:21 | call to union [element] | -| array_flow.rb:1521:10:1521:10 | d [element] | array_flow.rb:1521:10:1521:13 | ...[...] | | array_flow.rb:1521:10:1521:10 | d [element] | array_flow.rb:1521:10:1521:13 | ...[...] | | array_flow.rb:1522:10:1522:10 | d [element] | array_flow.rb:1522:10:1522:13 | ...[...] | -| array_flow.rb:1522:10:1522:10 | d [element] | array_flow.rb:1522:10:1522:13 | ...[...] | -| array_flow.rb:1523:10:1523:10 | d [element] | array_flow.rb:1523:10:1523:13 | ...[...] | | array_flow.rb:1523:10:1523:10 | d [element] | array_flow.rb:1523:10:1523:13 | ...[...] | | array_flow.rb:1527:5:1527:5 | a [element 3] | array_flow.rb:1529:9:1529:9 | a [element 3] | -| array_flow.rb:1527:5:1527:5 | a [element 3] | array_flow.rb:1529:9:1529:9 | a [element 3] | -| array_flow.rb:1527:5:1527:5 | a [element 3] | array_flow.rb:1533:9:1533:9 | a [element 3] | | array_flow.rb:1527:5:1527:5 | a [element 3] | array_flow.rb:1533:9:1533:9 | a [element 3] | | array_flow.rb:1527:5:1527:5 | a [element 4] | array_flow.rb:1529:9:1529:9 | a [element 4] | -| array_flow.rb:1527:5:1527:5 | a [element 4] | array_flow.rb:1529:9:1529:9 | a [element 4] | -| array_flow.rb:1527:5:1527:5 | a [element 4] | array_flow.rb:1533:9:1533:9 | a [element 4] | | array_flow.rb:1527:5:1527:5 | a [element 4] | array_flow.rb:1533:9:1533:9 | a [element 4] | | array_flow.rb:1527:19:1527:31 | call to source | array_flow.rb:1527:5:1527:5 | a [element 3] | -| array_flow.rb:1527:19:1527:31 | call to source | array_flow.rb:1527:5:1527:5 | a [element 3] | -| array_flow.rb:1527:34:1527:46 | call to source | array_flow.rb:1527:5:1527:5 | a [element 4] | | array_flow.rb:1527:34:1527:46 | call to source | array_flow.rb:1527:5:1527:5 | a [element 4] | | array_flow.rb:1529:5:1529:5 | b [element] | array_flow.rb:1530:10:1530:10 | b [element] | -| array_flow.rb:1529:5:1529:5 | b [element] | array_flow.rb:1530:10:1530:10 | b [element] | -| array_flow.rb:1529:5:1529:5 | b [element] | array_flow.rb:1531:10:1531:10 | b [element] | | array_flow.rb:1529:5:1529:5 | b [element] | array_flow.rb:1531:10:1531:10 | b [element] | | array_flow.rb:1529:9:1529:9 | a [element 3] | array_flow.rb:1529:9:1529:14 | call to uniq [element] | -| array_flow.rb:1529:9:1529:9 | a [element 3] | array_flow.rb:1529:9:1529:14 | call to uniq [element] | -| array_flow.rb:1529:9:1529:9 | a [element 4] | array_flow.rb:1529:9:1529:14 | call to uniq [element] | | array_flow.rb:1529:9:1529:9 | a [element 4] | array_flow.rb:1529:9:1529:14 | call to uniq [element] | | array_flow.rb:1529:9:1529:14 | call to uniq [element] | array_flow.rb:1529:5:1529:5 | b [element] | -| array_flow.rb:1529:9:1529:14 | call to uniq [element] | array_flow.rb:1529:5:1529:5 | b [element] | -| array_flow.rb:1530:10:1530:10 | b [element] | array_flow.rb:1530:10:1530:13 | ...[...] | | array_flow.rb:1530:10:1530:10 | b [element] | array_flow.rb:1530:10:1530:13 | ...[...] | | array_flow.rb:1531:10:1531:10 | b [element] | array_flow.rb:1531:10:1531:13 | ...[...] | -| array_flow.rb:1531:10:1531:10 | b [element] | array_flow.rb:1531:10:1531:13 | ...[...] | -| array_flow.rb:1533:5:1533:5 | c [element] | array_flow.rb:1537:10:1537:10 | c [element] | | array_flow.rb:1533:5:1533:5 | c [element] | array_flow.rb:1537:10:1537:10 | c [element] | | array_flow.rb:1533:9:1533:9 | a [element 3] | array_flow.rb:1533:9:1536:7 | call to uniq [element] | -| array_flow.rb:1533:9:1533:9 | a [element 3] | array_flow.rb:1533:9:1536:7 | call to uniq [element] | -| array_flow.rb:1533:9:1533:9 | a [element 3] | array_flow.rb:1533:20:1533:20 | x | | array_flow.rb:1533:9:1533:9 | a [element 3] | array_flow.rb:1533:20:1533:20 | x | | array_flow.rb:1533:9:1533:9 | a [element 4] | array_flow.rb:1533:9:1536:7 | call to uniq [element] | -| array_flow.rb:1533:9:1533:9 | a [element 4] | array_flow.rb:1533:9:1536:7 | call to uniq [element] | -| array_flow.rb:1533:9:1533:9 | a [element 4] | array_flow.rb:1533:20:1533:20 | x | | array_flow.rb:1533:9:1533:9 | a [element 4] | array_flow.rb:1533:20:1533:20 | x | | array_flow.rb:1533:9:1536:7 | call to uniq [element] | array_flow.rb:1533:5:1533:5 | c [element] | -| array_flow.rb:1533:9:1536:7 | call to uniq [element] | array_flow.rb:1533:5:1533:5 | c [element] | -| array_flow.rb:1533:20:1533:20 | x | array_flow.rb:1534:14:1534:14 | x | | array_flow.rb:1533:20:1533:20 | x | array_flow.rb:1534:14:1534:14 | x | | array_flow.rb:1537:10:1537:10 | c [element] | array_flow.rb:1537:10:1537:13 | ...[...] | -| array_flow.rb:1537:10:1537:10 | c [element] | array_flow.rb:1537:10:1537:13 | ...[...] | -| array_flow.rb:1541:5:1541:5 | a [element 2] | array_flow.rb:1542:9:1542:9 | a [element 2] | | array_flow.rb:1541:5:1541:5 | a [element 2] | array_flow.rb:1542:9:1542:9 | a [element 2] | | array_flow.rb:1541:5:1541:5 | a [element 3] | array_flow.rb:1542:9:1542:9 | a [element 3] | -| array_flow.rb:1541:5:1541:5 | a [element 3] | array_flow.rb:1542:9:1542:9 | a [element 3] | -| array_flow.rb:1541:16:1541:28 | call to source | array_flow.rb:1541:5:1541:5 | a [element 2] | | array_flow.rb:1541:16:1541:28 | call to source | array_flow.rb:1541:5:1541:5 | a [element 2] | | array_flow.rb:1541:31:1541:43 | call to source | array_flow.rb:1541:5:1541:5 | a [element 3] | -| array_flow.rb:1541:31:1541:43 | call to source | array_flow.rb:1541:5:1541:5 | a [element 3] | -| array_flow.rb:1542:5:1542:5 | b [element] | array_flow.rb:1543:10:1543:10 | b [element] | | array_flow.rb:1542:5:1542:5 | b [element] | array_flow.rb:1543:10:1543:10 | b [element] | | array_flow.rb:1542:5:1542:5 | b [element] | array_flow.rb:1544:10:1544:10 | b [element] | -| array_flow.rb:1542:5:1542:5 | b [element] | array_flow.rb:1544:10:1544:10 | b [element] | -| array_flow.rb:1542:9:1542:9 | [post] a [element] | array_flow.rb:1545:10:1545:10 | a [element] | | array_flow.rb:1542:9:1542:9 | [post] a [element] | array_flow.rb:1545:10:1545:10 | a [element] | | array_flow.rb:1542:9:1542:9 | [post] a [element] | array_flow.rb:1546:10:1546:10 | a [element] | -| array_flow.rb:1542:9:1542:9 | [post] a [element] | array_flow.rb:1546:10:1546:10 | a [element] | -| array_flow.rb:1542:9:1542:9 | a [element 2] | array_flow.rb:1542:9:1542:9 | [post] a [element] | | array_flow.rb:1542:9:1542:9 | a [element 2] | array_flow.rb:1542:9:1542:9 | [post] a [element] | | array_flow.rb:1542:9:1542:9 | a [element 2] | array_flow.rb:1542:9:1542:15 | call to uniq! [element] | -| array_flow.rb:1542:9:1542:9 | a [element 2] | array_flow.rb:1542:9:1542:15 | call to uniq! [element] | -| array_flow.rb:1542:9:1542:9 | a [element 3] | array_flow.rb:1542:9:1542:9 | [post] a [element] | | array_flow.rb:1542:9:1542:9 | a [element 3] | array_flow.rb:1542:9:1542:9 | [post] a [element] | | array_flow.rb:1542:9:1542:9 | a [element 3] | array_flow.rb:1542:9:1542:15 | call to uniq! [element] | -| array_flow.rb:1542:9:1542:9 | a [element 3] | array_flow.rb:1542:9:1542:15 | call to uniq! [element] | -| array_flow.rb:1542:9:1542:15 | call to uniq! [element] | array_flow.rb:1542:5:1542:5 | b [element] | | array_flow.rb:1542:9:1542:15 | call to uniq! [element] | array_flow.rb:1542:5:1542:5 | b [element] | | array_flow.rb:1543:10:1543:10 | b [element] | array_flow.rb:1543:10:1543:13 | ...[...] | -| array_flow.rb:1543:10:1543:10 | b [element] | array_flow.rb:1543:10:1543:13 | ...[...] | -| array_flow.rb:1544:10:1544:10 | b [element] | array_flow.rb:1544:10:1544:13 | ...[...] | | array_flow.rb:1544:10:1544:10 | b [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:1546:10:1546:10 | a [element] | array_flow.rb:1546:10:1546:13 | ...[...] | | array_flow.rb:1546:10:1546:10 | a [element] | array_flow.rb:1546:10:1546:13 | ...[...] | | array_flow.rb:1548:5:1548:5 | a [element 2] | array_flow.rb:1549:9:1549:9 | a [element 2] | -| array_flow.rb:1548:5:1548:5 | a [element 2] | array_flow.rb:1549:9:1549:9 | a [element 2] | -| array_flow.rb:1548:5:1548:5 | a [element 3] | array_flow.rb:1549:9:1549:9 | a [element 3] | | array_flow.rb:1548:5:1548:5 | a [element 3] | array_flow.rb:1549:9:1549:9 | a [element 3] | | array_flow.rb:1548:16:1548:28 | call to source | array_flow.rb:1548:5:1548:5 | a [element 2] | -| array_flow.rb:1548:16:1548:28 | call to source | array_flow.rb:1548:5:1548:5 | a [element 2] | -| array_flow.rb:1548:31:1548:43 | call to source | array_flow.rb:1548:5:1548:5 | a [element 3] | | array_flow.rb:1548:31:1548:43 | call to source | array_flow.rb:1548:5:1548:5 | a [element 3] | | array_flow.rb:1549:5:1549:5 | b [element] | array_flow.rb:1553:10:1553:10 | b [element] | -| array_flow.rb:1549:5:1549:5 | b [element] | array_flow.rb:1553:10:1553:10 | b [element] | -| array_flow.rb:1549:5:1549:5 | b [element] | array_flow.rb:1554:10:1554:10 | b [element] | | array_flow.rb:1549:5:1549:5 | b [element] | array_flow.rb:1554:10:1554:10 | b [element] | | array_flow.rb:1549:9:1549:9 | [post] a [element] | array_flow.rb:1555:10:1555:10 | a [element] | -| array_flow.rb:1549:9:1549:9 | [post] a [element] | array_flow.rb:1555:10:1555:10 | a [element] | -| array_flow.rb:1549:9:1549:9 | [post] a [element] | array_flow.rb:1556:10:1556:10 | a [element] | | array_flow.rb:1549:9:1549:9 | [post] a [element] | array_flow.rb:1556:10:1556:10 | a [element] | | array_flow.rb:1549:9:1549:9 | a [element 2] | array_flow.rb:1549:9:1549:9 | [post] a [element] | -| array_flow.rb:1549:9:1549:9 | a [element 2] | array_flow.rb:1549:9:1549:9 | [post] a [element] | -| array_flow.rb:1549:9:1549:9 | a [element 2] | array_flow.rb:1549:9:1552:7 | call to uniq! [element] | | array_flow.rb:1549:9:1549:9 | a [element 2] | array_flow.rb:1549:9:1552:7 | call to uniq! [element] | | array_flow.rb:1549:9:1549:9 | a [element 2] | array_flow.rb:1549:21:1549:21 | x | -| array_flow.rb:1549:9:1549:9 | a [element 2] | array_flow.rb:1549:21:1549:21 | x | -| array_flow.rb:1549:9:1549:9 | a [element 3] | array_flow.rb:1549:9:1549:9 | [post] a [element] | | array_flow.rb:1549:9:1549:9 | a [element 3] | array_flow.rb:1549:9:1549:9 | [post] a [element] | | array_flow.rb:1549:9:1549:9 | a [element 3] | array_flow.rb:1549:9:1552:7 | call to uniq! [element] | -| array_flow.rb:1549:9:1549:9 | a [element 3] | array_flow.rb:1549:9:1552:7 | call to uniq! [element] | -| array_flow.rb:1549:9:1549:9 | a [element 3] | array_flow.rb:1549:21:1549:21 | x | | array_flow.rb:1549:9:1549:9 | a [element 3] | array_flow.rb:1549:21:1549:21 | x | | array_flow.rb:1549:9:1552:7 | call to uniq! [element] | array_flow.rb:1549:5:1549:5 | b [element] | -| array_flow.rb:1549:9:1552:7 | call to uniq! [element] | array_flow.rb:1549:5:1549:5 | b [element] | -| array_flow.rb:1549:21:1549:21 | x | array_flow.rb:1550:14:1550:14 | x | | array_flow.rb:1549:21:1549:21 | x | array_flow.rb:1550:14:1550:14 | x | | array_flow.rb:1553:10:1553:10 | b [element] | array_flow.rb:1553:10:1553:13 | ...[...] | -| array_flow.rb:1553:10:1553:10 | b [element] | array_flow.rb:1553:10:1553:13 | ...[...] | -| array_flow.rb:1554:10:1554:10 | b [element] | array_flow.rb:1554:10:1554:13 | ...[...] | | array_flow.rb:1554:10:1554:10 | b [element] | array_flow.rb:1554:10:1554:13 | ...[...] | | array_flow.rb:1555:10:1555:10 | a [element] | array_flow.rb:1555:10:1555:13 | ...[...] | -| array_flow.rb:1555:10:1555:10 | a [element] | array_flow.rb:1555:10:1555:13 | ...[...] | -| array_flow.rb:1556:10:1556:10 | a [element] | array_flow.rb:1556:10:1556:13 | ...[...] | | array_flow.rb:1556:10:1556:10 | a [element] | array_flow.rb:1556:10:1556:13 | ...[...] | | array_flow.rb:1560:5:1560:5 | a [element 2] | array_flow.rb:1561:5:1561:5 | a [element 2] | -| array_flow.rb:1560:5:1560:5 | a [element 2] | array_flow.rb:1561:5:1561:5 | a [element 2] | -| array_flow.rb:1560:16:1560:28 | call to source | array_flow.rb:1560:5:1560:5 | a [element 2] | | array_flow.rb:1560:16:1560:28 | call to source | array_flow.rb:1560:5:1560:5 | a [element 2] | | array_flow.rb:1561:5:1561:5 | [post] a [element 2] | array_flow.rb:1564:10:1564:10 | a [element 2] | -| array_flow.rb:1561:5:1561:5 | [post] a [element 2] | array_flow.rb:1564:10:1564:10 | a [element 2] | -| array_flow.rb:1561:5:1561:5 | [post] a [element 5] | array_flow.rb:1567:10:1567:10 | a [element 5] | | array_flow.rb:1561:5:1561:5 | [post] a [element 5] | array_flow.rb:1567:10:1567:10 | a [element 5] | | array_flow.rb:1561:5:1561:5 | a [element 2] | array_flow.rb:1561:5:1561:5 | [post] a [element 5] | -| array_flow.rb:1561:5:1561:5 | a [element 2] | array_flow.rb:1561:5:1561:5 | [post] a [element 5] | -| array_flow.rb:1561:21:1561:33 | call to source | array_flow.rb:1561:5:1561:5 | [post] a [element 2] | | array_flow.rb:1561:21:1561:33 | call to source | array_flow.rb:1561:5:1561:5 | [post] a [element 2] | | array_flow.rb:1564:10:1564:10 | a [element 2] | array_flow.rb:1564:10:1564:13 | ...[...] | -| array_flow.rb:1564:10:1564:10 | a [element 2] | array_flow.rb:1564:10:1564:13 | ...[...] | -| array_flow.rb:1567:10:1567:10 | a [element 5] | array_flow.rb:1567:10:1567:13 | ...[...] | | array_flow.rb:1567:10:1567:10 | a [element 5] | array_flow.rb:1567:10:1567:13 | ...[...] | | array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1573:9:1573:9 | a [element 1] | -| array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1573:9:1573:9 | a [element 1] | -| array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1579:9:1579:9 | a [element 1] | | array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1579:9:1579:9 | a [element 1] | | array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1583:9:1583:9 | a [element 1] | -| array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1583:9:1583:9 | a [element 1] | -| array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1587:9:1587:9 | a [element 1] | | array_flow.rb:1571:5:1571:5 | a [element 1] | array_flow.rb:1587:9:1587:9 | a [element 1] | | array_flow.rb:1571:5:1571:5 | a [element 3] | array_flow.rb:1579:9:1579:9 | a [element 3] | -| array_flow.rb:1571:5:1571:5 | a [element 3] | array_flow.rb:1579:9:1579:9 | a [element 3] | -| array_flow.rb:1571:5:1571:5 | a [element 3] | array_flow.rb:1583:9:1583:9 | a [element 3] | | array_flow.rb:1571:5:1571:5 | a [element 3] | array_flow.rb:1583:9:1583:9 | a [element 3] | | array_flow.rb:1571:5:1571:5 | a [element 3] | array_flow.rb:1587:9:1587:9 | a [element 3] | -| array_flow.rb:1571:5:1571:5 | a [element 3] | array_flow.rb:1587:9:1587:9 | a [element 3] | -| array_flow.rb:1571:13:1571:25 | call to source | array_flow.rb:1571:5:1571:5 | a [element 1] | | array_flow.rb:1571:13:1571:25 | call to source | array_flow.rb:1571:5:1571:5 | a [element 1] | | array_flow.rb:1571:31:1571:43 | call to source | array_flow.rb:1571:5:1571:5 | a [element 3] | -| array_flow.rb:1571:31:1571:43 | call to source | array_flow.rb:1571:5:1571:5 | a [element 3] | -| array_flow.rb:1573:5:1573:5 | b [element 1] | array_flow.rb:1575:10:1575:10 | b [element 1] | | array_flow.rb:1573:5:1573:5 | b [element 1] | array_flow.rb:1575:10:1575:10 | b [element 1] | | array_flow.rb:1573:5:1573:5 | b [element 3] | array_flow.rb:1577:10:1577:10 | b [element 3] | -| array_flow.rb:1573:5:1573:5 | b [element 3] | array_flow.rb:1577:10:1577:10 | b [element 3] | -| array_flow.rb:1573:9:1573:9 | a [element 1] | array_flow.rb:1573:9:1573:31 | call to values_at [element 1] | | array_flow.rb:1573:9:1573:9 | a [element 1] | array_flow.rb:1573:9:1573:31 | call to values_at [element 1] | | array_flow.rb:1573:9:1573:9 | a [element 1] | array_flow.rb:1573:9:1573:31 | call to values_at [element 3] | -| array_flow.rb:1573:9:1573:9 | a [element 1] | array_flow.rb:1573:9:1573:31 | call to values_at [element 3] | -| array_flow.rb:1573:9:1573:31 | call to values_at [element 1] | array_flow.rb:1573:5:1573:5 | b [element 1] | | array_flow.rb:1573:9:1573:31 | call to values_at [element 1] | array_flow.rb:1573:5:1573:5 | b [element 1] | | array_flow.rb:1573:9:1573:31 | call to values_at [element 3] | array_flow.rb:1573:5:1573:5 | b [element 3] | -| array_flow.rb:1573:9:1573:31 | call to values_at [element 3] | array_flow.rb:1573:5:1573:5 | b [element 3] | -| array_flow.rb:1575:10:1575:10 | b [element 1] | array_flow.rb:1575:10:1575:13 | ...[...] | | array_flow.rb:1575:10:1575:10 | b [element 1] | array_flow.rb:1575:10:1575:13 | ...[...] | | array_flow.rb:1577:10:1577:10 | b [element 3] | array_flow.rb:1577:10:1577:13 | ...[...] | -| array_flow.rb:1577:10:1577:10 | b [element 3] | array_flow.rb:1577:10:1577:13 | ...[...] | -| array_flow.rb:1579:5:1579:5 | b [element] | array_flow.rb:1580:10:1580:10 | b [element] | | array_flow.rb:1579:5:1579:5 | b [element] | array_flow.rb:1580:10:1580:10 | b [element] | | array_flow.rb:1579:5:1579:5 | b [element] | array_flow.rb:1581:10:1581:10 | b [element] | -| array_flow.rb:1579:5:1579:5 | b [element] | array_flow.rb:1581:10:1581:10 | b [element] | -| array_flow.rb:1579:9:1579:9 | a [element 1] | array_flow.rb:1579:9:1579:25 | call to values_at [element] | | array_flow.rb:1579:9:1579:9 | a [element 1] | array_flow.rb:1579:9:1579:25 | call to values_at [element] | | array_flow.rb:1579:9:1579:9 | a [element 3] | array_flow.rb:1579:9:1579:25 | call to values_at [element] | -| array_flow.rb:1579:9:1579:9 | a [element 3] | array_flow.rb:1579:9:1579:25 | call to values_at [element] | -| array_flow.rb:1579:9:1579:25 | call to values_at [element] | array_flow.rb:1579:5:1579:5 | b [element] | | array_flow.rb:1579:9:1579:25 | call to values_at [element] | array_flow.rb:1579:5:1579:5 | b [element] | | 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:1581:10:1581:10 | b [element] | array_flow.rb:1581:10:1581:13 | ...[...] | | array_flow.rb:1581:10:1581:10 | b [element] | array_flow.rb:1581:10:1581:13 | ...[...] | | array_flow.rb:1583:5:1583:5 | b [element] | array_flow.rb:1584:10:1584:10 | b [element] | -| array_flow.rb:1583:5:1583:5 | b [element] | array_flow.rb:1584:10:1584:10 | b [element] | -| array_flow.rb:1583:5:1583:5 | b [element] | array_flow.rb:1585:10:1585:10 | b [element] | | array_flow.rb:1583:5:1583:5 | b [element] | array_flow.rb:1585:10:1585:10 | b [element] | | array_flow.rb:1583:9:1583:9 | a [element 1] | array_flow.rb:1583:9:1583:26 | call to values_at [element] | -| array_flow.rb:1583:9:1583:9 | a [element 1] | array_flow.rb:1583:9:1583:26 | call to values_at [element] | -| array_flow.rb:1583:9:1583:9 | a [element 3] | array_flow.rb:1583:9:1583:26 | call to values_at [element] | | array_flow.rb:1583:9:1583:9 | a [element 3] | array_flow.rb:1583:9:1583:26 | call to values_at [element] | | array_flow.rb:1583:9:1583:26 | call to values_at [element] | array_flow.rb:1583:5:1583:5 | b [element] | -| array_flow.rb:1583:9:1583:26 | call to values_at [element] | array_flow.rb:1583:5:1583:5 | b [element] | -| array_flow.rb:1584:10:1584:10 | b [element] | array_flow.rb:1584:10:1584:13 | ...[...] | | array_flow.rb:1584:10:1584:10 | b [element] | array_flow.rb:1584:10:1584:13 | ...[...] | | array_flow.rb:1585:10:1585:10 | b [element] | array_flow.rb:1585:10:1585:13 | ...[...] | -| array_flow.rb:1585:10:1585:10 | b [element] | array_flow.rb:1585:10:1585:13 | ...[...] | -| array_flow.rb:1587:5:1587:5 | b [element 1] | array_flow.rb:1589:10:1589:10 | b [element 1] | | array_flow.rb:1587:5:1587:5 | b [element 1] | array_flow.rb:1589:10:1589:10 | b [element 1] | | array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1588:10:1588:10 | b [element] | -| array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1588:10:1588:10 | b [element] | -| array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1589:10:1589:10 | b [element] | | array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1589:10:1589:10 | b [element] | | array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1590:10:1590:10 | b [element] | -| array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1590:10:1590:10 | b [element] | -| array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1591:10:1591:10 | b [element] | | array_flow.rb:1587:5:1587:5 | b [element] | array_flow.rb:1591:10:1591:10 | b [element] | | array_flow.rb:1587:9:1587:9 | a [element 1] | array_flow.rb:1587:9:1587:28 | call to values_at [element] | -| array_flow.rb:1587:9:1587:9 | a [element 1] | array_flow.rb:1587:9:1587:28 | call to values_at [element] | -| array_flow.rb:1587:9:1587:9 | a [element 3] | array_flow.rb:1587:9:1587:28 | call to values_at [element 1] | | array_flow.rb:1587:9:1587:9 | a [element 3] | array_flow.rb:1587:9:1587:28 | call to values_at [element 1] | | array_flow.rb:1587:9:1587:9 | a [element 3] | array_flow.rb:1587:9:1587:28 | call to values_at [element] | -| array_flow.rb:1587:9:1587:9 | a [element 3] | array_flow.rb:1587:9:1587:28 | call to values_at [element] | -| array_flow.rb:1587:9:1587:28 | call to values_at [element 1] | array_flow.rb:1587:5:1587:5 | b [element 1] | | array_flow.rb:1587:9:1587:28 | call to values_at [element 1] | array_flow.rb:1587:5:1587:5 | b [element 1] | | array_flow.rb:1587:9:1587:28 | call to values_at [element] | array_flow.rb:1587:5:1587:5 | b [element] | -| array_flow.rb:1587:9:1587:28 | call to values_at [element] | array_flow.rb:1587:5:1587:5 | b [element] | -| array_flow.rb:1588:10:1588:10 | b [element] | array_flow.rb:1588:10:1588:13 | ...[...] | | array_flow.rb:1588:10:1588:10 | b [element] | array_flow.rb:1588:10:1588:13 | ...[...] | | array_flow.rb:1589:10:1589:10 | b [element 1] | array_flow.rb:1589:10:1589:13 | ...[...] | -| array_flow.rb:1589:10:1589:10 | b [element 1] | array_flow.rb:1589:10:1589:13 | ...[...] | -| array_flow.rb:1589:10:1589:10 | b [element] | array_flow.rb:1589:10:1589:13 | ...[...] | | array_flow.rb:1589:10:1589:10 | b [element] | array_flow.rb:1589:10:1589:13 | ...[...] | | array_flow.rb:1590:10:1590:10 | b [element] | array_flow.rb:1590:10:1590:13 | ...[...] | -| array_flow.rb:1590:10:1590:10 | b [element] | array_flow.rb:1590:10:1590:13 | ...[...] | -| array_flow.rb:1591:10:1591:10 | b [element] | array_flow.rb:1591:10:1591:13 | ...[...] | | array_flow.rb:1591:10:1591:10 | b [element] | array_flow.rb:1591:10:1591:13 | ...[...] | | array_flow.rb:1595:5:1595:5 | a [element 2] | array_flow.rb:1598:9:1598:9 | a [element 2] | -| array_flow.rb:1595:5:1595:5 | a [element 2] | array_flow.rb:1598:9:1598:9 | a [element 2] | -| array_flow.rb:1595:5:1595:5 | a [element 2] | array_flow.rb:1603:5:1603:5 | a [element 2] | | array_flow.rb:1595:5:1595:5 | a [element 2] | array_flow.rb:1603:5:1603:5 | a [element 2] | | array_flow.rb:1595:16:1595:28 | call to source | array_flow.rb:1595:5:1595:5 | a [element 2] | -| array_flow.rb:1595:16:1595:28 | call to source | array_flow.rb:1595:5:1595:5 | a [element 2] | -| array_flow.rb:1596:5:1596:5 | b [element 1] | array_flow.rb:1598:15:1598:15 | b [element 1] | | array_flow.rb:1596:5:1596:5 | b [element 1] | array_flow.rb:1598:15:1598:15 | b [element 1] | | array_flow.rb:1596:5:1596:5 | b [element 1] | array_flow.rb:1603:11:1603:11 | b [element 1] | -| array_flow.rb:1596:5:1596:5 | b [element 1] | array_flow.rb:1603:11:1603:11 | b [element 1] | -| array_flow.rb:1596:13:1596:25 | call to source | array_flow.rb:1596:5:1596:5 | b [element 1] | | array_flow.rb:1596:13:1596:25 | call to source | array_flow.rb:1596:5:1596:5 | b [element 1] | | array_flow.rb:1597:5:1597:5 | c [element 0] | array_flow.rb:1598:18:1598:18 | c [element 0] | -| array_flow.rb:1597:5:1597:5 | c [element 0] | array_flow.rb:1598:18:1598:18 | c [element 0] | -| array_flow.rb:1597:5:1597:5 | c [element 0] | array_flow.rb:1603:14:1603:14 | c [element 0] | | array_flow.rb:1597:5:1597:5 | c [element 0] | array_flow.rb:1603:14:1603:14 | c [element 0] | | array_flow.rb:1597:10:1597:22 | call to source | array_flow.rb:1597:5:1597:5 | c [element 0] | -| array_flow.rb:1597:10:1597:22 | call to source | array_flow.rb:1597:5:1597:5 | c [element 0] | -| array_flow.rb:1598:5:1598:5 | d [element 0, element 2] | array_flow.rb:1600:10:1600:10 | d [element 0, element 2] | | array_flow.rb:1598:5:1598:5 | d [element 0, element 2] | array_flow.rb:1600:10:1600:10 | d [element 0, element 2] | | array_flow.rb:1598:5:1598:5 | d [element 1, element 1] | array_flow.rb:1601:10:1601:10 | d [element 1, element 1] | -| array_flow.rb:1598:5:1598:5 | d [element 1, element 1] | array_flow.rb:1601:10:1601:10 | d [element 1, element 1] | -| array_flow.rb:1598:5:1598:5 | d [element 2, element 0] | array_flow.rb:1602:10:1602:10 | d [element 2, element 0] | | array_flow.rb:1598:5:1598:5 | d [element 2, element 0] | array_flow.rb:1602:10:1602:10 | d [element 2, element 0] | | array_flow.rb:1598:9:1598:9 | a [element 2] | array_flow.rb:1598:9:1598:19 | call to zip [element 2, element 0] | -| array_flow.rb:1598:9:1598:9 | a [element 2] | array_flow.rb:1598:9:1598:19 | call to zip [element 2, element 0] | -| array_flow.rb:1598:9:1598:19 | call to zip [element 0, element 2] | array_flow.rb:1598:5:1598:5 | d [element 0, element 2] | | array_flow.rb:1598:9:1598:19 | call to zip [element 0, element 2] | array_flow.rb:1598:5:1598:5 | d [element 0, element 2] | | array_flow.rb:1598:9:1598:19 | call to zip [element 1, element 1] | array_flow.rb:1598:5:1598:5 | d [element 1, element 1] | -| array_flow.rb:1598:9:1598:19 | call to zip [element 1, element 1] | array_flow.rb:1598:5:1598:5 | d [element 1, element 1] | -| array_flow.rb:1598:9:1598:19 | call to zip [element 2, element 0] | array_flow.rb:1598:5:1598:5 | d [element 2, element 0] | | array_flow.rb:1598:9:1598:19 | call to zip [element 2, element 0] | array_flow.rb:1598:5:1598:5 | d [element 2, element 0] | | array_flow.rb:1598:15:1598:15 | b [element 1] | array_flow.rb:1598:9:1598:19 | call to zip [element 1, element 1] | -| array_flow.rb:1598:15:1598:15 | b [element 1] | array_flow.rb:1598:9:1598:19 | call to zip [element 1, element 1] | -| array_flow.rb:1598:18:1598:18 | c [element 0] | array_flow.rb:1598:9:1598:19 | call to zip [element 0, element 2] | | array_flow.rb:1598:18:1598:18 | c [element 0] | array_flow.rb:1598:9:1598:19 | call to zip [element 0, element 2] | | array_flow.rb:1600:10:1600:10 | d [element 0, element 2] | array_flow.rb:1600:10:1600:13 | ...[...] [element 2] | -| array_flow.rb:1600:10:1600:10 | d [element 0, element 2] | array_flow.rb:1600:10:1600:13 | ...[...] [element 2] | -| array_flow.rb:1600:10:1600:13 | ...[...] [element 2] | array_flow.rb:1600:10:1600:16 | ...[...] | | array_flow.rb:1600:10:1600:13 | ...[...] [element 2] | array_flow.rb:1600:10:1600:16 | ...[...] | | array_flow.rb:1601:10:1601:10 | d [element 1, element 1] | array_flow.rb:1601:10:1601:13 | ...[...] [element 1] | -| array_flow.rb:1601:10:1601:10 | d [element 1, element 1] | array_flow.rb:1601:10:1601:13 | ...[...] [element 1] | -| array_flow.rb:1601:10:1601:13 | ...[...] [element 1] | array_flow.rb:1601:10:1601:16 | ...[...] | | array_flow.rb:1601:10:1601:13 | ...[...] [element 1] | array_flow.rb:1601:10:1601:16 | ...[...] | | array_flow.rb:1602:10:1602:10 | d [element 2, element 0] | array_flow.rb:1602:10:1602:13 | ...[...] [element 0] | -| array_flow.rb:1602:10:1602:10 | d [element 2, element 0] | array_flow.rb:1602:10:1602:13 | ...[...] [element 0] | -| array_flow.rb:1602:10:1602:13 | ...[...] [element 0] | array_flow.rb:1602:10:1602:16 | ...[...] | | array_flow.rb:1602:10:1602:13 | ...[...] [element 0] | array_flow.rb:1602:10:1602:16 | ...[...] | | array_flow.rb:1603:5:1603:5 | a [element 2] | array_flow.rb:1603:21:1603:21 | x [element 0] | -| array_flow.rb:1603:5:1603:5 | a [element 2] | array_flow.rb:1603:21:1603:21 | x [element 0] | -| array_flow.rb:1603:11:1603:11 | b [element 1] | array_flow.rb:1603:21:1603:21 | x [element 1] | | array_flow.rb:1603:11:1603:11 | b [element 1] | array_flow.rb:1603:21:1603:21 | x [element 1] | | array_flow.rb:1603:14:1603:14 | c [element 0] | array_flow.rb:1603:21:1603:21 | x [element 2] | -| array_flow.rb:1603:14:1603:14 | c [element 0] | array_flow.rb:1603:21:1603:21 | x [element 2] | -| array_flow.rb:1603:21:1603:21 | x [element 0] | array_flow.rb:1604:14:1604:14 | x [element 0] | | array_flow.rb:1603:21:1603:21 | x [element 0] | array_flow.rb:1604:14:1604:14 | x [element 0] | | array_flow.rb:1603:21:1603:21 | x [element 1] | array_flow.rb:1605:14:1605:14 | x [element 1] | -| array_flow.rb:1603:21:1603:21 | x [element 1] | array_flow.rb:1605:14:1605:14 | x [element 1] | -| array_flow.rb:1603:21:1603:21 | x [element 2] | array_flow.rb:1606:14:1606:14 | x [element 2] | | array_flow.rb:1603:21:1603:21 | x [element 2] | array_flow.rb:1606:14:1606:14 | x [element 2] | | array_flow.rb:1604:14:1604:14 | x [element 0] | array_flow.rb:1604:14:1604:17 | ...[...] | -| array_flow.rb:1604:14:1604:14 | x [element 0] | array_flow.rb:1604:14:1604:17 | ...[...] | -| array_flow.rb:1605:14:1605:14 | x [element 1] | array_flow.rb:1605:14:1605:17 | ...[...] | | array_flow.rb:1605:14:1605:14 | x [element 1] | array_flow.rb:1605:14:1605:17 | ...[...] | | array_flow.rb:1606:14:1606:14 | x [element 2] | array_flow.rb:1606:14:1606:17 | ...[...] | -| array_flow.rb:1606:14:1606:14 | x [element 2] | array_flow.rb:1606:14:1606:17 | ...[...] | -| array_flow.rb:1611:5:1611:5 | a [element 2] | array_flow.rb:1613:9:1613:9 | a [element 2] | | array_flow.rb:1611:5:1611:5 | a [element 2] | array_flow.rb:1613:9:1613:9 | a [element 2] | | array_flow.rb:1611:16:1611:28 | call to source | array_flow.rb:1611:5:1611:5 | a [element 2] | -| array_flow.rb:1611:16:1611:28 | call to source | array_flow.rb:1611:5:1611:5 | a [element 2] | -| array_flow.rb:1612:5:1612:5 | b [element 1] | array_flow.rb:1613:13:1613:13 | b [element 1] | | array_flow.rb:1612:5:1612:5 | b [element 1] | array_flow.rb:1613:13:1613:13 | b [element 1] | | array_flow.rb:1612:13:1612:25 | call to source | array_flow.rb:1612:5:1612:5 | b [element 1] | -| array_flow.rb:1612:13:1612:25 | call to source | array_flow.rb:1612:5:1612:5 | b [element 1] | -| array_flow.rb:1613:5:1613:5 | c [element] | array_flow.rb:1614:10:1614:10 | c [element] | | array_flow.rb:1613:5:1613:5 | c [element] | array_flow.rb:1614:10:1614:10 | c [element] | | array_flow.rb:1613:5:1613:5 | c [element] | array_flow.rb:1615:10:1615:10 | c [element] | -| array_flow.rb:1613:5:1613:5 | c [element] | array_flow.rb:1615:10:1615:10 | c [element] | -| array_flow.rb:1613:5:1613:5 | c [element] | array_flow.rb:1616:10:1616:10 | c [element] | | array_flow.rb:1613:5:1613:5 | c [element] | array_flow.rb:1616:10:1616:10 | c [element] | | array_flow.rb:1613:9:1613:9 | a [element 2] | array_flow.rb:1613:9:1613:13 | ... \| ... [element] | -| array_flow.rb:1613:9:1613:9 | a [element 2] | array_flow.rb:1613:9:1613:13 | ... \| ... [element] | -| array_flow.rb:1613:9:1613:13 | ... \| ... [element] | array_flow.rb:1613:5:1613:5 | c [element] | | array_flow.rb:1613:9:1613:13 | ... \| ... [element] | array_flow.rb:1613:5:1613:5 | c [element] | | array_flow.rb:1613:13:1613:13 | b [element 1] | array_flow.rb:1613:9:1613:13 | ... \| ... [element] | -| array_flow.rb:1613:13:1613:13 | b [element 1] | array_flow.rb:1613:9:1613:13 | ... \| ... [element] | -| array_flow.rb:1614:10:1614:10 | c [element] | array_flow.rb:1614:10:1614:13 | ...[...] | | array_flow.rb:1614:10:1614:10 | c [element] | array_flow.rb:1614:10:1614:13 | ...[...] | | array_flow.rb:1615:10:1615:10 | c [element] | array_flow.rb:1615:10:1615:13 | ...[...] | -| array_flow.rb:1615:10:1615:10 | c [element] | array_flow.rb:1615:10:1615:13 | ...[...] | -| array_flow.rb:1616:10:1616:10 | c [element] | array_flow.rb:1616:10:1616:13 | ...[...] | | array_flow.rb:1616:10:1616:10 | c [element] | array_flow.rb:1616:10:1616:13 | ...[...] | | array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | array_flow.rb:1622:10:1622:10 | a [element, element 0] | -| array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | array_flow.rb:1622:10:1622:10 | a [element, element 0] | -| array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | array_flow.rb:1625:10:1625:10 | a [element, element 0] | | array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | array_flow.rb:1625:10:1625:10 | a [element, element 0] | | array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | array_flow.rb:1626:10:1626:10 | a [element, element 0] | -| array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | array_flow.rb:1626:10:1626:10 | a [element, element 0] | -| array_flow.rb:1621:5:1621:8 | [post] ...[...] [element 0] | array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | | array_flow.rb:1621:5:1621:8 | [post] ...[...] [element 0] | array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | | array_flow.rb:1621:15:1621:27 | call to source | array_flow.rb:1621:5:1621:8 | [post] ...[...] [element 0] | -| array_flow.rb:1621:15:1621:27 | call to source | array_flow.rb:1621:5:1621:8 | [post] ...[...] [element 0] | -| array_flow.rb:1622:10:1622:10 | a [element, element 0] | array_flow.rb:1622:10:1622:13 | ...[...] [element 0] | | array_flow.rb:1622:10:1622:10 | a [element, element 0] | array_flow.rb:1622:10:1622:13 | ...[...] [element 0] | | array_flow.rb:1622:10:1622:13 | ...[...] [element 0] | array_flow.rb:1622:10:1622:16 | ...[...] | -| array_flow.rb:1622:10:1622:13 | ...[...] [element 0] | array_flow.rb:1622:10:1622:16 | ...[...] | -| array_flow.rb:1624:5:1624:5 | [post] a [element 1, element 0] | array_flow.rb:1625:10:1625:10 | a [element 1, element 0] | | array_flow.rb:1624:5:1624:5 | [post] a [element 1, element 0] | array_flow.rb:1625:10:1625:10 | a [element 1, element 0] | | array_flow.rb:1624:5:1624:8 | [post] ...[...] [element 0] | array_flow.rb:1624:5:1624:5 | [post] a [element 1, element 0] | -| array_flow.rb:1624:5:1624:8 | [post] ...[...] [element 0] | array_flow.rb:1624:5:1624:5 | [post] a [element 1, element 0] | -| array_flow.rb:1624:15:1624:27 | call to source | array_flow.rb:1624:5:1624:8 | [post] ...[...] [element 0] | | array_flow.rb:1624:15:1624:27 | call to source | array_flow.rb:1624:5:1624:8 | [post] ...[...] [element 0] | | array_flow.rb:1625:10:1625:10 | a [element 1, element 0] | array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | -| array_flow.rb:1625:10:1625:10 | a [element 1, element 0] | array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | -| array_flow.rb:1625:10:1625:10 | a [element, element 0] | array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | | array_flow.rb:1625:10:1625:10 | a [element, element 0] | array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | | array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | array_flow.rb:1625:10:1625:16 | ...[...] | -| array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | array_flow.rb:1625:10:1625:16 | ...[...] | -| array_flow.rb:1626:10:1626:10 | a [element, element 0] | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | | array_flow.rb:1626:10:1626:10 | a [element, element 0] | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | array_flow.rb:1626:10:1626:16 | ...[...] | -| array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | array_flow.rb:1626:10:1626:16 | ...[...] | -| array_flow.rb:1631:5:1631:5 | [post] a [element 0] | array_flow.rb:1640:10:1640:10 | a [element 0] | | array_flow.rb:1631:5:1631:5 | [post] a [element 0] | array_flow.rb:1640:10:1640:10 | a [element 0] | | array_flow.rb:1631:5:1631:5 | [post] a [element 0] | array_flow.rb:1642:10:1642:10 | a [element 0] | -| array_flow.rb:1631:5:1631:5 | [post] a [element 0] | array_flow.rb:1642:10:1642:10 | a [element 0] | -| array_flow.rb:1631:12:1631:24 | call to source | array_flow.rb:1631:5:1631:5 | [post] a [element 0] | | array_flow.rb:1631:12:1631:24 | call to source | array_flow.rb:1631:5:1631:5 | [post] a [element 0] | | array_flow.rb:1633:5:1633:5 | [post] a [element] | array_flow.rb:1638:10:1638:10 | a [element] | -| array_flow.rb:1633:5:1633:5 | [post] a [element] | array_flow.rb:1638:10:1638:10 | a [element] | -| array_flow.rb:1633:5:1633:5 | [post] a [element] | array_flow.rb:1640:10:1640:10 | a [element] | | array_flow.rb:1633:5:1633:5 | [post] a [element] | array_flow.rb:1640:10:1640:10 | a [element] | | array_flow.rb:1633:5:1633:5 | [post] a [element] | array_flow.rb:1642:10:1642:10 | a [element] | -| array_flow.rb:1633:5:1633:5 | [post] a [element] | array_flow.rb:1642:10:1642:10 | a [element] | -| array_flow.rb:1633:16:1633:28 | call to source | array_flow.rb:1633:5:1633:5 | [post] a [element] | | array_flow.rb:1633:16:1633:28 | call to source | array_flow.rb:1633:5:1633:5 | [post] a [element] | | array_flow.rb:1635:5:1635:5 | [post] a [element] | array_flow.rb:1638:10:1638:10 | a [element] | -| array_flow.rb:1635:5:1635:5 | [post] a [element] | array_flow.rb:1638:10:1638:10 | a [element] | -| array_flow.rb:1635:5:1635:5 | [post] a [element] | array_flow.rb:1640:10:1640:10 | a [element] | | array_flow.rb:1635:5:1635:5 | [post] a [element] | array_flow.rb:1640:10:1640:10 | a [element] | | array_flow.rb:1635:5:1635:5 | [post] a [element] | array_flow.rb:1642:10:1642:10 | a [element] | -| array_flow.rb:1635:5:1635:5 | [post] a [element] | array_flow.rb:1642:10:1642:10 | a [element] | -| array_flow.rb:1635:14:1635:26 | call to source | array_flow.rb:1635:5:1635:5 | [post] a [element] | | array_flow.rb:1635:14:1635:26 | call to source | array_flow.rb:1635:5:1635:5 | [post] a [element] | | array_flow.rb:1637:5:1637:5 | [post] a [element] | array_flow.rb:1638:10:1638:10 | a [element] | -| array_flow.rb:1637:5:1637:5 | [post] a [element] | array_flow.rb:1638:10:1638:10 | a [element] | -| array_flow.rb:1637:5:1637:5 | [post] a [element] | array_flow.rb:1640:10:1640:10 | a [element] | | array_flow.rb:1637:5:1637:5 | [post] a [element] | array_flow.rb:1640:10:1640:10 | a [element] | | array_flow.rb:1637:5:1637:5 | [post] a [element] | array_flow.rb:1642:10:1642:10 | a [element] | -| array_flow.rb:1637:5:1637:5 | [post] a [element] | array_flow.rb:1642:10:1642:10 | a [element] | -| array_flow.rb:1637:16:1637:28 | call to source | array_flow.rb:1637:5:1637:5 | [post] a [element] | | array_flow.rb:1637:16:1637:28 | call to source | array_flow.rb:1637:5:1637:5 | [post] a [element] | | array_flow.rb:1638:10:1638:10 | a [element] | array_flow.rb:1638:10:1638:13 | ...[...] | -| array_flow.rb:1638:10:1638:10 | a [element] | array_flow.rb:1638:10:1638:13 | ...[...] | -| array_flow.rb:1640:10:1640:10 | a [element 0] | array_flow.rb:1640:10:1640:17 | ...[...] | | array_flow.rb:1640:10:1640:10 | a [element 0] | array_flow.rb:1640:10:1640:17 | ...[...] | | array_flow.rb:1640:10:1640:10 | a [element] | array_flow.rb:1640:10:1640:17 | ...[...] | -| array_flow.rb:1640:10:1640:10 | a [element] | array_flow.rb:1640:10:1640:17 | ...[...] | -| array_flow.rb:1642:10:1642:10 | a [element 0] | array_flow.rb:1642:10:1642:15 | ...[...] | | array_flow.rb:1642:10:1642:10 | a [element 0] | array_flow.rb:1642:10:1642:15 | ...[...] | | array_flow.rb:1642:10:1642:10 | a [element] | array_flow.rb:1642:10:1642:15 | ...[...] | -| array_flow.rb:1642:10:1642:10 | a [element] | array_flow.rb:1642:10:1642:15 | ...[...] | nodes | array_flow.rb:2:5:2:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:2:5:2:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:2:9:2:20 | * ... [element 0] | semmle.label | * ... [element 0] | -| array_flow.rb:2:9:2:20 | * ... [element 0] | semmle.label | * ... [element 0] | -| array_flow.rb:2:10:2:20 | call to source | semmle.label | call to source | | array_flow.rb:2:10:2:20 | call to source | semmle.label | call to source | | array_flow.rb:3:10:3:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:3:10:3:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:3:10:3:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:3:10:3:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:5:10:5:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:5:10:5:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:9:5:9:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:9:5:9:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:9:13:9:21 | call to source | semmle.label | call to source | | array_flow.rb:9:13:9:21 | call to source | semmle.label | call to source | | array_flow.rb:11:10:11:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:11:10:11:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:11:10:11:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:11:10:11:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:13:10:13:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:13:10:13:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:17:5:17:5 | a [element] | semmle.label | a [element] | -| array_flow.rb:17:5:17:5 | a [element] | semmle.label | a [element] | -| array_flow.rb:17:9:17:33 | call to new [element] | semmle.label | call to new [element] | | array_flow.rb:17:9:17:33 | call to new [element] | semmle.label | call to new [element] | | array_flow.rb:17:22:17:32 | call to source | semmle.label | call to source | -| array_flow.rb:17:22:17:32 | call to source | semmle.label | call to source | -| array_flow.rb:18:10:18:10 | a [element] | semmle.label | a [element] | | array_flow.rb:18:10:18:10 | a [element] | semmle.label | a [element] | | array_flow.rb:18:10:18:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:18:10:18:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:19:10:19:10 | a [element] | semmle.label | a [element] | | array_flow.rb:19:10:19:10 | a [element] | semmle.label | a [element] | | array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:21:5:21:5 | b [element] | semmle.label | b [element] | | array_flow.rb:21:5:21:5 | b [element] | semmle.label | b [element] | | array_flow.rb:21:9:21:20 | call to new [element] | semmle.label | call to new [element] | -| array_flow.rb:21:9:21:20 | call to new [element] | semmle.label | call to new [element] | -| array_flow.rb:21:19:21:19 | a [element] | semmle.label | a [element] | | array_flow.rb:21:19:21:19 | a [element] | semmle.label | a [element] | | array_flow.rb:22:10:22:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:22:10:22:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:22:10:22:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:22:10:22:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:23:10:23:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:23:10:23:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:25:5:25:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:25:5:25:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:25:9:27:7 | call to new [element] | semmle.label | call to new [element] | | array_flow.rb:25:9:27:7 | call to new [element] | semmle.label | call to new [element] | | array_flow.rb:26:9:26:19 | call to source | semmle.label | call to source | -| array_flow.rb:26:9:26:19 | call to source | semmle.label | call to source | -| array_flow.rb:28:10:28:10 | c [element] | semmle.label | c [element] | | array_flow.rb:28:10:28:10 | c [element] | semmle.label | c [element] | | array_flow.rb:28:10:28:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:28:10:28:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:29:10:29:10 | c [element] | semmle.label | c [element] | | array_flow.rb:29:10:29:10 | c [element] | semmle.label | c [element] | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:33:5:33:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:33:5:33:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:33:10:33:18 | call to source | semmle.label | call to source | -| array_flow.rb:33:10:33:18 | call to source | semmle.label | call to source | -| array_flow.rb:34:5:34:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:34:5:34:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:34:9:34:28 | call to try_convert [element 0] | semmle.label | call to try_convert [element 0] | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] | semmle.label | call to try_convert [element 0] | -| array_flow.rb:34:27:34:27 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:34:27:34:27 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:35:10:35:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:35:10:35:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:40:5:40:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:40:5:40:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:40:10:40:20 | call to source | semmle.label | call to source | | array_flow.rb:40:10:40:20 | call to source | semmle.label | call to source | | array_flow.rb:41:5:41:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:41:5:41:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:41:16:41:26 | call to source | semmle.label | call to source | | array_flow.rb:41:16:41:26 | call to source | semmle.label | call to source | | array_flow.rb:42:5:42:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:42:5:42:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:42:9:42:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:42:9:42:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:42:9:42:13 | ... & ... [element] | semmle.label | ... & ... [element] | -| array_flow.rb:42:9:42:13 | ... & ... [element] | semmle.label | ... & ... [element] | -| array_flow.rb:42:13:42:13 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:42:13:42:13 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:43:10:43:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:43:10:43:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:43:10:43:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:43:10:43:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:44:10:44:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:44:10:44:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:48:5:48:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:48:5:48:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:48:10:48:18 | call to source | semmle.label | call to source | | array_flow.rb:48:10:48:18 | call to source | semmle.label | call to source | | array_flow.rb:49:5:49:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:49:5:49:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:49:9:49:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:49:9:49:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:49:9:49:13 | ... * ... [element] | semmle.label | ... * ... [element] | -| array_flow.rb:49:9:49:13 | ... * ... [element] | semmle.label | ... * ... [element] | -| array_flow.rb:50:10:50:10 | b [element] | semmle.label | b [element] | | array_flow.rb:50:10:50:10 | b [element] | semmle.label | b [element] | | array_flow.rb:50:10:50:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:50:10:50:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:51:10:51:10 | b [element] | semmle.label | b [element] | | array_flow.rb:51:10:51:10 | b [element] | semmle.label | b [element] | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:55:5:55:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:55:5:55:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:55:10:55:20 | call to source | semmle.label | call to source | -| array_flow.rb:55:10:55:20 | call to source | semmle.label | call to source | -| array_flow.rb:56:5:56:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:56:5:56:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:56:13:56:23 | call to source | semmle.label | call to source | -| array_flow.rb:56:13:56:23 | call to source | semmle.label | call to source | -| array_flow.rb:57:5:57:5 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:57:5:57:5 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:57:5:57:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:57:5:57:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:57:9:57:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:57:9:57:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:57:9:57:13 | ... + ... [element 0] | semmle.label | ... + ... [element 0] | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] | semmle.label | ... + ... [element 0] | -| array_flow.rb:57:9:57:13 | ... + ... [element] | semmle.label | ... + ... [element] | | array_flow.rb:57:9:57:13 | ... + ... [element] | semmle.label | ... + ... [element] | | array_flow.rb:57:13:57:13 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:57:13:57:13 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:58:10:58:10 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:58:10:58:10 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:58:10:58:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:58:10:58:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:58:10:58:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:58:10:58:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:59:10:59:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:59:10:59:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:63:5:63:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:63:5:63:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:63:10:63:20 | call to source | semmle.label | call to source | | array_flow.rb:63:10:63:20 | call to source | semmle.label | call to source | | array_flow.rb:65:5:65:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:65:5:65:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:65:9:65:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:65:9:65:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:65:9:65:13 | ... - ... [element] | semmle.label | ... - ... [element] | -| array_flow.rb:65:9:65:13 | ... - ... [element] | semmle.label | ... - ... [element] | -| array_flow.rb:66:10:66:10 | c [element] | semmle.label | c [element] | | array_flow.rb:66:10:66:10 | c [element] | semmle.label | c [element] | | array_flow.rb:66:10:66:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:66:10:66:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:67:10:67:10 | c [element] | semmle.label | c [element] | | array_flow.rb:67:10:67:10 | c [element] | semmle.label | c [element] | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:71:5:71:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:71:5:71:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:71:10:71:20 | call to source | semmle.label | call to source | -| array_flow.rb:71:10:71:20 | call to source | semmle.label | call to source | -| array_flow.rb:72:5:72:5 | b | semmle.label | b | -| array_flow.rb:72:5:72:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:72:5:72:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:72:5:72:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:72:5:72:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:72:9:72:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:72:9:72:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:72:9:72:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:72:9:72:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] | semmle.label | ... << ... [element 0] | | array_flow.rb:72:9:72:24 | ... << ... [element 0] | semmle.label | ... << ... [element 0] | | array_flow.rb:72:9:72:24 | ... << ... [element] | semmle.label | ... << ... [element] | -| array_flow.rb:72:9:72:24 | ... << ... [element] | semmle.label | ... << ... [element] | -| array_flow.rb:72:14:72:24 | call to source | semmle.label | call to source | | array_flow.rb:72:14:72:24 | call to source | semmle.label | call to source | | array_flow.rb:73:10:73:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:73:10:73:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:73:10:73:10 | a [element] | semmle.label | a [element] | | array_flow.rb:73:10:73:10 | a [element] | semmle.label | a [element] | | array_flow.rb:73:10:73:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:73:10:73:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:74:10:74:10 | a [element] | semmle.label | a [element] | | array_flow.rb:74:10:74:10 | a [element] | semmle.label | a [element] | | array_flow.rb:74:10:74:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:74:10:74:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:75:10:75:10 | b | semmle.label | b | -| array_flow.rb:75:10:75:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:75:10:75:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:75:10:75:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:75:10:75:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:75:10:75:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:75:10:75:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:76:10:76:10 | b | semmle.label | b | | array_flow.rb:76:10:76:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:76:10:76:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:80:5:80:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:80:5:80:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:80:13:80:21 | call to source | semmle.label | call to source | | array_flow.rb:80:13:80:21 | call to source | semmle.label | call to source | | array_flow.rb:81:8:81:8 | c | semmle.label | c | -| array_flow.rb:81:8:81:8 | c | semmle.label | c | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | semmle.label | __synth__3 [element 1] | -| array_flow.rb:81:15:81:15 | __synth__3 [element 1] | semmle.label | __synth__3 [element 1] | -| array_flow.rb:81:15:81:15 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:81:15:81:15 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:83:10:83:10 | c | semmle.label | c | -| array_flow.rb:83:10:83:10 | c | semmle.label | c | -| array_flow.rb:88:5:88:5 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:88:5:88:5 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:88:13:88:22 | call to source | semmle.label | call to source | -| array_flow.rb:88:13:88:22 | call to source | semmle.label | call to source | -| array_flow.rb:89:5:89:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:89:5:89:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:89:9:89:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:89:9:89:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:89:9:89:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:91:10:91:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:91:10:91:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:91:10:91:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:91:10:91:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:92:10:92:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:92:10:92:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:96:5:96:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:96:5:96:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:96:13:96:22 | call to source | semmle.label | call to source | | array_flow.rb:96:13:96:22 | call to source | semmle.label | call to source | | array_flow.rb:97:5:97:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:97:5:97:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:97:9:97:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:97:9:97:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:97:9:97:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:99:10:99:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:99:10:99:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:99:10:99:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:99:10:99:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:101:10:101:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:101:10:101:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:103:5:103:5 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:103:5:103:5 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:103:13:103:24 | call to source | semmle.label | call to source | -| array_flow.rb:103:13:103:24 | call to source | semmle.label | call to source | -| array_flow.rb:104:5:104:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:104:5:104:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:104:9:104:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:104:9:104:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:104:9:104:16 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:106:10:106:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:106:10:106:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:109:5:109:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:109:5:109:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:109:5:109:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:109:5:109:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:109:13:109:24 | call to source | semmle.label | call to source | -| array_flow.rb:109:13:109:24 | call to source | semmle.label | call to source | -| array_flow.rb:109:30:109:41 | call to source | semmle.label | call to source | | array_flow.rb:109:30:109:41 | call to source | semmle.label | call to source | | array_flow.rb:110:5:110:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:110:5:110:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:110:9:110:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:110:9:110:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:110:9:110:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:110:9:110:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:110:9:110:18 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:110:9:110:18 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:111:10:111:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:111:10:111:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:111:10:111:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:111:10:111:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:112:10:112:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:112:10:112:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:114:5:114:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:114:5:114:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:114:9:114:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:114:9:114:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:114:9:114:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:114:9:114:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:114:9:114:19 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:114:9:114:19 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:115:10:115:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:115:10:115:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:115:10:115:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:115:10:115:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:116:10:116:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:116:10:116:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:116:10:116:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:116:10:116:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:121:5:121:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:121:5:121:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:121:15:121:24 | call to source | semmle.label | call to source | | array_flow.rb:121:15:121:24 | call to source | semmle.label | call to source | | array_flow.rb:122:10:122:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:122:10:122:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:122:10:122:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:122:10:122:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:123:10:123:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:123:10:123:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:123:10:123:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:123:10:123:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:124:10:124:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:124:10:124:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:124:10:124:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:124:10:124:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:129:5:129:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:129:5:129:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:129:19:129:28 | call to source | semmle.label | call to source | | array_flow.rb:129:19:129:28 | call to source | semmle.label | call to source | | array_flow.rb:130:10:130:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:130:10:130:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:130:10:130:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:130:10:130:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:131:10:131:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:131:10:131:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:131:10:131:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:131:10:131:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:132:10:132:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:132:10:132:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:132:10:132:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:132:10:132:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:137:5:137:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:137:5:137:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:137:15:137:24 | call to source | semmle.label | call to source | | array_flow.rb:137:15:137:24 | call to source | semmle.label | call to source | | array_flow.rb:138:10:138:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:138:10:138:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:138:10:138:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:138:10:138:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:139:10:139:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:139:10:139:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:139:10:139:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:139:10:139:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:140:10:140:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:140:10:140:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:140:10:140:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:140:10:140:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:145:5:145:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:145:5:145:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:145:19:145:28 | call to source | semmle.label | call to source | | array_flow.rb:145:19:145:28 | call to source | semmle.label | call to source | | array_flow.rb:146:10:146:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:146:10:146:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:146:10:146:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:146:10:146:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:147:10:147:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:147:10:147:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:147:10:147:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:147:10:147:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:148:10:148:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:148:10:148:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:152:5:152:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:152:5:152:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:152:16:152:25 | call to source | semmle.label | call to source | | array_flow.rb:152:16:152:25 | call to source | semmle.label | call to source | | array_flow.rb:153:5:153:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:153:5:153:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:153:16:153:16 | x | semmle.label | x | | array_flow.rb:153:16:153:16 | x | semmle.label | x | | array_flow.rb:154:14:154:14 | x | semmle.label | x | -| array_flow.rb:154:14:154:14 | x | semmle.label | x | -| array_flow.rb:159:5:159:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:159:5:159:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:159:16:159:25 | call to source | semmle.label | call to source | -| array_flow.rb:159:16:159:25 | call to source | semmle.label | call to source | -| array_flow.rb:160:5:160:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:160:5:160:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:160:16:160:16 | x | semmle.label | x | -| array_flow.rb:160:16:160:16 | x | semmle.label | x | -| array_flow.rb:161:14:161:14 | x | semmle.label | x | | array_flow.rb:161:14:161:14 | x | semmle.label | x | | array_flow.rb:166:5:166:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:166:5:166:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:166:10:166:21 | call to source | semmle.label | call to source | | array_flow.rb:166:10:166:21 | call to source | semmle.label | call to source | | array_flow.rb:167:5:167:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:167:5:167:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:167:5:167:5 | b [element] | semmle.label | b [element] | | array_flow.rb:167:5:167:5 | b [element] | semmle.label | b [element] | | array_flow.rb:167:9:167:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:167:9:167:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:167:9:167:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:167:9:167:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:167:9:167:44 | call to append [element 0] | semmle.label | call to append [element 0] | -| array_flow.rb:167:9:167:44 | call to append [element 0] | semmle.label | call to append [element 0] | -| array_flow.rb:167:9:167:44 | call to append [element] | semmle.label | call to append [element] | | array_flow.rb:167:9:167:44 | call to append [element] | semmle.label | call to append [element] | | array_flow.rb:167:18:167:29 | call to source | semmle.label | call to source | -| array_flow.rb:167:18:167:29 | call to source | semmle.label | call to source | -| array_flow.rb:167:32:167:43 | call to source | semmle.label | call to source | | array_flow.rb:167:32:167:43 | call to source | semmle.label | call to source | | array_flow.rb:168:10:168:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:168:10:168:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:168:10:168:10 | a [element] | semmle.label | a [element] | | array_flow.rb:168:10:168:10 | a [element] | semmle.label | a [element] | | array_flow.rb:168:10:168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:168:10:168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:169:10:169:10 | a [element] | semmle.label | a [element] | | array_flow.rb:169:10:169:10 | a [element] | semmle.label | a [element] | | array_flow.rb:169:10:169:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:169:10:169:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:170:10:170:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:170:10:170:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:170:10:170:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:170:10:170:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:170:10:170:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:170:10:170:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:171:10:171:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:171:10:171:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:171:10:171: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 | ( ... ) | -| array_flow.rb:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:179:11:179:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | | array_flow.rb:179:11:179:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | | array_flow.rb:179:11:179:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | -| array_flow.rb:179:11:179:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | -| array_flow.rb:179:11:179:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:179:11:179:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:180:10:180:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:180:10:180:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:180:11:180:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | | array_flow.rb:180:11:180:11 | d [element 2, element 1] | semmle.label | d [element 2, element 1] | | array_flow.rb:180:11:180:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | -| array_flow.rb:180:11:180:22 | call to assoc [element 1] | semmle.label | call to assoc [element 1] | -| array_flow.rb:180:11:180:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:180:11:180:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:184:5:184:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:184:5:184:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:184:13:184:22 | call to source | semmle.label | call to source | | array_flow.rb:184:13:184:22 | call to source | semmle.label | call to source | | array_flow.rb:186:10:186:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:186:10:186:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:186:10:186:16 | call to at | semmle.label | call to at | | array_flow.rb:186:10:186:16 | call to at | semmle.label | call to at | | array_flow.rb:188:10:188:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:188:10:188:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:188:10:188:16 | call to at | semmle.label | call to at | | array_flow.rb:188:10:188:16 | call to at | semmle.label | call to at | | array_flow.rb:192:5:192:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:192:5:192:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:192:16:192:25 | call to source | semmle.label | call to source | | array_flow.rb:192:16:192:25 | call to source | semmle.label | call to source | | array_flow.rb:193:5:193:5 | b | semmle.label | b | -| array_flow.rb:193:5:193:5 | b | semmle.label | b | -| array_flow.rb:193:9:193:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:193:9:193:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:193:9:195:7 | call to bsearch | semmle.label | call to bsearch | -| array_flow.rb:193:9:195:7 | call to bsearch | semmle.label | call to bsearch | -| array_flow.rb:193:23:193:23 | x | semmle.label | x | | array_flow.rb:193:23:193:23 | x | semmle.label | x | | array_flow.rb:194:14:194:14 | x | semmle.label | x | -| array_flow.rb:194:14:194:14 | x | semmle.label | x | -| array_flow.rb:196:10:196:10 | b | semmle.label | b | | array_flow.rb:196:10:196:10 | b | semmle.label | b | | array_flow.rb:200:5:200:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:200:5:200:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:200:16:200:25 | call to source | semmle.label | call to source | | array_flow.rb:200:16:200:25 | call to source | semmle.label | call to source | | array_flow.rb:201:9:201:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:201:9:201:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:201:29:201:29 | x | semmle.label | x | | array_flow.rb:201:29:201:29 | x | semmle.label | x | | array_flow.rb:202:14:202:14 | x | semmle.label | x | -| array_flow.rb:202:14:202:14 | x | semmle.label | x | -| array_flow.rb:208:5:208:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:208:5:208:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:208:16:208:25 | call to source | semmle.label | call to source | -| array_flow.rb:208:16:208:25 | call to source | semmle.label | call to source | -| array_flow.rb:209:5:209:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:209:5:209:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:209:17:209:17 | x | semmle.label | x | -| array_flow.rb:209:17:209:17 | x | semmle.label | x | -| array_flow.rb:210:14:210:14 | x | semmle.label | x | | array_flow.rb:210:14:210:14 | x | semmle.label | x | | array_flow.rb:215:5:215:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:215:5:215:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:215:5:215:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:215:5:215:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:215:16:215:27 | call to source | semmle.label | call to source | -| array_flow.rb:215:16:215:27 | call to source | semmle.label | call to source | -| array_flow.rb:215:30:215:41 | call to source | semmle.label | call to source | | array_flow.rb:215:30:215:41 | call to source | semmle.label | call to source | | array_flow.rb:216:9:216:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:216:9:216:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:216:9:216:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:216:9:216:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:216:27:216:27 | x | semmle.label | x | -| array_flow.rb:216:27:216:27 | x | semmle.label | x | -| array_flow.rb:216:30:216:30 | y | semmle.label | y | | array_flow.rb:216:30:216:30 | y | semmle.label | y | | array_flow.rb:217:14:217:14 | x | semmle.label | x | -| array_flow.rb:217:14:217:14 | x | semmle.label | x | -| array_flow.rb:218:14:218:14 | y | semmle.label | y | | array_flow.rb:218:14:218:14 | y | semmle.label | y | | array_flow.rb:231:5:231:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:231:5:231:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:231:16:231:27 | call to source | semmle.label | call to source | | array_flow.rb:231:16:231:27 | call to source | semmle.label | call to source | | array_flow.rb:232:5:232:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:232:5:232:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:232:9:232:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:232:9:232:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:232:9:235:7 | call to collect [element] | semmle.label | call to collect [element] | -| array_flow.rb:232:9:235:7 | call to collect [element] | semmle.label | call to collect [element] | -| array_flow.rb:232:23:232:23 | x | semmle.label | x | | array_flow.rb:232:23:232:23 | x | semmle.label | x | | array_flow.rb:233:14:233:14 | x | semmle.label | x | -| array_flow.rb:233:14:233:14 | x | semmle.label | x | -| array_flow.rb:234:9:234:19 | call to source | semmle.label | call to source | | array_flow.rb:234:9:234:19 | call to source | semmle.label | call to source | | array_flow.rb:236:10:236:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:236:10:236:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:240:5:240:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:240:5:240:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:240:16:240:27 | call to source | semmle.label | call to source | | array_flow.rb:240:16:240:27 | call to source | semmle.label | call to source | | array_flow.rb:241:5:241:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:241:5:241:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:241:9:241:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:241:9:241:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:241:9:241:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:241:9:241:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:241:9:244:7 | call to collect! [element] | semmle.label | call to collect! [element] | | array_flow.rb:241:9:244:7 | call to collect! [element] | semmle.label | call to collect! [element] | | array_flow.rb:241:24:241:24 | x | semmle.label | x | -| array_flow.rb:241:24:241:24 | x | semmle.label | x | -| array_flow.rb:242:14:242:14 | x | semmle.label | x | | array_flow.rb:242:14:242:14 | x | semmle.label | x | | array_flow.rb:243:9:243:19 | call to source | semmle.label | call to source | -| array_flow.rb:243:9:243:19 | call to source | semmle.label | call to source | -| array_flow.rb:245:10:245:10 | a [element] | semmle.label | a [element] | | array_flow.rb:245:10:245:10 | a [element] | semmle.label | a [element] | | array_flow.rb:245:10:245:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:245:10:245:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:246:10:246:10 | b [element] | semmle.label | b [element] | | array_flow.rb:246:10:246:10 | b [element] | semmle.label | b [element] | | array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:250:5:250:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:250:5:250:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:250:16:250:27 | call to source | semmle.label | call to source | -| array_flow.rb:250:16:250:27 | call to source | semmle.label | call to source | -| array_flow.rb:251:5:251:5 | b [element] | semmle.label | b [element] | | array_flow.rb:251:5:251:5 | b [element] | semmle.label | b [element] | | array_flow.rb:251:9:251:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:251:9:251:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | | array_flow.rb:251:9:254:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | | array_flow.rb:251:30:251:30 | x | semmle.label | x | -| array_flow.rb:251:30:251:30 | x | semmle.label | x | -| array_flow.rb:252:14:252:14 | x | semmle.label | x | | array_flow.rb:252:14:252:14 | x | semmle.label | x | | array_flow.rb:253:13:253:24 | call to source | semmle.label | call to source | -| array_flow.rb:253:13:253:24 | call to source | semmle.label | call to source | -| array_flow.rb:255:10:255:10 | b [element] | semmle.label | b [element] | | array_flow.rb:255:10:255:10 | b [element] | semmle.label | b [element] | | array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:256:5:256:5 | b [element] | semmle.label | b [element] | | array_flow.rb:256:5:256:5 | b [element] | semmle.label | b [element] | | array_flow.rb:256:9:256:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:256:9:256:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | | array_flow.rb:256:9:259:7 | call to collect_concat [element] | semmle.label | call to collect_concat [element] | | array_flow.rb:256:30:256:30 | x | semmle.label | x | -| array_flow.rb:256:30:256:30 | x | semmle.label | x | -| array_flow.rb:257:14:257:14 | x | semmle.label | x | | array_flow.rb:257:14:257:14 | x | semmle.label | x | | array_flow.rb:258:9:258:20 | call to source | semmle.label | call to source | -| array_flow.rb:258:9:258:20 | call to source | semmle.label | call to source | -| array_flow.rb:260:10:260:10 | b [element] | semmle.label | b [element] | | array_flow.rb:260:10:260:10 | b [element] | semmle.label | b [element] | | array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:264:5:264:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:264:5:264:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:264:16:264:25 | call to source | semmle.label | call to source | -| array_flow.rb:264:16:264:25 | call to source | semmle.label | call to source | -| array_flow.rb:265:5:265:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:265:5:265:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:265:9:265:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:265:9:265:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:265:9:267:7 | call to combination [element 2] | semmle.label | call to combination [element 2] | | array_flow.rb:265:9:267:7 | call to combination [element 2] | semmle.label | call to combination [element 2] | | array_flow.rb:265:30:265:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:265:30:265:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:266:14:266:14 | x [element] | semmle.label | x [element] | | array_flow.rb:266:14:266:14 | x [element] | semmle.label | x [element] | | array_flow.rb:266:14:266:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:266:14:266:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:269:10:269:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:269:10:269:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:273:5:273:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:273:5:273:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:273:16:273:25 | call to source | semmle.label | call to source | -| array_flow.rb:273:16:273:25 | call to source | semmle.label | call to source | -| array_flow.rb:274:5:274:5 | b [element] | semmle.label | b [element] | | array_flow.rb:274:5:274:5 | b [element] | semmle.label | b [element] | | array_flow.rb:274:9:274:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:274:9:274:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:274:9:274:17 | call to compact [element] | semmle.label | call to compact [element] | | array_flow.rb:274:9:274:17 | call to compact [element] | semmle.label | call to compact [element] | | array_flow.rb:275:10:275:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:275:10:275:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:279:5:279:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:279:5:279:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:279:16:279:25 | call to source | semmle.label | call to source | | array_flow.rb:279:16:279:25 | call to source | semmle.label | call to source | | array_flow.rb:280:5:280:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:280:5:280:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:280:9:280:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:280:9:280:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:280:9:280:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:280:9:280:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:280:9:280:18 | call to compact! [element] | semmle.label | call to compact! [element] | | array_flow.rb:280:9:280:18 | call to compact! [element] | semmle.label | call to compact! [element] | | array_flow.rb:281:10:281:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:281:10:281:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:282:10:282:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:282:10:282:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:286:5:286:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:286:5:286:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:286:16:286:27 | call to source | semmle.label | call to source | | array_flow.rb:286:16:286:27 | call to source | semmle.label | call to source | | array_flow.rb:287:5:287:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:287:5:287:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:287:16:287:27 | call to source | semmle.label | call to source | | array_flow.rb:287:16:287:27 | call to source | semmle.label | call to source | | array_flow.rb:288:5:288:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:288:5:288:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:288:14:288:14 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:288:14:288:14 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:289:10:289:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:289:10:289:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:289:10:289:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:289:10:289:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:290:10:290:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:290:10:290:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:290:10:290:10 | a [element] | semmle.label | a [element] | | array_flow.rb:290:10:290:10 | a [element] | semmle.label | a [element] | | array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:294:5:294:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:294:5:294:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:294:16:294:25 | call to source | semmle.label | call to source | -| array_flow.rb:294:16:294:25 | call to source | semmle.label | call to source | -| array_flow.rb:295:5:295:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:295:5:295:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:295:17:295:17 | x | semmle.label | x | -| array_flow.rb:295:17:295:17 | x | semmle.label | x | -| array_flow.rb:296:14:296:14 | x | semmle.label | x | | array_flow.rb:296:14:296:14 | x | semmle.label | x | | array_flow.rb:301:5:301:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:301:5:301:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:301:16:301:25 | call to source | semmle.label | call to source | | array_flow.rb:301:16:301:25 | call to source | semmle.label | call to source | | array_flow.rb:302:5:302:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:302:5:302:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:302:20:302:20 | x | semmle.label | x | | array_flow.rb:302:20:302:20 | x | semmle.label | x | | array_flow.rb:303:14:303:14 | x | semmle.label | x | -| array_flow.rb:303:14:303:14 | x | semmle.label | x | -| array_flow.rb:308:5:308:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:308:5:308:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:308:16:308:25 | call to source | semmle.label | call to source | -| array_flow.rb:308:16:308:25 | call to source | semmle.label | call to source | -| array_flow.rb:309:5:309:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:309:5:309:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:309:9:309:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:309:9:309:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | semmle.label | call to deconstruct [element 2] | | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] | semmle.label | call to deconstruct [element 2] | | array_flow.rb:312:10:312:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:312:10:312:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:316:5:316:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:316:5:316:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:316:16:316:27 | call to source | semmle.label | call to source | | array_flow.rb:316:16:316:27 | call to source | semmle.label | call to source | | array_flow.rb:317:5:317:5 | b | semmle.label | b | -| array_flow.rb:317:5:317:5 | b | semmle.label | b | -| array_flow.rb:317:9:317:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:317:9:317:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:317:9:317:36 | call to delete | semmle.label | call to delete | -| array_flow.rb:317:9:317:36 | call to delete | semmle.label | call to delete | -| array_flow.rb:317:23:317:34 | call to source | semmle.label | call to source | | array_flow.rb:317:23:317:34 | call to source | semmle.label | call to source | | array_flow.rb:318:10:318:10 | b | semmle.label | b | -| array_flow.rb:318:10:318:10 | b | semmle.label | b | -| array_flow.rb:325:5:325:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:325:5:325:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:325:5:325:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:325:5:325:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:325:16:325:27 | call to source | semmle.label | call to source | | array_flow.rb:325:16:325:27 | call to source | semmle.label | call to source | | array_flow.rb:325:30:325:41 | call to source | semmle.label | call to source | -| array_flow.rb:325:30:325:41 | call to source | semmle.label | call to source | -| array_flow.rb:326:5:326:5 | b | semmle.label | b | | array_flow.rb:326:5:326:5 | b | semmle.label | b | | array_flow.rb:326:9:326:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:326:9:326:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:326:9:326:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:326:9:326:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:326:9:326:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:326:9:326:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:326:9:326:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:326:9:326:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:327:10:327:10 | b | semmle.label | b | -| array_flow.rb:327:10:327:10 | b | semmle.label | b | -| array_flow.rb:328:10:328:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:328:10:328:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:330:5:330:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:330:5:330:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:330:5:330:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:330:5:330:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:330:16:330:27 | call to source | semmle.label | call to source | | array_flow.rb:330:16:330:27 | call to source | semmle.label | call to source | | array_flow.rb:330:30:330:41 | call to source | semmle.label | call to source | -| array_flow.rb:330:30:330:41 | call to source | semmle.label | call to source | -| array_flow.rb:331:5:331:5 | b | semmle.label | b | | array_flow.rb:331:5:331:5 | b | semmle.label | b | | array_flow.rb:331:9:331:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:331:9:331:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:331:9:331:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:331:9:331:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:331:9:331:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:331:9:331:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:331:9:331:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:331:9:331:22 | call to delete_at | semmle.label | call to delete_at | | array_flow.rb:332:10:332:10 | b | semmle.label | b | -| array_flow.rb:332:10:332:10 | b | semmle.label | b | -| array_flow.rb:333:10:333:10 | a [element] | semmle.label | a [element] | | array_flow.rb:333:10:333:10 | a [element] | semmle.label | a [element] | | array_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:334:10:334:10 | a [element] | semmle.label | a [element] | | array_flow.rb:334:10:334:10 | a [element] | semmle.label | a [element] | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:338:5:338:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:338:5:338:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:338:16:338:25 | call to source | semmle.label | call to source | -| array_flow.rb:338:16:338:25 | call to source | semmle.label | call to source | -| array_flow.rb:339:5:339:5 | b [element] | semmle.label | b [element] | | array_flow.rb:339:5:339:5 | b [element] | semmle.label | b [element] | | array_flow.rb:339:9:339:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:339:9:339:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:339:9:339:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:339:9:339:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:339:9:341:7 | call to delete_if [element] | semmle.label | call to delete_if [element] | -| array_flow.rb:339:9:341:7 | call to delete_if [element] | semmle.label | call to delete_if [element] | -| array_flow.rb:339:25:339:25 | x | semmle.label | x | | array_flow.rb:339:25:339:25 | x | semmle.label | x | | array_flow.rb:340:14:340:14 | x | semmle.label | x | -| array_flow.rb:340:14:340:14 | x | semmle.label | x | -| array_flow.rb:342:10:342:10 | b [element] | semmle.label | b [element] | | array_flow.rb:342:10:342:10 | b [element] | semmle.label | b [element] | | array_flow.rb:342:10:342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:342:10:342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:343:10:343:10 | a [element] | semmle.label | a [element] | | array_flow.rb:343:10:343:10 | a [element] | semmle.label | a [element] | | array_flow.rb:343:10:343:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:343:10:343:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:344:10:344:10 | a [element] | semmle.label | a [element] | | array_flow.rb:344:10:344:10 | a [element] | semmle.label | a [element] | | array_flow.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:345:10:345:10 | a [element] | semmle.label | a [element] | | array_flow.rb:345:10:345:10 | a [element] | semmle.label | a [element] | | array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:349:5:349:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:349:5:349:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:349:16:349:25 | call to source | semmle.label | call to source | -| array_flow.rb:349:16:349:25 | call to source | semmle.label | call to source | -| array_flow.rb:350:5:350:5 | b [element] | semmle.label | b [element] | | array_flow.rb:350:5:350:5 | b [element] | semmle.label | b [element] | | array_flow.rb:350:9:350:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:350:9:350:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:350:9:350:25 | call to difference [element] | semmle.label | call to difference [element] | | array_flow.rb:350:9:350:25 | call to difference [element] | semmle.label | call to difference [element] | | array_flow.rb:351:10:351:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:351:10:351:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:355:5:355:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:355:5:355:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:355:5:355:5 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | | array_flow.rb:355:5:355:5 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | | array_flow.rb:355:16:355:27 | call to source | semmle.label | call to source | -| array_flow.rb:355:16:355:27 | call to source | semmle.label | call to source | -| array_flow.rb:355:34:355:45 | call to source | semmle.label | call to source | | array_flow.rb:355:34:355:45 | call to source | semmle.label | call to source | | array_flow.rb:357:10:357:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:357:10:357:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:357:10:357:17 | call to dig | semmle.label | call to dig | | array_flow.rb:357:10:357:17 | call to dig | semmle.label | call to dig | | array_flow.rb:358:10:358:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:358:10:358:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:358:10:358:17 | call to dig | semmle.label | call to dig | | array_flow.rb:358:10:358:17 | call to dig | semmle.label | call to dig | | array_flow.rb:360:10:360:10 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | -| array_flow.rb:360:10:360:10 | a [element 3, element 1] | semmle.label | a [element 3, element 1] | -| array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | | array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | | array_flow.rb:364:5:364:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:364:5:364:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:364:16:364:27 | call to source | semmle.label | call to source | | array_flow.rb:364:16:364:27 | call to source | semmle.label | call to source | | array_flow.rb:365:5:365:5 | b | semmle.label | b | -| array_flow.rb:365:5:365:5 | b | semmle.label | b | -| array_flow.rb:365:9:365:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:365:9:365:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:365:9:367:7 | call to detect | semmle.label | call to detect | -| array_flow.rb:365:9:367:7 | call to detect | semmle.label | call to detect | -| array_flow.rb:365:23:365:34 | call to source | semmle.label | call to source | | array_flow.rb:365:23:365:34 | call to source | semmle.label | call to source | | array_flow.rb:365:43:365:43 | x | semmle.label | x | -| array_flow.rb:365:43:365:43 | x | semmle.label | x | -| array_flow.rb:366:14:366:14 | x | semmle.label | x | | array_flow.rb:366:14:366:14 | x | semmle.label | x | | array_flow.rb:368:10:368:10 | b | semmle.label | b | -| array_flow.rb:368:10:368:10 | b | semmle.label | b | -| array_flow.rb:372:5:372:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:372:5:372:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:372:5:372:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:372:5:372:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:372:16:372:27 | call to source | semmle.label | call to source | | array_flow.rb:372:16:372:27 | call to source | semmle.label | call to source | | array_flow.rb:372:30:372:41 | call to source | semmle.label | call to source | -| array_flow.rb:372:30:372:41 | call to source | semmle.label | call to source | -| array_flow.rb:373:5:373:5 | b [element] | semmle.label | b [element] | | array_flow.rb:373:5:373:5 | b [element] | semmle.label | b [element] | | array_flow.rb:373:9:373:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:373:9:373:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:373:9:373:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:373:9:373:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:373:9:373:17 | call to drop [element] | semmle.label | call to drop [element] | -| array_flow.rb:373:9:373:17 | call to drop [element] | semmle.label | call to drop [element] | -| array_flow.rb:374:10:374:10 | b [element] | semmle.label | b [element] | | array_flow.rb:374:10:374:10 | b [element] | semmle.label | b [element] | | array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:375:5:375:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:375:5:375:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:375:5:375:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:375:5:375:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:375:9:375:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:375:9:375:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:375:9:375:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:375:9:375:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:375:9:375:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | | array_flow.rb:375:9:375:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | | array_flow.rb:375:9:375:17 | call to drop [element 2] | semmle.label | call to drop [element 2] | -| array_flow.rb:375:9:375:17 | call to drop [element 2] | semmle.label | call to drop [element 2] | -| array_flow.rb:377:10:377:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:377:10:377:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:378:10:378:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:378:10:378:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:378:10:378:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:378:10:378:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:379:5:379:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:379:5:379:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:379:12:379:23 | call to source | semmle.label | call to source | | array_flow.rb:379:12:379:23 | call to source | semmle.label | call to source | | array_flow.rb:380:5:380:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:380:5:380:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:380:5:380:5 | b [element] | semmle.label | b [element] | | array_flow.rb:380:5:380:5 | b [element] | semmle.label | b [element] | | array_flow.rb:380:9:380:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:380:9:380:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:380:9:380:9 | a [element] | semmle.label | a [element] | | array_flow.rb:380:9:380:9 | a [element] | semmle.label | a [element] | | array_flow.rb:380:9:380:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | -| array_flow.rb:380:9:380:17 | call to drop [element 1] | semmle.label | call to drop [element 1] | -| array_flow.rb:380:9:380:17 | call to drop [element] | semmle.label | call to drop [element] | | array_flow.rb:380:9:380:17 | call to drop [element] | semmle.label | call to drop [element] | | array_flow.rb:381:10:381:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:381:10:381:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:381:10:381:10 | b [element] | semmle.label | b [element] | | array_flow.rb:381:10:381:10 | b [element] | semmle.label | b [element] | | array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:382:5:382:5 | c [element] | semmle.label | c [element] | | array_flow.rb:382:5:382:5 | c [element] | semmle.label | c [element] | | array_flow.rb:382:9:382:9 | b [element] | semmle.label | b [element] | -| array_flow.rb:382:9:382:9 | b [element] | semmle.label | b [element] | -| array_flow.rb:382:9:382:19 | call to drop [element] | semmle.label | call to drop [element] | | array_flow.rb:382:9:382:19 | call to drop [element] | semmle.label | call to drop [element] | | array_flow.rb:383:10:383:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:383:10:383:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:387:5:387:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:387:5:387:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:387:5:387:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:387:5:387:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:387:16:387:27 | call to source | semmle.label | call to source | -| array_flow.rb:387:16:387:27 | call to source | semmle.label | call to source | -| array_flow.rb:387:30:387:41 | call to source | semmle.label | call to source | | array_flow.rb:387:30:387:41 | call to source | semmle.label | call to source | | array_flow.rb:388:5:388:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:388:5:388:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:388:9:388:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:388:9:388:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:388:9:388:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:388:9:388:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:388:9:390:7 | call to drop_while [element] | semmle.label | call to drop_while [element] | | array_flow.rb:388:9:390:7 | call to drop_while [element] | semmle.label | call to drop_while [element] | | array_flow.rb:388:26:388:26 | x | semmle.label | x | -| array_flow.rb:388:26:388:26 | x | semmle.label | x | -| array_flow.rb:389:14:389:14 | x | semmle.label | x | | array_flow.rb:389:14:389:14 | x | semmle.label | x | | array_flow.rb:391:10:391:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:391:10:391:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:395:5:395:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:395:5:395:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:395:16:395:25 | call to source | semmle.label | call to source | | array_flow.rb:395:16:395:25 | call to source | semmle.label | call to source | | array_flow.rb:396:5:396:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:396:5:396:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:396:9:396:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:396:9:396:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:396:9:398:7 | call to each [element 2] | semmle.label | call to each [element 2] | -| array_flow.rb:396:9:398:7 | call to each [element 2] | semmle.label | call to each [element 2] | -| array_flow.rb:396:20:396:20 | x | semmle.label | x | | array_flow.rb:396:20:396:20 | x | semmle.label | x | | array_flow.rb:397:14:397:14 | x | semmle.label | x | -| array_flow.rb:397:14:397:14 | x | semmle.label | x | -| array_flow.rb:399:10:399:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:399:10:399:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:403:5:403:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:403:5:403:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:403:16:403:25 | call to source | semmle.label | call to source | -| array_flow.rb:403:16:403:25 | call to source | semmle.label | call to source | -| array_flow.rb:404:5:404:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:404:5:404:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:404:9:406:7 | __synth__0__1 | semmle.label | __synth__0__1 | -| array_flow.rb:404:9:406:7 | __synth__0__1 | semmle.label | __synth__0__1 | -| array_flow.rb:404:13:404:13 | x | semmle.label | x | | array_flow.rb:404:13:404:13 | x | semmle.label | x | | array_flow.rb:404:18:404:18 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:404:18:404:18 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:405:14:405:14 | x | semmle.label | x | | array_flow.rb:405:14:405:14 | x | semmle.label | x | | array_flow.rb:407:10:407:10 | x | semmle.label | x | -| array_flow.rb:407:10:407:10 | x | semmle.label | x | -| array_flow.rb:408:10:408:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:408:10:408:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:412:5:412:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:412:5:412:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:412:16:412:25 | call to source | semmle.label | call to source | -| array_flow.rb:412:16:412:25 | call to source | semmle.label | call to source | -| array_flow.rb:413:5:413:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:413:5:413:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:413:24:413:24 | x [element] | semmle.label | x [element] | -| array_flow.rb:413:24:413:24 | x [element] | semmle.label | x [element] | -| array_flow.rb:414:14:414:19 | ( ... ) | semmle.label | ( ... ) | | array_flow.rb:414:14:414:19 | ( ... ) | semmle.label | ( ... ) | | array_flow.rb:414:15:414:15 | x [element] | semmle.label | x [element] | -| array_flow.rb:414:15:414:15 | x [element] | semmle.label | x [element] | -| array_flow.rb:414:15:414:18 | ...[...] | semmle.label | ...[...] | | array_flow.rb:414:15:414:18 | ...[...] | semmle.label | ...[...] | | array_flow.rb:419:5:419:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:419:5:419:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:419:16:419:25 | call to source | semmle.label | call to source | | array_flow.rb:419:16:419:25 | call to source | semmle.label | call to source | | array_flow.rb:420:5:420:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:420:5:420:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:420:9:420:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:420:9:420:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:420:9:422:7 | call to each_entry [element 2] | semmle.label | call to each_entry [element 2] | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] | semmle.label | call to each_entry [element 2] | -| array_flow.rb:420:26:420:26 | x | semmle.label | x | | array_flow.rb:420:26:420:26 | x | semmle.label | x | | array_flow.rb:421:14:421:14 | x | semmle.label | x | -| array_flow.rb:421:14:421:14 | x | semmle.label | x | -| array_flow.rb:423:10:423:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:423:10:423:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:427:5:427:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:427:5:427:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:427:16:427:25 | call to source | semmle.label | call to source | -| array_flow.rb:427:16:427:25 | call to source | semmle.label | call to source | -| array_flow.rb:428:5:428:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:428:5:428:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:428:9:428:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:428:9:428:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] | semmle.label | call to each_index [element 2] | | array_flow.rb:428:9:430:7 | call to each_index [element 2] | semmle.label | call to each_index [element 2] | | array_flow.rb:431:10:431:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:431:10:431:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:435:5:435:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:435:5:435:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:435:19:435:28 | call to source | semmle.label | call to source | | array_flow.rb:435:19:435:28 | call to source | semmle.label | call to source | | array_flow.rb:436:5:436:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:436:5:436:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:436:25:436:25 | x [element] | semmle.label | x [element] | | array_flow.rb:436:25:436:25 | x [element] | semmle.label | x [element] | | array_flow.rb:437:14:437:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:437:14:437:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:442:5:442:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:442:5:442:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:442:19:442:28 | call to source | semmle.label | call to source | | array_flow.rb:442:19:442:28 | call to source | semmle.label | call to source | | array_flow.rb:443:5:443:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:443:5:443:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:443:9:443:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:443:9:443:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | semmle.label | call to each_with_index [element 3] | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] | semmle.label | call to each_with_index [element 3] | -| array_flow.rb:443:31:443:31 | x | semmle.label | x | | array_flow.rb:443:31:443:31 | x | semmle.label | x | | array_flow.rb:444:14:444:14 | x | semmle.label | x | -| array_flow.rb:444:14:444:14 | x | semmle.label | x | -| array_flow.rb:447:10:447:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:447:10:447:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:451:5:451:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:451:5:451:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:451:19:451:30 | call to source | semmle.label | call to source | -| array_flow.rb:451:19:451:30 | call to source | semmle.label | call to source | -| array_flow.rb:452:5:452:5 | b | semmle.label | b | | array_flow.rb:452:5:452:5 | b | semmle.label | b | | array_flow.rb:452:9:452:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:452:9:452:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:452:9:455:7 | call to each_with_object | semmle.label | call to each_with_object | | array_flow.rb:452:9:455:7 | call to each_with_object | semmle.label | call to each_with_object | | array_flow.rb:452:28:452:39 | call to source | semmle.label | call to source | -| array_flow.rb:452:28:452:39 | call to source | semmle.label | call to source | -| array_flow.rb:452:46:452:46 | x | semmle.label | x | | array_flow.rb:452:46:452:46 | x | semmle.label | x | | array_flow.rb:452:48:452:48 | a | semmle.label | a | -| array_flow.rb:452:48:452:48 | a | semmle.label | a | -| array_flow.rb:453:14:453:14 | x | semmle.label | x | | array_flow.rb:453:14:453:14 | x | semmle.label | x | | array_flow.rb:454:14:454:14 | a | semmle.label | a | -| array_flow.rb:454:14:454:14 | a | semmle.label | a | -| array_flow.rb:456:10:456:10 | b | semmle.label | b | | array_flow.rb:456:10:456:10 | b | semmle.label | b | | array_flow.rb:460:5:460:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:460:5:460:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:460:19:460:28 | call to source | semmle.label | call to source | | array_flow.rb:460:19:460:28 | call to source | semmle.label | call to source | | array_flow.rb:461:5:461:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:461:5:461:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:461:9:461:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:461:9:461:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:461:9:461:17 | call to entries [element 3] | semmle.label | call to entries [element 3] | -| array_flow.rb:461:9:461:17 | call to entries [element 3] | semmle.label | call to entries [element 3] | -| array_flow.rb:462:10:462:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:462:10:462:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:466:5:466:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:466:5:466:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:466:5:466:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:466:5:466:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:466:19:466:30 | call to source | semmle.label | call to source | | array_flow.rb:466:19:466:30 | call to source | semmle.label | call to source | | array_flow.rb:466:33:466:44 | call to source | semmle.label | call to source | -| array_flow.rb:466:33:466:44 | call to source | semmle.label | call to source | -| array_flow.rb:467:5:467:5 | b | semmle.label | b | | array_flow.rb:467:5:467:5 | b | semmle.label | b | | array_flow.rb:467:9:467:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:467:9:467:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:467:9:467:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:467:9:467:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:467:9:469:7 | call to fetch | semmle.label | call to fetch | -| array_flow.rb:467:9:469:7 | call to fetch | semmle.label | call to fetch | -| array_flow.rb:467:17:467:28 | call to source | semmle.label | call to source | | array_flow.rb:467:17:467:28 | call to source | semmle.label | call to source | | array_flow.rb:467:35:467:35 | x | semmle.label | x | -| array_flow.rb:467:35:467:35 | x | semmle.label | x | -| array_flow.rb:468:14:468:14 | x | semmle.label | x | | array_flow.rb:468:14:468:14 | x | semmle.label | x | | array_flow.rb:470:10:470:10 | b | semmle.label | b | -| array_flow.rb:470:10:470:10 | b | semmle.label | b | -| array_flow.rb:471:5:471:5 | b | semmle.label | b | | array_flow.rb:471:5:471:5 | b | semmle.label | b | | array_flow.rb:471:9:471:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:471:9:471:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:471:9:471:18 | call to fetch | semmle.label | call to fetch | | array_flow.rb:471:9:471:18 | call to fetch | semmle.label | call to fetch | | array_flow.rb:472:10:472:10 | b | semmle.label | b | -| array_flow.rb:472:10:472:10 | b | semmle.label | b | -| array_flow.rb:473:5:473:5 | b | semmle.label | b | | array_flow.rb:473:5:473:5 | b | semmle.label | b | | array_flow.rb:473:9:473:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:473:9:473:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:473:9:473:32 | call to fetch | semmle.label | call to fetch | | array_flow.rb:473:9:473:32 | call to fetch | semmle.label | call to fetch | | array_flow.rb:473:20:473:31 | call to source | semmle.label | call to source | -| array_flow.rb:473:20:473:31 | call to source | semmle.label | call to source | -| array_flow.rb: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] | -| array_flow.rb:477:9:477:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:477:9:477:32 | call to fetch | semmle.label | call to fetch | | array_flow.rb:477:9:477:32 | call to fetch | semmle.label | call to fetch | | array_flow.rb:477:20:477:31 | call to source | semmle.label | call to source | -| array_flow.rb:477:20:477:31 | call to source | semmle.label | call to source | -| array_flow.rb:478:10:478:10 | b | semmle.label | b | | array_flow.rb:478:10:478:10 | b | semmle.label | b | | array_flow.rb:482:5:482:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:482:5:482:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:482:19:482:30 | call to source | semmle.label | call to source | | array_flow.rb:482:19:482:30 | call to source | semmle.label | call to source | | array_flow.rb:483:5:483:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:483:5:483:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:483:12:483:23 | call to source | semmle.label | call to source | | array_flow.rb:483:12:483:23 | call to source | semmle.label | call to source | | array_flow.rb:484:10:484:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:484:10:484:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:484:10:484:10 | a [element] | semmle.label | a [element] | | array_flow.rb:484:10:484:10 | a [element] | semmle.label | a [element] | | array_flow.rb:484:10:484:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:484:10:484:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:485:5:485:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:485:5:485:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:485:12:485:23 | call to source | semmle.label | call to source | -| array_flow.rb:485:12:485:23 | call to source | semmle.label | call to source | -| array_flow.rb:486:10:486:10 | a [element] | semmle.label | a [element] | | array_flow.rb:486:10:486:10 | a [element] | semmle.label | a [element] | | array_flow.rb:486:10:486:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:486:10:486:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:487:5:487:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:487:5:487:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:488:9:488:20 | call to source | semmle.label | call to source | -| array_flow.rb:488:9:488:20 | call to source | semmle.label | call to source | -| array_flow.rb:490:10:490:10 | a [element] | semmle.label | a [element] | | array_flow.rb:490:10:490:10 | a [element] | semmle.label | a [element] | | array_flow.rb:490:10:490:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:490:10:490:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:491:5:491:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:491:5:491:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:492:9:492:20 | call to source | semmle.label | call to source | -| array_flow.rb:492:9:492:20 | call to source | semmle.label | call to source | -| array_flow.rb:494:10:494:10 | a [element] | semmle.label | a [element] | | array_flow.rb:494:10:494:10 | a [element] | semmle.label | a [element] | | array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:498:5:498:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:498:5:498:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:498:19:498:28 | call to source | semmle.label | call to source | -| array_flow.rb:498:19:498:28 | call to source | semmle.label | call to source | -| array_flow.rb:499:5:499:5 | b [element] | semmle.label | b [element] | | array_flow.rb:499:5:499:5 | b [element] | semmle.label | b [element] | | array_flow.rb:499:9:499:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:499:9:499:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:499:9:501:7 | call to filter [element] | semmle.label | call to filter [element] | | array_flow.rb:499:9:501:7 | call to filter [element] | semmle.label | call to filter [element] | | array_flow.rb:499:22:499:22 | x | semmle.label | x | -| array_flow.rb:499:22:499:22 | x | semmle.label | x | -| array_flow.rb:500:14:500:14 | x | semmle.label | x | | array_flow.rb:500:14:500:14 | x | semmle.label | x | | array_flow.rb:502:10:502:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:502:10:502:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:502:10:502: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:510:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | -| array_flow.rb:507:9:510:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | -| array_flow.rb:507:26:507:26 | x | semmle.label | x | | array_flow.rb:507:26:507:26 | x | semmle.label | x | | array_flow.rb:508:14:508:14 | x | semmle.label | x | -| array_flow.rb:508:14:508:14 | x | semmle.label | x | -| array_flow.rb:511:10:511:10 | b [element] | semmle.label | b [element] | | array_flow.rb:511:10:511:10 | b [element] | semmle.label | b [element] | | array_flow.rb:511:10:511:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:511:10:511:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:518:5:518:5 | d [element] | semmle.label | d [element] | | array_flow.rb:518:5:518:5 | d [element] | semmle.label | d [element] | | array_flow.rb:518:9:520:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | -| array_flow.rb:518:9:520:7 | call to filter_map [element] | semmle.label | call to filter_map [element] | -| array_flow.rb:519:9:519:20 | call to source | semmle.label | call to source | | array_flow.rb:519:9:519:20 | call to source | semmle.label | call to source | | array_flow.rb:521:10:521:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:521:10:521:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:521:10:521:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:521:10:521:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:525:5:525:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:525:5:525:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:525:19:525:28 | call to source | semmle.label | call to source | | array_flow.rb:525:19:525:28 | call to source | semmle.label | call to source | | array_flow.rb:526:5:526:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:526:5:526:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:526:9:526:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:526:9:526:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:526:9:526:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:526:9:526:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:526:9:529:7 | call to filter! [element] | semmle.label | call to filter! [element] | | array_flow.rb:526:9:529:7 | call to filter! [element] | semmle.label | call to filter! [element] | | array_flow.rb:526:23:526:23 | x | semmle.label | x | -| array_flow.rb:526:23:526:23 | x | semmle.label | x | -| array_flow.rb:527:14:527:14 | x | semmle.label | x | | array_flow.rb:527:14:527:14 | x | semmle.label | x | | array_flow.rb:530:10:530:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:530:10:530:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:530:10:530:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:530:10:530:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:531:10:531:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:531:10:531:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:531:10:531:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:531:10:531:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:535:5:535:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:535:5:535:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:535:19:535:30 | call to source | semmle.label | call to source | | array_flow.rb:535:19:535:30 | call to source | semmle.label | call to source | | array_flow.rb:536:5:536:5 | b | semmle.label | b | -| array_flow.rb:536:5:536:5 | b | semmle.label | b | -| array_flow.rb:536:9:536:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:536:9:536:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:536:9:538:7 | call to find | semmle.label | call to find | -| array_flow.rb:536:9:538:7 | call to find | semmle.label | call to find | -| array_flow.rb:536:21:536:32 | call to source | semmle.label | call to source | | array_flow.rb:536:21:536:32 | call to source | semmle.label | call to source | | array_flow.rb:536:41:536:41 | x | semmle.label | x | -| array_flow.rb:536:41:536:41 | x | semmle.label | x | -| array_flow.rb:537:14:537:14 | x | semmle.label | x | | array_flow.rb:537:14:537:14 | x | semmle.label | x | | array_flow.rb:539:10:539:10 | b | semmle.label | b | -| array_flow.rb:539:10:539:10 | b | semmle.label | b | -| array_flow.rb:543:5:543:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:543:5:543:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:543:19:543:28 | call to source | semmle.label | call to source | -| array_flow.rb:543:19:543:28 | call to source | semmle.label | call to source | -| array_flow.rb:544:5:544:5 | b [element] | semmle.label | b [element] | | array_flow.rb:544:5:544:5 | b [element] | semmle.label | b [element] | | array_flow.rb:544:9:544:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:544:9:544:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:544:9:546:7 | call to find_all [element] | semmle.label | call to find_all [element] | | array_flow.rb:544:9:546:7 | call to find_all [element] | semmle.label | call to find_all [element] | | array_flow.rb:544:24:544:24 | x | semmle.label | x | -| array_flow.rb:544:24:544:24 | x | semmle.label | x | -| array_flow.rb:545:14:545:14 | x | semmle.label | x | | array_flow.rb:545:14:545:14 | x | semmle.label | x | | array_flow.rb:547:10:547:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:547:10:547:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:547:10:547:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:547:10:547:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:551:5:551:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:551:5:551:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:551:19:551:28 | call to source | semmle.label | call to source | | array_flow.rb:551:19:551:28 | call to source | semmle.label | call to source | | array_flow.rb:552:5:552:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:552:5:552:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:552:22:552:22 | x | semmle.label | x | | array_flow.rb:552:22:552:22 | x | semmle.label | x | | array_flow.rb:553:14:553:14 | x | semmle.label | x | -| array_flow.rb:553:14:553:14 | x | semmle.label | x | -| array_flow.rb:558:5:558:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:558:5:558:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:558:5:558:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:558:5:558:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:558:10:558:21 | call to source | semmle.label | call to source | | array_flow.rb:558:10:558:21 | call to source | semmle.label | call to source | | array_flow.rb:558:30:558:41 | call to source | semmle.label | call to source | -| array_flow.rb:558:30:558:41 | call to source | semmle.label | call to source | -| array_flow.rb:559:5:559:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:559:5:559:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:559:12:559:23 | call to source | semmle.label | call to source | -| array_flow.rb:559:12:559:23 | call to source | semmle.label | call to source | -| array_flow.rb:560:10:560:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:560:10:560:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:560:10:560:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:560:10:560:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:560:10:560:16 | call to first | semmle.label | call to first | | array_flow.rb:560:10:560:16 | call to first | semmle.label | call to first | | array_flow.rb:561:5:561:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:561:5:561:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:561:5:561:5 | b [element] | semmle.label | b [element] | | array_flow.rb:561:5:561:5 | b [element] | semmle.label | b [element] | | array_flow.rb:561:9:561:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:561:9:561:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:561:9:561:9 | a [element] | semmle.label | a [element] | | array_flow.rb:561:9:561:9 | a [element] | semmle.label | a [element] | | array_flow.rb:561:9:561:18 | call to first [element 0] | semmle.label | call to first [element 0] | -| array_flow.rb:561:9:561:18 | call to first [element 0] | semmle.label | call to first [element 0] | -| array_flow.rb:561:9:561:18 | call to first [element] | semmle.label | call to first [element] | | array_flow.rb:561:9:561:18 | call to first [element] | semmle.label | call to first [element] | | array_flow.rb:562:10:562:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:562:10:562:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:562:10:562:10 | b [element] | semmle.label | b [element] | | array_flow.rb:562:10:562:10 | b [element] | semmle.label | b [element] | | array_flow.rb:562:10:562:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:562:10:562:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:563:10:563:10 | b [element] | semmle.label | b [element] | | array_flow.rb:563:10:563:10 | b [element] | semmle.label | b [element] | | array_flow.rb:563:10:563:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:563:10:563:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:564:5:564:5 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:564:5:564:5 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:564:5:564:5 | c [element 3] | semmle.label | c [element 3] | -| array_flow.rb:564:5:564:5 | c [element 3] | semmle.label | c [element 3] | -| array_flow.rb:564:5:564:5 | c [element] | semmle.label | c [element] | | array_flow.rb:564:5:564:5 | c [element] | semmle.label | c [element] | | array_flow.rb:564:9:564:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:564:9:564:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:564:9:564:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:564:9:564:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:564:9:564:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:564:9:564:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:564:9:564:18 | call to first [element 0] | semmle.label | call to first [element 0] | | array_flow.rb:564:9:564:18 | call to first [element 0] | semmle.label | call to first [element 0] | | array_flow.rb:564:9:564:18 | call to first [element 3] | semmle.label | call to first [element 3] | -| array_flow.rb:564:9:564:18 | call to first [element 3] | semmle.label | call to first [element 3] | -| array_flow.rb:564:9:564:18 | call to first [element] | semmle.label | call to first [element] | | array_flow.rb:564:9:564:18 | call to first [element] | semmle.label | call to first [element] | | array_flow.rb:565:10:565:10 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:565:10:565:10 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:565:10:565:10 | c [element] | semmle.label | c [element] | | array_flow.rb:565:10:565:10 | c [element] | semmle.label | c [element] | | array_flow.rb:565:10:565:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:565:10:565:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:566:10:566:10 | c [element 3] | semmle.label | c [element 3] | | array_flow.rb:566:10:566:10 | c [element 3] | semmle.label | c [element 3] | | array_flow.rb:566:10:566:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:566:10:566:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:566:10:566:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:566:10:566:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:570:5:570:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:570:5:570:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:570:16:570:27 | call to source | semmle.label | call to source | | array_flow.rb:570:16:570:27 | call to source | semmle.label | call to source | | array_flow.rb:571:5:571:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:571:5:571:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:571:9:571:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:571:9:571:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:571:9:574:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | -| array_flow.rb:571:9:574:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | -| array_flow.rb:571:24:571:24 | x | semmle.label | x | | array_flow.rb:571:24:571:24 | x | semmle.label | x | | array_flow.rb:572:14:572:14 | x | semmle.label | x | -| array_flow.rb:572:14:572:14 | x | semmle.label | x | -| array_flow.rb:573:13:573:24 | call to source | semmle.label | call to source | | array_flow.rb:573:13:573:24 | call to source | semmle.label | call to source | | array_flow.rb:575:10:575:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:575:10:575:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:576:5:576:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:576:5:576:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:576:9:576:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:576:9:576:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:576:9:579:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | -| array_flow.rb:576:9:579:7 | call to flat_map [element] | semmle.label | call to flat_map [element] | -| array_flow.rb:576:24:576:24 | x | semmle.label | x | | array_flow.rb:576:24:576:24 | x | semmle.label | x | | array_flow.rb:577:14:577:14 | x | semmle.label | x | -| array_flow.rb:577:14:577:14 | x | semmle.label | x | -| array_flow.rb:578:9:578:20 | call to source | semmle.label | call to source | | array_flow.rb:578:9:578:20 | call to source | semmle.label | call to source | | array_flow.rb:580:10:580:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:580:10:580:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:580:10:580:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:580:10:580:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:584:5:584:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:584:5:584:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:584:20:584:29 | call to source | semmle.label | call to source | | array_flow.rb:584:20:584:29 | call to source | semmle.label | call to source | | array_flow.rb:585:5:585:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:585:5:585:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:585:9:585:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:585:9:585:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:585:9:585:17 | call to flatten [element] | semmle.label | call to flatten [element] | -| array_flow.rb:585:9:585:17 | call to flatten [element] | semmle.label | call to flatten [element] | -| array_flow.rb:586:10:586:10 | b [element] | semmle.label | b [element] | | array_flow.rb:586:10:586:10 | b [element] | semmle.label | b [element] | | array_flow.rb:586:10:586:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:586:10:586:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:590:5:590:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:590:5:590:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:590:20:590:29 | call to source | semmle.label | call to source | -| array_flow.rb:590:20:590:29 | call to source | semmle.label | call to source | -| array_flow.rb:591:10:591:10 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:591:10:591:10 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:591:10:591:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:591:10:591:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:591:10:591:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:591:10:591:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:592:5:592:5 | b [element, element 1] | semmle.label | b [element, element 1] | -| array_flow.rb:592:5:592:5 | b [element, element 1] | semmle.label | b [element, element 1] | -| 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 | [post] a [element, element 1] | semmle.label | [post] a [element, element 1] | -| array_flow.rb:592:9:592:9 | [post] a [element, element 1] | semmle.label | [post] a [element, element 1] | -| array_flow.rb:592:9:592:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:592:9:592:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:592:9:592:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:592:9:592:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | semmle.label | call to flatten! [element, element 1] | | array_flow.rb:592:9:592:18 | call to flatten! [element, element 1] | semmle.label | call to flatten! [element, element 1] | | array_flow.rb:592:9:592:18 | call to flatten! [element] | semmle.label | call to flatten! [element] | -| array_flow.rb:592:9:592:18 | call to flatten! [element] | semmle.label | call to flatten! [element] | -| array_flow.rb:593:10:593:10 | a [element] | semmle.label | a [element] | | array_flow.rb:593:10:593:10 | a [element] | semmle.label | a [element] | | array_flow.rb:593:10:593:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:593:10:593:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:594:10:594:10 | a [element, element 1] | semmle.label | a [element, element 1] | | array_flow.rb:594:10:594:10 | a [element, element 1] | semmle.label | a [element, element 1] | -| array_flow.rb:594:10:594:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:594:10:594:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:594:10:594:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:594:10:594:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:594:10:594:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:594:10:594:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:595:10:595:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:595:10:595:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:595:10:595:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:595:10:595:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:596:10:596:10 | b [element, element 1] | semmle.label | b [element, element 1] | -| array_flow.rb:596:10:596:10 | b [element, element 1] | semmle.label | b [element, element 1] | -| 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 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:596:10:596:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:596:10:596:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:596:10:596:16 | ...[...] | 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:20 | call to grep [element] | semmle.label | call to grep [element] | | array_flow.rb:601:9:601:20 | call to grep [element] | semmle.label | call to grep [element] | | array_flow.rb:602:10:602:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:602:10:602:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:603:5:603:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:603:5:603:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:603:9:603:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:603:9:603:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:603:9:606:7 | call to grep [element] | semmle.label | call to grep [element] | -| array_flow.rb:603:9:606:7 | call to grep [element] | semmle.label | call to grep [element] | -| array_flow.rb:603:26:603:26 | x | semmle.label | x | | array_flow.rb:603:26:603:26 | x | semmle.label | x | | array_flow.rb:604:14:604:14 | x | semmle.label | x | -| array_flow.rb:604:14:604:14 | x | semmle.label | x | -| array_flow.rb:605:9:605:20 | call to source | semmle.label | call to source | | array_flow.rb:605:9:605:20 | call to source | semmle.label | call to source | | array_flow.rb:607:10:607:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:607:10:607:10 | b [element] | semmle.label | b [element] | -| array_flow.rb: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:5:612:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:612:5:612:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:612:9:612:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:612:9:612:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:612:9:612:21 | call to grep_v [element] | semmle.label | call to grep_v [element] | -| array_flow.rb:612:9:612:21 | call to grep_v [element] | semmle.label | call to grep_v [element] | -| array_flow.rb:613:10:613:10 | b [element] | semmle.label | b [element] | | array_flow.rb:613:10:613:10 | b [element] | semmle.label | b [element] | | array_flow.rb:613:10:613:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:613:10:613:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:614:5:614:5 | b [element] | semmle.label | b [element] | | array_flow.rb:614:5:614:5 | b [element] | semmle.label | b [element] | | array_flow.rb:614:9:614:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:614:9:614:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:614:9:617:7 | call to grep_v [element] | semmle.label | call to grep_v [element] | | array_flow.rb:614:9:617:7 | call to grep_v [element] | semmle.label | call to grep_v [element] | | array_flow.rb:614:27:614:27 | x | semmle.label | x | -| array_flow.rb:614:27:614:27 | x | semmle.label | x | -| array_flow.rb:615:14:615:14 | x | semmle.label | x | | array_flow.rb:615:14:615:14 | x | semmle.label | x | | array_flow.rb:616:9:616:20 | call to source | semmle.label | call to source | -| array_flow.rb:616:9:616:20 | call to source | semmle.label | call to source | -| array_flow.rb:618:10:618:10 | b [element] | semmle.label | b [element] | | array_flow.rb:618:10:618:10 | b [element] | semmle.label | b [element] | | array_flow.rb:618:10:618:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:618:10:618:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:622:5:622:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:622:5:622:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:622:19:622:30 | call to source | semmle.label | call to source | -| array_flow.rb:622:19:622:30 | call to source | semmle.label | call to source | -| array_flow.rb:623:9:623:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:623:9:623:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:623:24:623:24 | x | semmle.label | x | -| array_flow.rb:623:24:623:24 | x | semmle.label | x | -| array_flow.rb:624:14:624:14 | x | semmle.label | x | | array_flow.rb:624:14:624:14 | x | semmle.label | x | | array_flow.rb:631:5:631:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:631:5:631:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:631:19:631:28 | call to source | semmle.label | call to source | | array_flow.rb:631:19:631:28 | call to source | semmle.label | call to source | | array_flow.rb:632:5:632:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:632:5:632:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:632:17:632:17 | x | semmle.label | x | | array_flow.rb:632:17:632:17 | x | semmle.label | x | | array_flow.rb:633:14:633:14 | x | semmle.label | x | -| array_flow.rb:633:14:633:14 | x | semmle.label | x | -| array_flow.rb:638:5:638:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:638:5:638:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:638:5:638:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:638:5:638:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:638:10:638:21 | call to source | semmle.label | call to source | | array_flow.rb:638:10:638:21 | call to source | semmle.label | call to source | | array_flow.rb:638:27:638:38 | call to source | semmle.label | call to source | -| array_flow.rb:638:27:638:38 | call to source | semmle.label | call to source | -| array_flow.rb:639:5:639:5 | b | semmle.label | b | | array_flow.rb:639:5:639:5 | b | semmle.label | b | | array_flow.rb:639:9:639:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:639:9:639:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:639:9:639:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:639:9:639:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:639:9:643:7 | call to inject | semmle.label | call to inject | -| array_flow.rb:639:9:643:7 | call to inject | semmle.label | call to inject | -| array_flow.rb:639:22:639:22 | x | semmle.label | x | | array_flow.rb:639:22:639:22 | x | semmle.label | x | | array_flow.rb:639:25:639:25 | y | semmle.label | y | -| array_flow.rb:639:25:639:25 | y | semmle.label | y | -| array_flow.rb:640:14:640:14 | x | semmle.label | x | | array_flow.rb:640:14:640:14 | x | semmle.label | x | | array_flow.rb:641:14:641:14 | y | semmle.label | y | -| array_flow.rb:641:14:641:14 | y | semmle.label | y | -| array_flow.rb:642:9:642:19 | call to source | semmle.label | call to source | | array_flow.rb:642:9:642:19 | call to source | semmle.label | call to source | | array_flow.rb:644:10:644:10 | b | semmle.label | b | -| array_flow.rb:644:10:644:10 | b | semmle.label | b | -| array_flow.rb:645:5:645:5 | c | semmle.label | c | | array_flow.rb:645:5:645:5 | c | semmle.label | c | | array_flow.rb:645:9:645:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:645:9:645:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:645:9:645:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:645:9:645:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:645:9:649:7 | call to inject | semmle.label | call to inject | -| array_flow.rb:645:9:649:7 | call to inject | semmle.label | call to inject | -| array_flow.rb:645:28:645:28 | y | semmle.label | y | | array_flow.rb:645:28:645:28 | y | semmle.label | y | | array_flow.rb:647:14:647:14 | y | semmle.label | y | -| array_flow.rb:647:14:647:14 | y | semmle.label | y | -| array_flow.rb:648:9:648:19 | call to source | semmle.label | call to source | | array_flow.rb:648:9:648:19 | call to source | semmle.label | call to source | | array_flow.rb:650:10:650:10 | c | semmle.label | c | -| array_flow.rb:650:10:650:10 | c | semmle.label | c | -| array_flow.rb:655:5:655:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:655:5:655:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:655:16:655:27 | call to source | semmle.label | call to source | -| array_flow.rb:655:16:655:27 | call to source | semmle.label | call to source | -| array_flow.rb:656:5:656:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:656:5:656:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:656:5:656:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:656:5:656:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:656:5:656:5 | b [element 4] | semmle.label | b [element 4] | | array_flow.rb:656:5:656:5 | b [element 4] | semmle.label | b [element 4] | | array_flow.rb:656:9:656:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:656:9:656:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:656:9:656:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:656:9:656:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:656:9:656:9 | [post] a [element 4] | semmle.label | [post] a [element 4] | -| array_flow.rb:656:9:656:9 | [post] a [element 4] | semmle.label | [post] a [element 4] | -| array_flow.rb:656:9:656:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:656:9:656:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:656:9:656:47 | call to insert [element 1] | semmle.label | call to insert [element 1] | -| array_flow.rb:656:9:656:47 | call to insert [element 1] | semmle.label | call to insert [element 1] | -| array_flow.rb:656:9:656:47 | call to insert [element 2] | semmle.label | call to insert [element 2] | | array_flow.rb:656:9:656:47 | call to insert [element 2] | semmle.label | call to insert [element 2] | | array_flow.rb:656:9:656:47 | call to insert [element 4] | semmle.label | call to insert [element 4] | -| array_flow.rb:656:9:656:47 | call to insert [element 4] | semmle.label | call to insert [element 4] | -| array_flow.rb:656:21:656:32 | call to source | semmle.label | call to source | | array_flow.rb:656:21:656:32 | call to source | semmle.label | call to source | | array_flow.rb:656:35:656:46 | call to source | semmle.label | call to source | -| array_flow.rb:656:35:656:46 | call to source | semmle.label | call to source | -| array_flow.rb:658:10:658:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:658:10:658:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:658:10:658:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:658:10:658:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:659:10:659:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:659:10:659:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:659:10:659:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:659:10:659:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:661:10:661:10 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:661:10:661:10 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:663:10:663:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:663:10:663:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:663:10:663:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:663:10:663:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:664:10:664:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:664:10:664:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:664:10:664:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:664:10:664:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:666:10:666:10 | b [element 4] | semmle.label | b [element 4] | | array_flow.rb:666:10:666:10 | b [element 4] | semmle.label | b [element 4] | | array_flow.rb:666:10:666:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:666:10:666:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:669:5:669:5 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:669:5:669:5 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:669:16:669:27 | call to source | semmle.label | call to source | -| array_flow.rb:669:16:669:27 | call to source | semmle.label | call to source | -| array_flow.rb:670:5:670:5 | d [element] | semmle.label | d [element] | | array_flow.rb:670:5:670:5 | d [element] | semmle.label | d [element] | | array_flow.rb:670:9:670:9 | [post] c [element] | semmle.label | [post] c [element] | -| array_flow.rb:670:9:670:9 | [post] c [element] | semmle.label | [post] c [element] | -| array_flow.rb:670:9:670:9 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:670:9:670:9 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:670:9:670:47 | call to insert [element] | semmle.label | call to insert [element] | -| array_flow.rb:670:9:670:47 | call to insert [element] | semmle.label | call to insert [element] | -| array_flow.rb:670:21:670:32 | call to source | semmle.label | call to source | | array_flow.rb:670:21:670:32 | call to source | semmle.label | call to source | | array_flow.rb:670:35:670:46 | call to source | semmle.label | call to source | -| array_flow.rb:670:35:670:46 | call to source | semmle.label | call to source | -| array_flow.rb:671:10:671:10 | c [element] | semmle.label | c [element] | | array_flow.rb:671:10:671:10 | c [element] | semmle.label | c [element] | | array_flow.rb:671:10:671:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:671:10:671:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:672:10:672:10 | d [element] | semmle.label | d [element] | | array_flow.rb:672:10:672:10 | d [element] | semmle.label | d [element] | | array_flow.rb:672:10:672:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:672:10:672:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:683:5:683:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:683:5:683:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:683:16:683:27 | call to source | semmle.label | call to source | -| array_flow.rb:683:16:683:27 | call to source | semmle.label | call to source | -| array_flow.rb:684:5:684:5 | b [element] | semmle.label | b [element] | | array_flow.rb:684:5:684:5 | b [element] | semmle.label | b [element] | | array_flow.rb:684:9:684:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:684:9:684:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:684:9:684:60 | call to intersection [element] | semmle.label | call to intersection [element] | | array_flow.rb:684:9:684:60 | call to intersection [element] | semmle.label | call to intersection [element] | | array_flow.rb:684:31:684:42 | call to source | semmle.label | call to source | -| array_flow.rb:684:31:684:42 | call to source | semmle.label | call to source | -| array_flow.rb:684:47:684:58 | call to source | semmle.label | call to source | | array_flow.rb:684:47:684:58 | call to source | semmle.label | call to source | | array_flow.rb:685:10:685:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:685:10:685:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:685:10:685:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:685:10:685:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:689:5:689:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:689:5:689:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:689:16:689:25 | call to source | semmle.label | call to source | | array_flow.rb:689:16:689:25 | call to source | semmle.label | call to source | | array_flow.rb:690:5:690:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:690:5:690:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:690:9:690:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:690:9:690:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:690:9:690:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:690:9:690:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:690:9:693:7 | call to keep_if [element] | semmle.label | call to keep_if [element] | | array_flow.rb:690:9:693:7 | call to keep_if [element] | semmle.label | call to keep_if [element] | | array_flow.rb:690:23:690:23 | x | semmle.label | x | -| array_flow.rb:690:23:690:23 | x | semmle.label | x | -| array_flow.rb:691:14:691:14 | x | semmle.label | x | | array_flow.rb:691:14:691:14 | x | semmle.label | x | | array_flow.rb:694:10:694:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:694:10:694:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:694:10:694:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:694:10:694:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:695:10:695:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:695:10:695:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:695:10:695:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:695:10:695:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:699:5:699:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:699:5:699:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:699:16:699:27 | call to source | semmle.label | call to source | | array_flow.rb:699:16:699:27 | call to source | semmle.label | call to source | | array_flow.rb:700:5:700:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:700:5:700:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:700:12:700:23 | call to source | semmle.label | call to source | | array_flow.rb:700:12:700:23 | call to source | semmle.label | call to source | | array_flow.rb:701:10:701:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:701:10:701:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:701:10:701:10 | a [element] | semmle.label | a [element] | | array_flow.rb:701:10:701:10 | a [element] | semmle.label | a [element] | | array_flow.rb:701:10:701:15 | call to last | semmle.label | call to last | -| array_flow.rb:701:10:701:15 | call to last | semmle.label | call to last | -| array_flow.rb:702:5:702:5 | b [element] | semmle.label | b [element] | | array_flow.rb:702:5:702:5 | b [element] | semmle.label | b [element] | | array_flow.rb:702:9:702:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:702:9:702:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:702:9:702:9 | a [element] | semmle.label | a [element] | | array_flow.rb:702:9:702:9 | a [element] | semmle.label | a [element] | | array_flow.rb:702:9:702:17 | call to last [element] | semmle.label | call to last [element] | -| array_flow.rb:702:9:702:17 | call to last [element] | semmle.label | call to last [element] | -| array_flow.rb:703:10:703:10 | b [element] | semmle.label | b [element] | | array_flow.rb:703:10:703:10 | b [element] | semmle.label | b [element] | | array_flow.rb:703:10:703:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:703:10:703:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:704:10:704:10 | b [element] | semmle.label | b [element] | | array_flow.rb:704:10:704:10 | b [element] | semmle.label | b [element] | | array_flow.rb:704:10:704:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:704:10:704:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:708:5:708:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:708:5:708:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:708:16:708:27 | call to source | semmle.label | call to source | -| array_flow.rb:708:16:708:27 | call to source | semmle.label | call to source | -| array_flow.rb:709:5:709:5 | b [element] | semmle.label | b [element] | | array_flow.rb:709:5:709:5 | b [element] | semmle.label | b [element] | | array_flow.rb:709:9:709:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:709:9:709:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:709:9:712:7 | call to map [element] | semmle.label | call to map [element] | | array_flow.rb:709:9:712:7 | call to map [element] | semmle.label | call to map [element] | | array_flow.rb:709:19:709:19 | x | semmle.label | x | -| array_flow.rb:709:19:709:19 | x | semmle.label | x | -| array_flow.rb:710:14:710:14 | x | semmle.label | x | | array_flow.rb:710:14:710:14 | x | semmle.label | x | | array_flow.rb:711:9:711:19 | call to source | semmle.label | call to source | -| array_flow.rb:711:9:711:19 | call to source | semmle.label | call to source | -| array_flow.rb:713:10:713:10 | b [element] | semmle.label | b [element] | | array_flow.rb:713:10:713:10 | b [element] | semmle.label | b [element] | | array_flow.rb:713:10:713:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:713:10:713:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:717:5:717:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:717:5:717:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:717:16:717:27 | call to source | semmle.label | call to source | -| array_flow.rb:717:16:717:27 | call to source | semmle.label | call to source | -| array_flow.rb:718:5:718:5 | b [element] | semmle.label | b [element] | | array_flow.rb:718:5:718:5 | b [element] | semmle.label | b [element] | | 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:721:7 | call to map! [element] | semmle.label | call to map! [element] | | array_flow.rb:718:9:721:7 | call to map! [element] | semmle.label | call to map! [element] | | array_flow.rb:718:20:718:20 | x | semmle.label | x | -| array_flow.rb:718:20:718:20 | x | semmle.label | x | -| array_flow.rb:719:14:719:14 | x | semmle.label | x | | array_flow.rb:719:14:719:14 | x | semmle.label | x | | array_flow.rb:720:9:720:19 | call to source | semmle.label | call to source | -| array_flow.rb:720:9:720:19 | call to source | semmle.label | call to source | -| array_flow.rb:722:10:722:10 | b [element] | semmle.label | b [element] | | array_flow.rb:722:10:722:10 | b [element] | semmle.label | b [element] | | array_flow.rb:722:10:722:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:722:10:722:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:726:5:726:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:726:5:726:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:726:16:726:25 | call to source | semmle.label | call to source | -| array_flow.rb:726:16:726:25 | call to source | semmle.label | call to source | -| array_flow.rb:729:5:729:5 | b | semmle.label | b | | array_flow.rb:729:5:729:5 | b | semmle.label | b | | array_flow.rb:729:9:729:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:729:9:729:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:729:9:729:13 | call to max | semmle.label | call to max | | array_flow.rb:729:9:729:13 | call to max | semmle.label | call to max | | array_flow.rb:730:10:730:10 | b | semmle.label | b | -| array_flow.rb:730:10:730:10 | b | semmle.label | b | -| array_flow.rb:733:5:733:5 | c [element] | semmle.label | c [element] | | array_flow.rb:733:5:733:5 | c [element] | semmle.label | c [element] | | array_flow.rb:733:9:733:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:733:9:733:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:733:9:733:16 | call to max [element] | semmle.label | call to max [element] | | array_flow.rb:733:9:733:16 | call to max [element] | semmle.label | call to max [element] | | array_flow.rb:734:10:734:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:734:10:734:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:734:10:734:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:734:10:734:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:737:5:737:5 | d | semmle.label | d | -| array_flow.rb:737:5:737:5 | d | semmle.label | d | -| array_flow.rb:737:9:737:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:737:9:737:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:737:9:741:7 | call to max | semmle.label | call to max | -| array_flow.rb:737:9:741:7 | call to max | semmle.label | call to max | -| array_flow.rb:737:19:737:19 | x | semmle.label | x | | array_flow.rb:737:19:737:19 | x | semmle.label | x | | array_flow.rb:737:22:737:22 | y | semmle.label | y | -| array_flow.rb:737:22:737:22 | y | semmle.label | y | -| array_flow.rb:738:14:738:14 | x | semmle.label | x | | array_flow.rb:738:14:738:14 | x | semmle.label | x | | array_flow.rb:739:14:739:14 | y | semmle.label | y | -| array_flow.rb:739:14:739:14 | y | semmle.label | y | -| array_flow.rb:742:10:742:10 | d | semmle.label | d | | array_flow.rb:742:10:742:10 | d | semmle.label | d | | array_flow.rb:745:5:745:5 | e [element] | semmle.label | e [element] | -| array_flow.rb:745:5:745:5 | e [element] | semmle.label | e [element] | -| array_flow.rb:745:9:745:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:745:9:745:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:745:9:749:7 | call to max [element] | semmle.label | call to max [element] | -| array_flow.rb:745:9:749:7 | call to max [element] | semmle.label | call to max [element] | -| array_flow.rb:745:22:745:22 | x | semmle.label | x | | array_flow.rb:745:22:745:22 | x | semmle.label | x | | array_flow.rb:745:25:745:25 | y | semmle.label | y | -| array_flow.rb:745:25:745:25 | y | semmle.label | y | -| array_flow.rb:746:14:746:14 | x | semmle.label | x | | array_flow.rb:746:14:746:14 | x | semmle.label | x | | array_flow.rb:747:14:747:14 | y | semmle.label | y | -| array_flow.rb:747:14:747:14 | y | semmle.label | y | -| array_flow.rb:750:10:750:10 | e [element] | semmle.label | e [element] | | array_flow.rb:750:10:750:10 | e [element] | semmle.label | e [element] | | array_flow.rb:750:10:750:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:750:10:750:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:754:5:754:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:754:5:754:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:754:16:754:25 | call to source | semmle.label | call to source | -| array_flow.rb:754:16:754:25 | call to source | semmle.label | call to source | -| array_flow.rb:757:5:757:5 | b | semmle.label | b | | array_flow.rb:757:5:757:5 | b | semmle.label | b | | array_flow.rb:757:9:757:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:757:9:757:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:757:9:760:7 | call to max_by | semmle.label | call to max_by | | array_flow.rb:757:9:760:7 | call to max_by | semmle.label | call to max_by | | array_flow.rb:757:22:757:22 | x | semmle.label | x | -| array_flow.rb:757:22:757:22 | x | semmle.label | x | -| array_flow.rb:758:14:758:14 | x | semmle.label | x | | array_flow.rb:758:14:758:14 | x | semmle.label | x | | array_flow.rb:761:10:761:10 | b | semmle.label | b | -| array_flow.rb:761:10:761:10 | b | semmle.label | b | -| array_flow.rb:764:5:764:5 | c [element] | semmle.label | c [element] | | array_flow.rb:764:5:764:5 | c [element] | semmle.label | c [element] | | 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:767:7 | call to max_by [element] | semmle.label | call to max_by [element] | | array_flow.rb:764:9:767:7 | call to max_by [element] | semmle.label | call to max_by [element] | | array_flow.rb:764:25:764:25 | x | semmle.label | x | -| array_flow.rb:764:25:764:25 | x | semmle.label | x | -| array_flow.rb:765:14:765:14 | x | semmle.label | x | | array_flow.rb:765:14:765:14 | x | semmle.label | x | | array_flow.rb:768:10:768:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:768:10:768:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:768:10:768:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:768:10:768:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:772:5:772:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:772:5:772:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:772:16:772:25 | call to source | semmle.label | call to source | | array_flow.rb:772:16:772:25 | call to source | semmle.label | call to source | | array_flow.rb:775:5:775:5 | b | semmle.label | b | -| array_flow.rb:775:5:775:5 | b | semmle.label | b | -| array_flow.rb:775:9:775:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:775:9:775:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:775:9:775:13 | call to min | semmle.label | call to min | -| array_flow.rb:775:9:775:13 | call to min | semmle.label | call to min | -| array_flow.rb:776:10:776:10 | b | semmle.label | b | | array_flow.rb:776:10:776:10 | b | semmle.label | b | | array_flow.rb:779:5:779:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:779:5:779:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:779:9:779:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:779:9:779:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:779:9:779:16 | call to min [element] | semmle.label | call to min [element] | -| array_flow.rb:779:9:779:16 | call to min [element] | semmle.label | call to min [element] | -| array_flow.rb:780:10:780:10 | c [element] | semmle.label | c [element] | | array_flow.rb:780:10:780:10 | c [element] | semmle.label | c [element] | | array_flow.rb:780:10:780:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:780:10:780:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:783:5:783:5 | d | semmle.label | d | | array_flow.rb:783:5:783:5 | d | semmle.label | d | | array_flow.rb:783:9:783:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:783:9:783:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:783:9:787:7 | call to min | semmle.label | call to min | | array_flow.rb:783:9:787:7 | call to min | semmle.label | call to min | | array_flow.rb:783:19:783:19 | x | semmle.label | x | -| array_flow.rb:783:19:783:19 | x | semmle.label | x | -| array_flow.rb:783:22:783:22 | y | semmle.label | y | | array_flow.rb:783:22:783:22 | y | semmle.label | y | | array_flow.rb:784:14:784:14 | x | semmle.label | x | -| array_flow.rb:784:14:784:14 | x | semmle.label | x | -| array_flow.rb:785:14:785:14 | y | semmle.label | y | | array_flow.rb:785:14:785:14 | y | semmle.label | y | | array_flow.rb:788:10:788:10 | d | semmle.label | d | -| array_flow.rb:788:10:788:10 | d | semmle.label | d | -| array_flow.rb:791:5:791:5 | e [element] | semmle.label | e [element] | | array_flow.rb:791:5:791:5 | e [element] | semmle.label | e [element] | | array_flow.rb:791:9:791:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:791:9:791:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:791:9:795:7 | call to min [element] | semmle.label | call to min [element] | | array_flow.rb:791:9:795:7 | call to min [element] | semmle.label | call to min [element] | | array_flow.rb:791:22:791:22 | x | semmle.label | x | -| array_flow.rb:791:22:791:22 | x | semmle.label | x | -| array_flow.rb:791:25:791:25 | y | semmle.label | y | | array_flow.rb:791:25:791:25 | y | semmle.label | y | | array_flow.rb:792:14:792:14 | x | semmle.label | x | -| array_flow.rb:792:14:792:14 | x | semmle.label | x | -| array_flow.rb:793:14:793:14 | y | semmle.label | y | | array_flow.rb:793:14:793:14 | y | semmle.label | y | | array_flow.rb:796:10:796:10 | e [element] | semmle.label | e [element] | -| array_flow.rb:796:10:796:10 | e [element] | semmle.label | e [element] | -| array_flow.rb:796:10:796:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:796:10:796:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:800:5:800:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:800:5:800:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:800:16:800:25 | call to source | semmle.label | call to source | | array_flow.rb:800:16:800:25 | call to source | semmle.label | call to source | | array_flow.rb:803:5:803:5 | b | semmle.label | b | -| array_flow.rb:803:5:803:5 | b | semmle.label | b | -| array_flow.rb:803:9:803:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:803:9:803:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:803:9:806:7 | call to min_by | semmle.label | call to min_by | -| array_flow.rb:803:9:806:7 | call to min_by | semmle.label | call to min_by | -| array_flow.rb:803:22:803:22 | x | semmle.label | x | | array_flow.rb:803:22:803:22 | x | semmle.label | x | | array_flow.rb:804:14:804:14 | x | semmle.label | x | -| array_flow.rb:804:14:804:14 | x | semmle.label | x | -| array_flow.rb:807:10:807:10 | b | semmle.label | b | | array_flow.rb:807:10:807:10 | b | semmle.label | b | | array_flow.rb:810:5:810:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:810:5:810:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:810:9:810:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:810:9:810:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:810:9:813:7 | call to min_by [element] | semmle.label | call to min_by [element] | -| array_flow.rb:810:9:813:7 | call to min_by [element] | semmle.label | call to min_by [element] | -| array_flow.rb:810:25:810:25 | x | semmle.label | x | | array_flow.rb:810:25:810:25 | x | semmle.label | x | | array_flow.rb:811:14:811:14 | x | semmle.label | x | -| array_flow.rb:811:14:811:14 | x | semmle.label | x | -| array_flow.rb:814:10:814:10 | c [element] | semmle.label | c [element] | | array_flow.rb:814:10:814:10 | c [element] | semmle.label | c [element] | | array_flow.rb:814:10:814:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:814:10:814:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:818:5:818:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:818:5:818:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:818:16:818:25 | call to source | semmle.label | call to source | -| array_flow.rb:818:16:818:25 | call to source | semmle.label | call to source | -| array_flow.rb:820:5:820:5 | b [element] | semmle.label | b [element] | | array_flow.rb:820:5:820:5 | b [element] | semmle.label | b [element] | | array_flow.rb:820:9:820:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:820:9:820:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:820:9:820:16 | call to minmax [element] | semmle.label | call to minmax [element] | | array_flow.rb:820:9:820:16 | call to minmax [element] | semmle.label | call to minmax [element] | | array_flow.rb:821:10:821:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:821:10:821:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:821:10:821:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:821:10:821:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:822:10:822:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:822:10:822:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:822:10:822:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:822:10:822:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:824:5:824:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:824:5:824:5 | c [element] | semmle.label | c [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:828:7 | call to minmax [element] | semmle.label | call to minmax [element] | -| array_flow.rb:824:9:828:7 | call to minmax [element] | semmle.label | call to minmax [element] | -| array_flow.rb:824:22:824:22 | x | semmle.label | x | | array_flow.rb:824:22:824:22 | x | semmle.label | x | | array_flow.rb:824:25:824:25 | y | semmle.label | y | -| array_flow.rb:824:25:824:25 | y | semmle.label | y | -| array_flow.rb:825:14:825:14 | x | semmle.label | x | | array_flow.rb:825:14:825:14 | x | semmle.label | x | | array_flow.rb:826:14:826:14 | y | semmle.label | y | -| array_flow.rb:826:14:826:14 | y | semmle.label | y | -| array_flow.rb:829:10:829:10 | c [element] | semmle.label | c [element] | | array_flow.rb:829:10:829:10 | c [element] | semmle.label | c [element] | | array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:830:10:830:10 | c [element] | semmle.label | c [element] | | array_flow.rb:830:10:830:10 | c [element] | semmle.label | c [element] | | array_flow.rb:830:10:830:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:830:10:830:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:834:5:834:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:834:5:834:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:834:16:834:25 | call to source | semmle.label | call to source | -| array_flow.rb:834:16:834:25 | call to source | semmle.label | call to source | -| array_flow.rb:835:5:835:5 | b [element] | semmle.label | b [element] | | array_flow.rb:835:5:835:5 | b [element] | semmle.label | b [element] | | array_flow.rb:835:9:835:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:835:9:835:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:835:9:838:7 | call to minmax_by [element] | semmle.label | call to minmax_by [element] | | array_flow.rb:835:9:838:7 | call to minmax_by [element] | semmle.label | call to minmax_by [element] | | array_flow.rb:835:25:835:25 | x | semmle.label | x | -| array_flow.rb:835:25:835:25 | x | semmle.label | x | -| array_flow.rb:836:14:836:14 | x | semmle.label | x | | array_flow.rb:836:14:836:14 | x | semmle.label | x | | array_flow.rb:839:10:839:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:839:10:839:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:839:10:839:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:839:10:839:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:840:10:840:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:840:10:840:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:840:10:840:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:840:10:840:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:844:5:844:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:844:5:844:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:844:16:844:25 | call to source | semmle.label | call to source | | array_flow.rb:844:16:844:25 | call to source | semmle.label | call to source | | array_flow.rb:845:5:845:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:845:5:845:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:845:17:845:17 | x | semmle.label | x | | array_flow.rb:845:17:845:17 | x | semmle.label | x | | array_flow.rb:846:14:846:14 | x | semmle.label | x | -| array_flow.rb:846:14:846:14 | x | semmle.label | x | -| array_flow.rb:853:5:853:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:853:5:853:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:853:16:853:25 | call to source | semmle.label | call to source | -| array_flow.rb:853:16:853:25 | call to source | semmle.label | call to source | -| array_flow.rb:854:5:854:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:854:5:854:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:854:16:854:16 | x | semmle.label | x | -| array_flow.rb:854:16:854:16 | x | semmle.label | x | -| array_flow.rb:855:14:855:14 | x | semmle.label | x | | array_flow.rb:855:14:855:14 | x | semmle.label | x | -| array_flow.rb:860:5:860:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:860:16:860:25 | call to source | semmle.label | call to source | -| array_flow.rb:861:5:861:5 | b | semmle.label | b | -| array_flow.rb:861:9:861:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:861:9:861:20 | call to pack | semmle.label | call to pack | -| array_flow.rb:862:10:862:10 | b | semmle.label | b | | array_flow.rb:866:5:866:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:866:5:866:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:866:16:866:25 | call to source | semmle.label | call to source | | array_flow.rb:866:16:866:25 | call to source | semmle.label | call to source | | array_flow.rb:867:5:867:5 | b [element, element] | semmle.label | b [element, element] | -| array_flow.rb:867:5:867:5 | b [element, element] | semmle.label | b [element, element] | -| 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:870:7 | call to partition [element, element] | semmle.label | call to partition [element, element] | -| array_flow.rb:867:9:870:7 | call to partition [element, element] | semmle.label | call to partition [element, element] | -| array_flow.rb:867:25:867:25 | x | semmle.label | x | | array_flow.rb:867:25:867:25 | x | semmle.label | x | | array_flow.rb:868:14:868:14 | x | semmle.label | x | -| array_flow.rb:868:14:868:14 | x | semmle.label | x | -| array_flow.rb:871:10:871:10 | b [element, element] | semmle.label | b [element, element] | | array_flow.rb:871:10:871:10 | b [element, element] | semmle.label | b [element, element] | | array_flow.rb:871:10:871:13 | ...[...] [element] | semmle.label | ...[...] [element] | -| array_flow.rb:871:10:871:13 | ...[...] [element] | semmle.label | ...[...] [element] | -| array_flow.rb:871:10:871:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:871:10:871:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:872:10:872:10 | b [element, element] | semmle.label | b [element, element] | -| array_flow.rb:872:10:872:10 | b [element, element] | semmle.label | b [element, element] | -| array_flow.rb:872:10:872:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:872:10:872:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:872:10:872:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:872:10:872:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:876:5:876:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:876:5:876:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:876:16:876:25 | call to source | semmle.label | call to source | -| array_flow.rb:876:16:876:25 | call to source | semmle.label | call to source | -| array_flow.rb:878:5:878:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:878:5:878:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:878:9:878:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:878:9:878:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:878:9:882:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | | array_flow.rb:878:9:882:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | | array_flow.rb:878:27:878:27 | x [element] | semmle.label | x [element] | -| array_flow.rb:878:27:878:27 | x [element] | semmle.label | x [element] | -| array_flow.rb:879:14:879:14 | x [element] | semmle.label | x [element] | | array_flow.rb:879:14:879:14 | x [element] | semmle.label | x [element] | | array_flow.rb:879:14:879:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:879:14:879:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:880:14:880:14 | x [element] | semmle.label | x [element] | | array_flow.rb:880:14:880:14 | x [element] | semmle.label | x [element] | | array_flow.rb:880:14:880:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:880:14:880:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:881:14:881:14 | x [element] | semmle.label | x [element] | | array_flow.rb:881:14:881:14 | x [element] | semmle.label | x [element] | | array_flow.rb:881:14:881:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:881:14:881:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:884:10:884:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:884:10:884:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:884:10:884:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:884:10:884:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:886:5:886:5 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:886:5:886:5 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:886:9:886:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:886:9:886:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:886:9:889:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | | array_flow.rb:886:9:889:7 | call to permutation [element 2] | semmle.label | call to permutation [element 2] | | array_flow.rb:886:30:886:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:886:30:886:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:887:14:887:14 | x [element] | semmle.label | x [element] | | array_flow.rb:887:14:887:14 | x [element] | semmle.label | x [element] | | array_flow.rb:887:14:887:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:887:14:887:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:888:14:888:14 | x [element] | semmle.label | x [element] | | array_flow.rb:888:14:888:14 | x [element] | semmle.label | x [element] | | array_flow.rb:888:14:888:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:888:14:888:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:891:10:891:10 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:891:10:891:10 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:891:10:891:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:891:10:891:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:893:9:893:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:893:9:893:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:893:30:893:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:893:30:893:30 | x [element] | semmle.label | x [element] | -| array_flow.rb:894:14:894:14 | x [element] | semmle.label | x [element] | | array_flow.rb:894:14:894:14 | x [element] | semmle.label | x [element] | | array_flow.rb:894:14:894:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:894:14:894:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:895:14:895:14 | x [element] | semmle.label | x [element] | | array_flow.rb:895:14:895:14 | x [element] | semmle.label | x [element] | | array_flow.rb:895:14:895:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:895:14:895:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:898:10:898:10 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:898:10:898:10 | c [element 2] | semmle.label | c [element 2] | | array_flow.rb:898:10:898:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:898:10:898:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:905:5:905:5 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:905:5:905:5 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:905:5:905:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:905:5:905:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:905:13:905:24 | call to source | semmle.label | call to source | | array_flow.rb:905:13:905:24 | call to source | semmle.label | call to source | | array_flow.rb:905:30:905:41 | call to source | semmle.label | call to source | -| array_flow.rb:905:30:905:41 | call to source | semmle.label | call to source | -| array_flow.rb:906:5:906:5 | b | semmle.label | b | | array_flow.rb:906:5:906:5 | b | semmle.label | b | | array_flow.rb:906:9:906:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:906:9:906:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:906:9:906:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:906:9:906:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:906:9:906:13 | call to pop | semmle.label | call to pop | -| array_flow.rb:906:9:906:13 | call to pop | semmle.label | call to pop | -| array_flow.rb:907:10:907:10 | b | semmle.label | b | | array_flow.rb:907:10:907:10 | b | semmle.label | b | | array_flow.rb:909:10:909:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:909:10:909:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:911:10:911:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:911:10:911:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:911:10:911:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:911:10:911:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:913:5:913:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:913:5:913:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:913:5:913:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:913:5:913:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:913:13:913:24 | call to source | semmle.label | call to source | -| array_flow.rb:913:13:913:24 | call to source | semmle.label | call to source | -| array_flow.rb:913:30:913:41 | call to source | semmle.label | call to source | | array_flow.rb:913:30:913:41 | call to source | semmle.label | call to source | | array_flow.rb:914:5:914:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:914:5:914:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:914:9:914:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:914:9:914:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:914:9:914:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:914:9:914:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:914:9:914:16 | call to pop [element] | semmle.label | call to pop [element] | | array_flow.rb:914:9:914:16 | call to pop [element] | semmle.label | call to pop [element] | | array_flow.rb:915:10:915:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:915:10:915:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:915:10:915:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:915:10:915:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:916:10:916:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:916:10:916:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:916:10:916:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:916:10:916:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:918:10:918:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:918:10:918:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:918:10:918:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:918:10:918:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:920:10:920:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:920:10:920:10 | a [element 3] | semmle.label | a [element 3] | -| 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 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:925:5:925:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:925:5:925:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | | array_flow.rb:925:5:925:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | | array_flow.rb:925:5:925:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:925:5:925:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:925:21:925:32 | call to source | semmle.label | call to source | | array_flow.rb:925:21:925:32 | call to source | semmle.label | call to source | | array_flow.rb:928:10:928:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:928:10:928:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:928:10:928:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:928:10:928:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:931:10:931:10 | a [element 5] | semmle.label | a [element 5] | -| array_flow.rb:931:10:931:10 | a [element 5] | semmle.label | a [element 5] | -| array_flow.rb:931:10:931:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:931:10:931:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:935:5:935:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:935:5:935:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:935:16:935:27 | call to source | semmle.label | call to source | | array_flow.rb:935:16:935:27 | call to source | semmle.label | call to source | | array_flow.rb:936:5:936:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:936:5:936:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:936:13:936:24 | call to source | semmle.label | call to source | | array_flow.rb:936:13:936:24 | call to source | semmle.label | call to source | | array_flow.rb:937:5:937:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:937:5:937:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:937:10:937:21 | call to source | semmle.label | call to source | | array_flow.rb:937:10:937:21 | call to source | semmle.label | call to source | | array_flow.rb:938:5:938:5 | d [element, element] | semmle.label | d [element, element] | -| array_flow.rb:938:5:938:5 | d [element, element] | semmle.label | d [element, element] | -| array_flow.rb:938:9:938:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:938:9:938:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:938:9:938:22 | call to product [element, element] | semmle.label | call to product [element, element] | -| array_flow.rb:938:9:938:22 | call to product [element, element] | semmle.label | call to product [element, element] | -| array_flow.rb:938:19:938:19 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:938:19:938:19 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:938:22:938:22 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:938:22:938:22 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:939:10:939:10 | d [element, element] | semmle.label | d [element, element] | | array_flow.rb:939:10:939:10 | d [element, element] | semmle.label | d [element, element] | | array_flow.rb:939:10:939:13 | ...[...] [element] | semmle.label | ...[...] [element] | -| array_flow.rb:939:10:939:13 | ...[...] [element] | semmle.label | ...[...] [element] | -| array_flow.rb:939:10:939:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:939:10:939:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:940:10:940:10 | d [element, element] | semmle.label | d [element, element] | -| array_flow.rb:940:10:940:10 | d [element, element] | semmle.label | d [element, element] | -| array_flow.rb:940:10:940:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:940:10:940:13 | ...[...] [element] | semmle.label | ...[...] [element] | | array_flow.rb:940:10:940:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:940:10:940:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:944:5:944:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:944:5:944:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:944:10:944:21 | call to source | semmle.label | call to source | -| array_flow.rb:944:10:944:21 | call to source | semmle.label | call to source | -| array_flow.rb:945:5:945:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:945:5:945:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:945:5:945:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:945:5:945:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:945:9:945:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:945:9:945:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:945:9:945:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:945:9:945:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:945:9:945:44 | call to append [element 0] | semmle.label | call to append [element 0] | | array_flow.rb:945:9:945:44 | call to append [element 0] | semmle.label | call to append [element 0] | | array_flow.rb:945:9:945:44 | call to append [element] | semmle.label | call to append [element] | -| array_flow.rb:945:9:945:44 | call to append [element] | semmle.label | call to append [element] | -| array_flow.rb:945:18:945:29 | call to source | semmle.label | call to source | | array_flow.rb:945:18:945:29 | call to source | semmle.label | call to source | | array_flow.rb:945:32:945:43 | call to source | semmle.label | call to source | -| array_flow.rb:945:32:945:43 | call to source | semmle.label | call to source | -| array_flow.rb:946:10:946:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:946:10:946:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:946:10:946:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:946:10:946:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:946:10:946:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:946:10:946:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:947:10:947:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:947:10:947:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:947:10:947:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:947:10:947:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:948:10:948:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:948:10:948:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:948:10:948:10 | b [element] | semmle.label | b [element] | | array_flow.rb:948:10:948:10 | b [element] | semmle.label | b [element] | | array_flow.rb:948:10:948:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:948:10:948:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:949:10:949:10 | b [element] | semmle.label | b [element] | | array_flow.rb:949:10:949:10 | b [element] | semmle.label | b [element] | | array_flow.rb:949:10:949:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:949:10:949:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:955:5:955:5 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:955:5:955:5 | c [element 0] | semmle.label | c [element 0] | | array_flow.rb:955:10:955:19 | call to source | semmle.label | call to source | -| array_flow.rb:955:10:955:19 | call to source | semmle.label | call to source | -| array_flow.rb:956:5:956:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | | array_flow.rb:956:5:956:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | | array_flow.rb:956:16:956:16 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:956:16:956:16 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:957:10:957:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | | array_flow.rb:957:10:957:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | | array_flow.rb:957:10:957:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | -| array_flow.rb:957:10:957:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | -| array_flow.rb:957:10:957:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:957:10:957:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:958:10:958:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | -| array_flow.rb:958:10:958:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | -| array_flow.rb:958:10:958:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | | array_flow.rb:958:10:958:22 | call to rassoc [element 0] | semmle.label | call to rassoc [element 0] | | array_flow.rb:958:10:958:25 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:958:10:958:25 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:962:5:962:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:962:5:962:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:962:5:962:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:962:5:962:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:962:10:962:21 | call to source | semmle.label | call to source | | array_flow.rb:962:10:962:21 | call to source | semmle.label | call to source | | array_flow.rb:962:27:962:38 | call to source | semmle.label | call to source | -| array_flow.rb:962:27:962:38 | call to source | semmle.label | call to source | -| array_flow.rb:963:9:963:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:963:9:963:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:963:9:963:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:963:9:963:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:963:22:963:22 | x | semmle.label | x | | array_flow.rb:963:22:963:22 | x | semmle.label | x | | array_flow.rb:963:25:963:25 | y | semmle.label | y | -| array_flow.rb:963:25:963:25 | y | semmle.label | y | -| array_flow.rb:964:14:964:14 | x | semmle.label | x | | array_flow.rb:964:14:964:14 | x | semmle.label | x | | array_flow.rb:965:14:965:14 | y | semmle.label | y | -| array_flow.rb:965:14:965:14 | y | semmle.label | y | -| array_flow.rb:968:9:968:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:968:9:968:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:968:9:968:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:968:9:968:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:968:28:968:28 | y | semmle.label | y | | array_flow.rb:968:28:968:28 | y | semmle.label | y | | array_flow.rb:970:14:970:14 | y | semmle.label | y | -| array_flow.rb:970:14:970:14 | y | semmle.label | y | -| array_flow.rb:976:5:976:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:976:5:976:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:976:16:976:25 | call to source | semmle.label | call to source | -| array_flow.rb:976:16:976:25 | call to source | semmle.label | call to source | -| array_flow.rb:977:5:977:5 | b [element] | semmle.label | b [element] | | array_flow.rb:977:5:977:5 | b [element] | semmle.label | b [element] | | array_flow.rb:977:9:977:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:977:9:977:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:977:9:980:7 | call to reject [element] | semmle.label | call to reject [element] | | array_flow.rb:977:9:980:7 | call to reject [element] | semmle.label | call to reject [element] | | array_flow.rb:977:22:977:22 | x | semmle.label | x | -| array_flow.rb:977:22:977:22 | x | semmle.label | x | -| array_flow.rb:978:14:978:14 | x | semmle.label | x | | array_flow.rb:978:14:978:14 | x | semmle.label | x | | array_flow.rb:981:10:981:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:981:10:981:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:981:10:981:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:981:10:981:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:985:5:985:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:985:5:985:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:985:16:985:25 | call to source | semmle.label | call to source | | array_flow.rb:985:16:985:25 | call to source | semmle.label | call to source | | array_flow.rb:986:5:986:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:986:5:986:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:986:9:986:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:986:9:986:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:986:9:986:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:986:9:986:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:986:9:989:7 | call to reject! [element] | semmle.label | call to reject! [element] | | array_flow.rb:986:9:989:7 | call to reject! [element] | semmle.label | call to reject! [element] | | array_flow.rb:986:23:986:23 | x | semmle.label | x | -| array_flow.rb:986:23:986:23 | x | semmle.label | x | -| array_flow.rb:987:14:987:14 | x | semmle.label | x | | array_flow.rb:987:14:987:14 | x | semmle.label | x | | array_flow.rb:990:10:990:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:990:10:990:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:991:10:991:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:991:10:991:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:991:10:991:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:991:10:991:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:995:5:995:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:995:5:995:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:995:16:995:25 | call to source | semmle.label | call to source | | array_flow.rb:995:16:995:25 | call to source | semmle.label | call to source | | array_flow.rb:996:5:996:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:996:5:996:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:996:9:996:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:996:9:996:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | semmle.label | call to repeated_combination [element 2] | -| array_flow.rb:996:9:999:7 | call to repeated_combination [element 2] | semmle.label | call to repeated_combination [element 2] | -| array_flow.rb:996:39:996:39 | x [element] | semmle.label | x [element] | | array_flow.rb:996:39:996:39 | x [element] | semmle.label | x [element] | | array_flow.rb:997:14:997:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:997:14:997:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:997:14:997:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:997:14:997:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:998:14:998:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:998:14:998:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:998:14:998:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:998:14:998:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1001:10:1001:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1001:10:1001:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1001:10:1001:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1001:10:1001:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1005:5:1005:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1005:5:1005:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1005:16:1005:25 | call to source | semmle.label | call to source | | array_flow.rb:1005:16:1005:25 | call to source | semmle.label | call to source | | array_flow.rb:1006:5:1006:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1006:5:1006:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1006:9:1006:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1006:9:1006:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | semmle.label | call to repeated_permutation [element 2] | -| array_flow.rb:1006:9:1009:7 | call to repeated_permutation [element 2] | semmle.label | call to repeated_permutation [element 2] | -| array_flow.rb:1006:39:1006:39 | x [element] | semmle.label | x [element] | | array_flow.rb:1006:39:1006:39 | x [element] | semmle.label | x [element] | | array_flow.rb:1007:14:1007:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:1007:14:1007:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:1007:14:1007:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1007:14:1007:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1008:14:1008:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:1008:14:1008:14 | x [element] | semmle.label | x [element] | -| array_flow.rb:1008:14:1008:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1008:14:1008:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1011:10:1011:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1011:10:1011:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1011:10:1011:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1011:10:1011:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1017:5:1017:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1017:5:1017:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1017:9:1017:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | | array_flow.rb:1017:9:1017:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | | array_flow.rb:1017:9:1017:33 | call to replace [element 0] | semmle.label | call to replace [element 0] | -| array_flow.rb:1017:9:1017:33 | call to replace [element 0] | semmle.label | call to replace [element 0] | -| array_flow.rb:1017:20:1017:31 | call to source | semmle.label | call to source | | array_flow.rb:1017:20:1017:31 | call to source | semmle.label | call to source | | array_flow.rb:1018:10:1018:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1018:10:1018:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1018:10:1018:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1018:10:1018:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1019:10:1019:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1019:10:1019:10 | b [element 0] | semmle.label | b [element 0] | -| 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 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1024:9:1024:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1024:9:1024:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1024:9:1024:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1024:9:1024:17 | call to reverse [element] | semmle.label | call to reverse [element] | | array_flow.rb:1024:9:1024:17 | call to reverse [element] | semmle.label | call to reverse [element] | | array_flow.rb:1025:10:1025:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1025:10:1025:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1025:10:1025:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1025:10:1025:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1026:10:1026:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1026:10:1026:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1026:10:1026:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1026:10:1026:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1027:10:1027:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1027:10:1027:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1027:10:1027:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1027:10:1027:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1029:10:1029:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1029:10:1029:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1029:10:1029:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1029:10:1029:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1030:10:1030:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1030:10:1030:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1030:10:1030: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:5:1034:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1034:5:1034:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1034:16:1034:28 | call to source | semmle.label | call to source | -| array_flow.rb:1034:16:1034:28 | call to source | semmle.label | call to source | -| array_flow.rb:1034:31:1034:43 | call to source | semmle.label | call to source | | array_flow.rb:1034:31:1034:43 | call to source | semmle.label | call to source | | array_flow.rb:1035:5:1035:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1035:5:1035:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1035:9:1035:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1035:9:1035:9 | [post] a [element] | semmle.label | [post] a [element] | | 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:1035:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1035:9:1035:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1035:9:1035:18 | call to reverse! [element] | semmle.label | call to reverse! [element] | -| array_flow.rb:1035:9:1035:18 | call to reverse! [element] | semmle.label | call to reverse! [element] | -| array_flow.rb:1036:10:1036:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1036:10:1036:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1036:10:1036:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1036:10:1036:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1037:10:1037:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1037:10:1037:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1037:10:1037:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1037:10:1037:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1038:10:1038:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1038:10:1038:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1039:10:1039:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1039:10:1039:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1039:10:1039:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1039:10:1039:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1040:10:1040:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1040:10:1040:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1040:10:1040:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1040:10:1040:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1040:10:1040:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1040:10:1040:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1041:10:1041:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1041:10:1041:10 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1041:10:1041:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1041:10:1041:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1041:10:1041:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1041:10:1041:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1045:5:1045:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1045:5:1045:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1045:16:1045:26 | call to source | semmle.label | call to source | -| array_flow.rb:1045:16:1045:26 | call to source | semmle.label | call to source | -| array_flow.rb:1046:5:1046:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1046:5:1046:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1046:9:1046:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1046:9:1046:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | semmle.label | call to reverse_each [element 2] | | array_flow.rb:1046:9:1048:7 | call to reverse_each [element 2] | semmle.label | call to reverse_each [element 2] | | array_flow.rb:1046:28:1046:28 | x | semmle.label | x | -| array_flow.rb:1046:28:1046:28 | x | semmle.label | x | -| array_flow.rb:1047:14:1047:14 | x | semmle.label | x | | array_flow.rb:1047:14:1047:14 | x | semmle.label | x | | array_flow.rb:1049:10:1049:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1049:10:1049:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1049:10:1049:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1049:10:1049:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1053:5:1053:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1053:5:1053:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1053:16:1053:26 | call to source | semmle.label | call to source | | array_flow.rb:1053:16:1053:26 | call to source | semmle.label | call to source | | array_flow.rb:1054:5:1054:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1054:5:1054:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1054:18:1054:18 | x | semmle.label | x | | array_flow.rb:1054:18:1054:18 | x | semmle.label | x | | array_flow.rb:1055:14:1055:14 | x | semmle.label | x | -| array_flow.rb:1055:14:1055:14 | x | semmle.label | x | -| array_flow.rb:1063:5:1063:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1063:5:1063:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1063:5:1063:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1063:5:1063:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1063:5:1063:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1063:5:1063:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1063:10:1063:22 | call to source | semmle.label | call to source | -| array_flow.rb:1063:10:1063:22 | call to source | semmle.label | call to source | -| array_flow.rb:1063:28:1063:40 | call to source | semmle.label | call to source | | array_flow.rb:1063:28:1063:40 | call to source | semmle.label | call to source | | array_flow.rb:1063:43:1063:55 | call to source | semmle.label | call to source | -| array_flow.rb:1063:43:1063:55 | call to source | semmle.label | call to source | -| array_flow.rb:1065:5:1065:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1065:5:1065:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1065:5:1065:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1065:5:1065:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1065:5:1065:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1065:5:1065:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1065:9:1065:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1065:9:1065:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1065:9:1065:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1065:9:1065:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1065:9:1065:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1065:9:1065:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | | array_flow.rb:1065:9:1065:16 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | | array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | -| array_flow.rb:1065:9:1065:16 | call to rotate [element] | semmle.label | call to rotate [element] | | array_flow.rb:1065:9:1065:16 | call to rotate [element] | semmle.label | call to rotate [element] | | array_flow.rb:1066:10:1066:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1066:10:1066:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1066:10:1066:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1066:10:1066:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1067:10:1067:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1067:10:1067:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1067:10:1067:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1067:10:1067:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1067:10:1067:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1067:10:1067:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1068:10:1068:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1068:10:1068:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1068:10:1068:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1068:10:1068:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1068:10:1068:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1068:10:1068:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1069:10:1069:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1069:10:1069:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1069:10:1069:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1069:10:1069:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1071:5:1071:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1071:5:1071:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1071:5:1071:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1071:5:1071:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1071:5:1071:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1071:5:1071:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1071:9:1071:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1071:9:1071:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1071:9:1071:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1071:9:1071:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1071:9:1071:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1071:9:1071:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | | array_flow.rb:1071:9:1071:19 | call to rotate [element 1] | semmle.label | call to rotate [element 1] | | array_flow.rb:1071:9:1071:19 | call to rotate [element] | semmle.label | call to rotate [element] | -| array_flow.rb:1071:9:1071:19 | call to rotate [element] | semmle.label | call to rotate [element] | -| array_flow.rb:1072:10:1072:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1072:10:1072:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1072:10:1072:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1072:10:1072:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1072:10:1072:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1072:10:1072:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1073:10:1073:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1073:10:1073:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1073:10:1073:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1073:10:1073:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1073:10:1073:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1073:10:1073:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1074:10:1074:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1074:10:1074:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1074:10:1074:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1074:10:1074:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1075:10:1075:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1075:10:1075:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1075:10:1075:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1075:10:1075:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1077:5:1077:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1077:5:1077:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1077:5:1077:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1077:5:1077:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1077:5:1077:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1077:5:1077:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1077:9:1077:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1077:9:1077:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1077:9:1077:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1077:9:1077:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1077:9:1077:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1077:9:1077:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | | array_flow.rb:1077:9:1077:19 | call to rotate [element 0] | semmle.label | call to rotate [element 0] | | array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 2] | semmle.label | call to rotate [element 2] | -| array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | semmle.label | call to rotate [element 3] | | array_flow.rb:1077:9:1077:19 | call to rotate [element 3] | semmle.label | call to rotate [element 3] | | array_flow.rb:1078:10:1078:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1078:10:1078:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1078:10:1078:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1078:10:1078:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1080:10:1080:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1080:10:1080:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1080:10:1080:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1080:10:1080:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1081:10:1081:10 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1081:10:1081:10 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1081:10:1081:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1081:10:1081:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1083:5:1083:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1083:5:1083:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1083:9:1083:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1083:9:1083:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1083:9:1083:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1083:9:1083:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1083:9:1083:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1083:9:1083:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1083:9:1083:19 | call to rotate [element] | semmle.label | call to rotate [element] | -| array_flow.rb:1083:9:1083:19 | call to rotate [element] | semmle.label | call to rotate [element] | -| array_flow.rb:1084:10:1084:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1084:10:1084:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1084:10:1084:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1084:10:1084:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1085:10:1085:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1085:10:1085:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1085:10:1085:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1085:10:1085:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1086:10:1086:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1086:10:1086:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1086:10:1086:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1086:10:1086:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1087:10:1087:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1087:10:1087:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1087:10:1087:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1087:10:1087: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 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 2] | semmle.label | b [element 2] | -| array_flow.rb:1096:5:1096:5 | b [element 2] | semmle.label | b [element 2] | -| 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 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:1096:9:1096:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | -| array_flow.rb:1096:9:1096:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:1096:9:1096:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:1096:9:1096:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1096:9:1096:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1096:9:1096:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1096:9:1096:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1096:9:1096:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1096:9:1096:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1096:9:1096:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1096:9:1096:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | | array_flow.rb:1096:9:1096:17 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | | array_flow.rb:1096:9:1096:17 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1096:9:1096:17 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1097:10:1097:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1097:10:1097:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1097:10:1097:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1097:10:1097:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1098:10:1098:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1098:10:1098:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1098:10:1098:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1098:10:1098:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1098:10:1098:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1098:10:1098:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1099:10:1099:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1099:10:1099:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1099:10:1099:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1099:10:1099:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1099:10:1099:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1099:10:1099:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1100:10:1100:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1100:10:1100:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1100:10:1100:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1100:10:1100:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1101:10:1101:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1101:10:1101:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1101:10:1101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1101:10:1101:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1102:10:1102:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1102:10:1102:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1102:10:1102:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1102:10:1102:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1102:10:1102:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1102:10:1102:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1103:10:1103:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1103:10:1103:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1103:10:1103:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1103:10:1103:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1103:10:1103:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1103:10:1103:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1104:10:1104:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1104:10:1104:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1104:10:1104: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 1] | semmle.label | b [element 1] | -| array_flow.rb:1107:5:1107:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1107:5:1107:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1107:5:1107:5 | b [element] | semmle.label | b [element] | | 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 1] | semmle.label | [post] a [element 1] | | array_flow.rb:1107:9:1107:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | | array_flow.rb:1107:9:1107:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1107:9:1107:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1107:9:1107:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1107:9:1107:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1107:9:1107:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1107:9:1107:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1107:9:1107:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1107:9:1107:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | | array_flow.rb:1107:9:1107:20 | call to rotate! [element 1] | semmle.label | call to rotate! [element 1] | | array_flow.rb:1107:9:1107:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1108:10:1108:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1108:10:1108:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1108:10:1108:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1108:10:1108:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1108:10:1108:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1108:10:1108:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1109:10:1109:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1109:10:1109:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1109:10:1109:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1109:10:1109:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1109:10:1109:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1109:10:1109:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1110:10:1110:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1110:10:1110:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1110:10:1110:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1110:10:1110:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1111:10:1111:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1111:10:1111:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1111:10:1111:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1111:10:1111:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1112:10:1112:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1112:10:1112:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1112:10:1112:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1112:10:1112:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1112:10:1112:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1112:10:1112:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1113:10:1113:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1113:10:1113:10 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1113:10:1113:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1113:10:1113:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1113:10:1113:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1113:10:1113:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1114:10:1114:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1114:10:1114:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1114:10:1114:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1114:10:1114:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1115:10:1115:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1115:10:1115:10 | b [element] | semmle.label | b [element] | | 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 0] | semmle.label | b [element 0] | | array_flow.rb:1118:5:1118:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1118:5:1118:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1118:5:1118:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1118:5:1118:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1118:5:1118:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1118:9:1118:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:1118:9:1118:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:1118:9:1118:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | -| array_flow.rb:1118:9:1118:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | -| array_flow.rb:1118:9:1118:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1118:9:1118:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1118:9:1118:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1118:9:1118:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1118:9:1118:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1118:9:1118:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 0] | semmle.label | call to rotate! [element 0] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | | array_flow.rb:1118:9:1118:20 | call to rotate! [element 2] | semmle.label | call to rotate! [element 2] | | array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | semmle.label | call to rotate! [element 3] | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element 3] | semmle.label | call to rotate! [element 3] | -| array_flow.rb:1119:10:1119:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1119:10:1119:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1119:10:1119:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1119:10:1119:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1121:10:1121:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1121:10:1121:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1121:10:1121:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1121:10:1121:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1122:10:1122:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1122:10:1122:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1122:10:1122:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1122:10:1122:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1123:10:1123:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1123:10:1123:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1123:10:1123:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1123:10:1123:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1125:10:1125:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1125:10:1125:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1125:10:1125:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1125:10:1125:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1126:10:1126:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1126:10:1126:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1128:5:1128:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1128:5:1128:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1128:5:1128:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1128:5:1128:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1128:5:1128:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1128:5:1128:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1128:10:1128:22 | call to source | semmle.label | call to source | -| array_flow.rb:1128:10:1128:22 | call to source | semmle.label | call to source | -| array_flow.rb:1128:28:1128:40 | call to source | semmle.label | call to source | | array_flow.rb:1128:28:1128:40 | call to source | semmle.label | call to source | | array_flow.rb:1128:43:1128:55 | call to source | semmle.label | call to source | -| array_flow.rb:1128:43:1128:55 | call to source | semmle.label | call to source | -| array_flow.rb:1129:5:1129:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1129:5:1129:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1129:9:1129:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1129:9:1129:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1129:9:1129:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1129:9:1129:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1129:9:1129:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1129:9:1129:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1129:9:1129:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1129:9:1129:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1129:9:1129:20 | call to rotate! [element] | semmle.label | call to rotate! [element] | -| array_flow.rb:1130:10:1130:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1130:10:1130:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1130:10:1130:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1130:10:1130:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1131:10:1131:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1131:10:1131:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1131:10:1131:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1131:10:1131:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1132:10:1132:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1132:10:1132:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1132:10:1132:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1132:10:1132:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1133:10:1133:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1133:10:1133:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1133:10:1133:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1133:10:1133:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1134:10:1134:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1134:10:1134:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1135:10:1135:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1135:10:1135:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1135:10:1135:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1135:10:1135:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1136:10:1136:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1136:10:1136:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1136:10:1136:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1136:10:1136:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1137:10:1137:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1137:10:1137:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1137:10:1137:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1137:10:1137:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1141:5:1141:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1141:5:1141:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1141:19:1141:29 | call to source | semmle.label | call to source | -| array_flow.rb:1141:19:1141:29 | call to source | semmle.label | call to source | -| array_flow.rb:1142:5:1142:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1142:5:1142:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1142:9:1142:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1142:9:1142:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1142:9:1144:7 | call to select [element] | semmle.label | call to select [element] | | array_flow.rb:1142:9:1144:7 | call to select [element] | semmle.label | call to select [element] | | array_flow.rb:1142:22:1142:22 | x | semmle.label | x | -| array_flow.rb:1142:22:1142:22 | x | semmle.label | x | -| array_flow.rb:1143:14:1143:14 | x | semmle.label | x | | array_flow.rb:1143:14:1143:14 | x | semmle.label | x | | array_flow.rb:1145:10:1145:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1145:10:1145:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1145:10:1145:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1145:10:1145:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1149:5:1149:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1149:5:1149:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1149:16:1149:26 | call to source | semmle.label | call to source | | array_flow.rb:1149:16:1149:26 | call to source | semmle.label | call to source | | array_flow.rb:1150:5:1150:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1150:5:1150:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1150:9:1150:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1150:9:1150:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1150:9:1150:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1150:9:1150:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1150:9:1153:7 | call to select! [element] | semmle.label | call to select! [element] | | array_flow.rb:1150:9:1153:7 | call to select! [element] | semmle.label | call to select! [element] | | array_flow.rb:1150:23:1150:23 | x | semmle.label | x | -| array_flow.rb:1150:23:1150:23 | x | semmle.label | x | -| array_flow.rb:1151:14:1151:14 | x | semmle.label | x | | array_flow.rb:1151:14:1151:14 | x | semmle.label | x | | array_flow.rb:1154:10:1154:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1154:10:1154:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1154:10:1154:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1154:10:1154:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1155:10:1155:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1155:10:1155:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1155:10:1155:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1155:10:1155:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1159:5:1159:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1159:5:1159:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1159:5:1159:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1159:5:1159:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1159:10:1159:22 | call to source | semmle.label | call to source | -| array_flow.rb:1159:10:1159:22 | call to source | semmle.label | call to source | -| array_flow.rb:1159:28:1159:40 | call to source | semmle.label | call to source | | array_flow.rb:1159:28:1159:40 | call to source | semmle.label | call to source | | array_flow.rb:1160:5:1160:5 | b | semmle.label | b | -| array_flow.rb:1160:5:1160:5 | b | semmle.label | b | -| array_flow.rb:1160:9:1160:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | | array_flow.rb:1160:9:1160:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | | array_flow.rb:1160:9:1160:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1160:9:1160:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1160:9:1160:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1160:9:1160:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1160:9:1160:15 | call to shift | semmle.label | call to shift | -| array_flow.rb:1160:9:1160:15 | call to shift | semmle.label | call to shift | -| array_flow.rb:1161:10:1161:10 | b | semmle.label | b | | array_flow.rb:1161:10:1161:10 | b | semmle.label | b | | array_flow.rb:1163:10:1163:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1163:10:1163:10 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1163:10:1163:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1163:10:1163:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1166:5:1166:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1166:5:1166:5 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1166:5:1166:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1166:5:1166:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1166:10:1166:22 | call to source | semmle.label | call to source | -| array_flow.rb:1166:10:1166:22 | call to source | semmle.label | call to source | -| array_flow.rb:1166:28:1166:40 | call to source | semmle.label | call to source | | array_flow.rb:1166:28:1166:40 | call to source | semmle.label | call to source | | array_flow.rb:1167:5:1167:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1167:5:1167:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1167:9:1167:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | | array_flow.rb:1167:9:1167:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | | array_flow.rb:1167:9:1167:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1167:9:1167:9 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1167:9:1167:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1167:9:1167:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1167:9:1167:18 | call to shift [element 0] | semmle.label | call to shift [element 0] | -| array_flow.rb:1167:9:1167:18 | call to shift [element 0] | semmle.label | call to shift [element 0] | -| array_flow.rb:1168:10:1168:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1168:10:1168:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1168:10:1168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1168:10:1168:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1170:10:1170:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1170:10:1170:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1170:10:1170:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1170:10:1170:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1174:5:1174:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1174:5:1174:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1174:5:1174:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1174:5:1174:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1174:10:1174:22 | call to source | semmle.label | call to source | | array_flow.rb:1174:10:1174:22 | call to source | semmle.label | call to source | | array_flow.rb:1174:28:1174:40 | call to source | semmle.label | call to source | -| array_flow.rb:1174:28:1174:40 | call to source | semmle.label | call to source | -| array_flow.rb:1175:5:1175:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1175:5:1175:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1175:9:1175:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1175:9:1175:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1175:9:1175:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1175:9:1175:9 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1175:9:1175:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1175:9:1175:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1175:9:1175:18 | call to shift [element] | semmle.label | call to shift [element] | | array_flow.rb:1175:9:1175:18 | call to shift [element] | semmle.label | call to shift [element] | | array_flow.rb:1176:10:1176:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1176:10:1176:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1176:10:1176:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1176:10:1176:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1177:10:1177:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1177:10:1177:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1177:10:1177:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1177:10:1177:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1178:10:1178:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1178:10:1178:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1178:10:1178:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1178:10:1178:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1178:10:1178:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1178:10:1178:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1179:10:1179:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1179:10:1179:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1179:10:1179:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1179:10:1179:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1180:10:1180:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1180:10:1180:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1180:10:1180:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1180:10:1180:10 | a [element] | semmle.label | a [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 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1185:9:1185:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1185:9:1185:17 | call to shuffle [element] | semmle.label | call to shuffle [element] | -| array_flow.rb:1185:9:1185:17 | call to shuffle [element] | semmle.label | call to shuffle [element] | -| array_flow.rb:1188:10:1188:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1188:10:1188:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1188:10:1188:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1188:10:1188:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1189:10:1189:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1189:10:1189:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1189:10:1189:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1189:10:1189:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1190:10:1190:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1190:10:1190:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1190:10:1190:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1190:10:1190:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1191:10:1191:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1191:10:1191:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1191:10:1191: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:16:1195:26 | call to source | semmle.label | call to source | -| array_flow.rb:1195:16:1195:26 | call to source | semmle.label | call to source | -| array_flow.rb:1196:5:1196:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1196:5:1196:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1196:9:1196:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1196:9:1196:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1196:9:1196:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1196:9:1196:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | semmle.label | call to shuffle! [element] | -| array_flow.rb:1196:9:1196:18 | call to shuffle! [element] | semmle.label | call to shuffle! [element] | -| array_flow.rb:1197:10:1197:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1197:10:1197:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1197:10:1197:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1197:10:1197:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1198:10:1198:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1198:10:1198:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1198:10:1198:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1198:10:1198:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1199:10:1199:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1199:10:1199:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1199:10:1199:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1199:10:1199:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1199:10:1199:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1199:10:1199:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1200:10:1200:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1200:10:1200:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1200:10:1200:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1200:10:1200:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1201:10:1201:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1201:10:1201:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1201:10:1201:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1201:10:1201:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1202:10:1202:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1202:10:1202:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1202:10:1202:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1202:10:1202:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1206:5:1206:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1206:5:1206:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1206:5:1206:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1206:16:1206:28 | call to source | semmle.label | call to source | -| array_flow.rb:1206:16:1206:28 | call to source | semmle.label | call to source | -| array_flow.rb:1206:34:1206:46 | call to source | semmle.label | call to source | | array_flow.rb:1206:34:1206:46 | call to source | semmle.label | call to source | | array_flow.rb:1208:5:1208:5 | b | semmle.label | b | -| array_flow.rb:1208:5:1208:5 | b | semmle.label | b | -| array_flow.rb:1208:9:1208:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1208:9:1208:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1208:9:1208:17 | call to slice | semmle.label | call to slice | -| array_flow.rb:1208:9:1208:17 | call to slice | semmle.label | call to slice | -| array_flow.rb:1209:10:1209:10 | b | semmle.label | b | | array_flow.rb:1209:10:1209:10 | b | semmle.label | b | | array_flow.rb:1211:5:1211:5 | b | semmle.label | b | -| array_flow.rb:1211:5:1211:5 | b | semmle.label | b | -| array_flow.rb:1211:9:1211:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1211:9:1211:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1211:9:1211:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1211:9:1211:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1211:9:1211:19 | call to slice | semmle.label | call to slice | | array_flow.rb:1211:9:1211:19 | call to slice | semmle.label | call to slice | | array_flow.rb:1212:10:1212:10 | b | semmle.label | b | -| array_flow.rb:1212:10:1212:10 | b | semmle.label | b | -| array_flow.rb:1214:5:1214:5 | b | semmle.label | b | | array_flow.rb:1214:5:1214:5 | b | semmle.label | b | | array_flow.rb:1214:5:1214:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1214:5:1214:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1214:9:1214:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1214:9:1214:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1214:9:1214:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1214:9:1214:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1214:9:1214:17 | call to slice | semmle.label | call to slice | | array_flow.rb:1214:9:1214:17 | call to slice | semmle.label | call to slice | | array_flow.rb:1214:9:1214:17 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1214:9:1214:17 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1216:10:1216:10 | b | semmle.label | b | | array_flow.rb:1216:10:1216:10 | b | semmle.label | b | -| array_flow.rb:1218:10:1218:10 | b | semmle.label | b | | array_flow.rb:1218:10:1218:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1218:10:1218:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1218:10:1218:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1218:10:1218:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1220:5:1220:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1220:5:1220:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1220:5:1220:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1220:5:1220:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1220:9:1220:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1220:9:1220:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1220:9:1220:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1220:9:1220:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1220:9:1220:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | -| array_flow.rb:1220:9:1220:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | -| array_flow.rb:1220:9:1220:21 | call to slice [element 2] | semmle.label | call to slice [element 2] | | array_flow.rb:1220:9:1220:21 | call to slice [element 2] | semmle.label | call to slice [element 2] | | array_flow.rb:1221:10:1221:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1221:10:1221:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1221:10:1221:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1221:10:1221:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1223:10:1223:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1223:10:1223:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1223:10:1223:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1223:10:1223:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1225:5:1225:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1225:5:1225:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1225:9:1225:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1225:9:1225:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1225:9:1225:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1225:9:1225:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1225:9:1225:21 | call to slice [element] | semmle.label | call to slice [element] | | array_flow.rb:1225:9:1225:21 | call to slice [element] | semmle.label | call to slice [element] | | array_flow.rb:1226:10:1226:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1226:10:1226:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1226:10:1226:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1226:10:1226:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1227:10:1227:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1227:10:1227:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1227:10:1227:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1227:10:1227:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1229:5:1229:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1229:5:1229:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1229:9:1229:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1229:9:1229:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1229:9:1229:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | -| array_flow.rb:1229:9:1229:21 | call to slice [element 0] | semmle.label | call to slice [element 0] | -| array_flow.rb:1230:10:1230:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1230:10:1230:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1234:5:1234:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1234:5:1234:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1234:9:1234:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1234:9:1234:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1234:9:1234:22 | call to slice [element 0] | semmle.label | call to slice [element 0] | | array_flow.rb:1234:9:1234:22 | call to slice [element 0] | semmle.label | call to slice [element 0] | | array_flow.rb:1235:10:1235:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1235:10:1235:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1235:10:1235:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1235:10:1235:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1239:5:1239:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1239:5:1239:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1239:9:1239:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1239:9:1239:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1239:9:1239:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1239:9:1239:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1239:9:1239:21 | call to slice [element] | semmle.label | call to slice [element] | | array_flow.rb:1239:9:1239:21 | call to slice [element] | semmle.label | call to slice [element] | | array_flow.rb:1240:10:1240:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1240:10:1240:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1240:10:1240:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1240:10:1240:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1241:10:1241:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1241:10:1241:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1241:10:1241:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1241:10:1241:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1243:5:1243:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1243:5:1243:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1243:9:1243:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1243:9:1243:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1243:9:1243:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1243:9:1243:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1243:9:1243:24 | call to slice [element] | semmle.label | call to slice [element] | | array_flow.rb:1243:9:1243:24 | call to slice [element] | semmle.label | call to slice [element] | | array_flow.rb:1244:10:1244:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1244:10:1244:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1245:10:1245:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1245:10:1245:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1245:10:1245:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1245:10:1245:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1247:5:1247:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1247:5:1247:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1247:9:1247:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1247:9:1247:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1247:9:1247:20 | call to slice [element 2] | semmle.label | call to slice [element 2] | -| array_flow.rb:1247:9:1247:20 | call to slice [element 2] | semmle.label | call to slice [element 2] | -| array_flow.rb:1250:10:1250:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1250:10:1250:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1250:10:1250:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1250:10:1250:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1252:5:1252:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1252:5:1252:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1252:9:1252:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1252:9:1252:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1252:9:1252:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1252:9:1252:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1252:9:1252:20 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1252:9:1252:20 | call to slice [element] | semmle.label | call to slice [element] | -| array_flow.rb:1253:10:1253:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1253:10:1253:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1253:10:1253:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1253:10:1253:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1254:10:1254:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1254:10:1254:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1255:10:1255:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1255:10:1255:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1255:10:1255:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1255:10:1255:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1259:5:1259:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1259:5:1259:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1259:5:1259:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1259:5:1259:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1259:16:1259:28 | call to source | semmle.label | call to source | | array_flow.rb:1259:16:1259:28 | call to source | semmle.label | call to source | | array_flow.rb:1259:34:1259:46 | call to source | semmle.label | call to source | -| array_flow.rb:1259:34:1259:46 | call to source | semmle.label | call to source | -| array_flow.rb:1260:5:1260:5 | b | semmle.label | b | | array_flow.rb:1260:5:1260:5 | b | semmle.label | b | | array_flow.rb:1260:9:1260:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | -| array_flow.rb:1260:9:1260:9 | [post] a [element 3] | semmle.label | [post] a [element 3] | -| array_flow.rb:1260:9:1260:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1260:9:1260:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1260:9:1260:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1260:9:1260:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1260:9:1260:19 | call to slice! | semmle.label | call to slice! | | array_flow.rb:1260:9:1260:19 | call to slice! | semmle.label | call to slice! | | array_flow.rb:1261:10:1261:10 | b | semmle.label | b | -| array_flow.rb:1261:10:1261:10 | b | semmle.label | b | -| array_flow.rb:1265:10:1265:10 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1265:10:1265:10 | a [element 3] | semmle.label | a [element 3] | | 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 | semmle.label | b | | array_flow.rb:1268:5:1268:5 | b | semmle.label | b | | array_flow.rb:1268:5:1268:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1268:5:1268:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1268:9:1268:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1268:9:1268:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1268:9:1268:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1268:9:1268:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1268:9:1268:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1268:9:1268:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1268:9:1268:19 | call to slice! | semmle.label | call to slice! | -| array_flow.rb:1268:9:1268:19 | call to slice! | semmle.label | call to slice! | -| array_flow.rb:1268:9:1268:19 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1268:9:1268:19 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1269:10:1269:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1269:10:1269:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1269:10:1269:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1269:10:1269:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1270:10:1270:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1270:10:1270:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1270:10:1270:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1270:10:1270:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1271:10:1271:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1271:10:1271:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1272:10:1272:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1272:10:1272:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1272:10:1272:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1272:10:1272:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1274:10:1274:10 | b | semmle.label | b | -| array_flow.rb:1274:10:1274:10 | b | semmle.label | b | -| array_flow.rb:1276:10:1276:10 | b | semmle.label | b | -| array_flow.rb:1276:10:1276:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1276:10:1276:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1276:10:1276:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1276:10:1276: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:5:1279:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1279:5:1279:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1279:9:1279:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1279:9:1279:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1279:9:1279:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1279:9:1279:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | | array_flow.rb:1279:9:1279:22 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | -| array_flow.rb:1280:10:1280:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1280:10:1280:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1280:10:1280:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1280:10:1280:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1282:10:1282:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1282:10:1282:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1282:10:1282:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1282:10:1282:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1289:5:1289:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1289:5:1289:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1289:5:1289:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1289:5:1289:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1289:16:1289:28 | call to source | semmle.label | call to source | | array_flow.rb:1289:16:1289:28 | call to source | semmle.label | call to source | | array_flow.rb:1289:34:1289:46 | call to source | semmle.label | call to source | -| array_flow.rb:1289:34:1289:46 | call to source | semmle.label | call to source | -| array_flow.rb:1290:5:1290:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1290:5:1290:5 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1290:9:1290:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1290:9:1290:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1290:9:1290:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1290:9:1290:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1290:9:1290:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1290:9:1290:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1290:9:1290:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | | array_flow.rb:1290:9:1290:22 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | | array_flow.rb:1291:10:1291:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1291:10:1291:10 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1291:10:1291:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1291:10:1291:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1296:10:1296:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1296:10:1296:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1296:10:1296: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 0] | semmle.label | b [element 0] | -| array_flow.rb:1301:5:1301:5 | b [element 0] | semmle.label | b [element 0] | -| array_flow.rb:1301:9:1301:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:1301:9:1301:9 | [post] a [element 2] | semmle.label | [post] a [element 2] | | array_flow.rb:1301:9:1301:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1301:9:1301:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1301:9:1301:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1301:9:1301:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1301:9:1301:23 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | -| array_flow.rb:1301:9:1301:23 | call to slice! [element 0] | semmle.label | call to slice! [element 0] | -| array_flow.rb:1302:10:1302:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1302:10:1302:10 | b [element 0] | semmle.label | b [element 0] | | array_flow.rb:1302:10:1302:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1302:10:1302:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1307:10:1307:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1307:10:1307:10 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1311:5:1311:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1311:5:1311:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1311:5:1311:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1311:5:1311:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1311:16:1311:28 | call to source | semmle.label | call to source | | array_flow.rb:1311:16:1311:28 | call to source | semmle.label | call to source | | array_flow.rb:1311:34:1311:46 | call to source | semmle.label | call to source | -| array_flow.rb:1311:34:1311:46 | call to source | semmle.label | call to source | -| array_flow.rb:1312:5:1312:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1312:5:1312:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1312:9:1312:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1312:9:1312:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1312:9:1312:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1312:9:1312:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1312:9:1312:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1312:9:1312:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1312:9:1312:22 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1312:9:1312:22 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1313:10:1313:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1313:10:1313:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1313:10:1313:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1313:10:1313:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1314:10:1314:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1314:10:1314:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1314:10:1314:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1314:10:1314:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1315:10:1315:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1315:10:1315:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1315:10:1315:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1315:10:1315:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1316:10:1316:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1316:10:1316:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1317:10:1317:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1317:10:1317:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1317:10:1317:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1317:10:1317:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1318:10:1318:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1318:10:1318:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1318:10:1318:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1318:10:1318:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1320:5:1320:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1320:5:1320:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1320:5:1320:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1320:5:1320:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1320:16:1320:28 | call to source | semmle.label | call to source | -| array_flow.rb:1320:16:1320:28 | call to source | semmle.label | call to source | -| array_flow.rb:1320:34:1320:46 | call to source | semmle.label | call to source | | array_flow.rb:1320:34:1320:46 | call to source | semmle.label | call to source | | array_flow.rb:1321:5:1321:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1321:5:1321:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1321:9:1321:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1321:9:1321:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1321:9:1321:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1321:9:1321:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1321:9:1321:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1321:9:1321:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1321:9:1321:22 | call to slice! [element] | semmle.label | call to slice! [element] | -| array_flow.rb:1321:9:1321:22 | call to slice! [element] | semmle.label | call to slice! [element] | -| array_flow.rb:1322:10:1322:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1322:10:1322:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1322:10:1322:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1322:10:1322:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1323:10:1323:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1323:10:1323:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1323:10:1323:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1323:10:1323:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1324:10:1324:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1324:10:1324:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1324:10:1324:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1324:10:1324:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1325:10:1325:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1325:10:1325:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1326:10:1326:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1326:10:1326:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1326:10:1326:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1326:10:1326:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1327:10:1327:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1327:10:1327:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1327:10:1327:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1327:10:1327:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1329:5:1329:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1329:5:1329:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1329:5:1329:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1329:5:1329:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1329:16:1329:28 | call to source | semmle.label | call to source | | array_flow.rb:1329:16:1329:28 | call to source | semmle.label | call to source | | array_flow.rb:1329:34:1329:46 | call to source | semmle.label | call to source | -| array_flow.rb:1329:34:1329:46 | call to source | semmle.label | call to source | -| array_flow.rb:1330:5:1330:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1330:5:1330:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1330:9:1330:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1330:9:1330:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1330:9:1330:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1330:9:1330:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1330:9:1330:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1330:9:1330:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1330:9:1330:25 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1330:9:1330:25 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1331:10:1331:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1331:10:1331:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1331:10:1331:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1331:10:1331:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1332:10:1332:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1332:10:1332:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1332:10:1332:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1332:10:1332:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1333:10:1333:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1333:10:1333:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1334:10:1334:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1334:10:1334:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1334:10:1334:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1334:10:1334:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1335:10:1335:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1335:10:1335:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1335:10:1335:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1335:10:1335:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1336:10:1336:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1336:10:1336:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1336:10:1336:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1336:10:1336:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1338:5:1338:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1338:5:1338:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1338:5:1338:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1338:5:1338:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1338:16:1338:28 | call to source | semmle.label | call to source | -| array_flow.rb:1338:16:1338:28 | call to source | semmle.label | call to source | -| array_flow.rb:1338:34:1338:46 | call to source | semmle.label | call to source | | array_flow.rb:1338:34:1338:46 | call to source | semmle.label | call to source | | array_flow.rb:1339:5:1339:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1339:5:1339:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1339:9:1339:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | | array_flow.rb:1339:9:1339:9 | [post] a [element 1] | semmle.label | [post] a [element 1] | | array_flow.rb:1339:9:1339:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1339:9:1339:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1339:9:1339:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1339:9:1339:9 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1339:9:1339:21 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | -| array_flow.rb:1339:9:1339:21 | call to slice! [element 2] | semmle.label | call to slice! [element 2] | -| array_flow.rb:1342:10:1342:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1342:10:1342:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1342:10:1342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1342:10:1342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1344:10:1344:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1344:10:1344:10 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1344:10:1344:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1344:10:1344: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:5:1347:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1347:5:1347:5 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1347:16:1347:28 | call to source | semmle.label | call to source | | array_flow.rb:1347:16:1347:28 | call to source | semmle.label | call to source | | array_flow.rb:1347:34:1347:46 | call to source | semmle.label | call to source | -| array_flow.rb:1347:34:1347:46 | call to source | semmle.label | call to source | -| array_flow.rb:1348:5:1348:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1348:5:1348:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1348:9:1348:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1348:9:1348:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1348:9:1348:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1348:9:1348:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1348:9:1348:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1348:9:1348:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1348:9:1348:21 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1348:9:1348:21 | call to slice! [element] | semmle.label | call to slice! [element] | | array_flow.rb:1349:10:1349:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1349:10:1349:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1349:10:1349:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1349:10:1349:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1350:10:1350:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1350:10:1350:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1350:10:1350:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1350:10:1350:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1351:10:1351:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1351:10:1351:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1351:10:1351:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1351:10:1351:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1352:10:1352:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1352:10:1352:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1352:10:1352:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1352:10:1352:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1353:10:1353:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1353:10:1353:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1353:10:1353:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1353:10:1353:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1354:10:1354:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1354:10:1354:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1354:10:1354:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1354:10:1354:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1358:5:1358:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1358:5:1358:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1358:16:1358:26 | call to source | semmle.label | call to source | | array_flow.rb:1358:16:1358:26 | call to source | semmle.label | call to source | | array_flow.rb:1359:9:1359:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1359:9:1359:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1359:27:1359:27 | x | semmle.label | x | | array_flow.rb:1359:27:1359:27 | x | semmle.label | x | | array_flow.rb:1360:14:1360:14 | x | semmle.label | x | -| array_flow.rb:1360:14:1360:14 | x | semmle.label | x | -| array_flow.rb:1366:5:1366:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1366:5:1366:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1366:16:1366:26 | call to source | semmle.label | call to source | -| array_flow.rb:1366:16:1366:26 | call to source | semmle.label | call to source | -| array_flow.rb:1367:9:1367:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1367:9:1367:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1367:28:1367:28 | x | semmle.label | x | -| array_flow.rb:1367:28:1367:28 | x | semmle.label | x | -| array_flow.rb:1368:14:1368:14 | x | semmle.label | x | | array_flow.rb:1368:14:1368:14 | x | semmle.label | x | | array_flow.rb:1374:5:1374:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1374:5:1374:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1374:16:1374:26 | call to source | semmle.label | call to source | | array_flow.rb:1374:16:1374:26 | call to source | semmle.label | call to source | | 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:26:1375:26 | x | semmle.label | x | | array_flow.rb:1375:26:1375:26 | x | semmle.label | x | | array_flow.rb:1375:29:1375:29 | y | semmle.label | y | -| array_flow.rb:1375:29:1375:29 | y | semmle.label | y | -| array_flow.rb:1376:14:1376:14 | x | semmle.label | x | | array_flow.rb:1376:14:1376:14 | x | semmle.label | x | | array_flow.rb:1377:14:1377:14 | y | semmle.label | y | -| array_flow.rb:1377:14:1377:14 | y | semmle.label | y | -| array_flow.rb:1382:5:1382:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1382:5:1382:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1382:16:1382:26 | call to source | semmle.label | call to source | -| array_flow.rb:1382:16:1382:26 | call to source | semmle.label | call to source | -| array_flow.rb:1383:5:1383:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1383:5:1383:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1383:9:1383:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1383:9:1383:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1383:9:1383:14 | call to sort [element] | semmle.label | call to sort [element] | | array_flow.rb:1383:9:1383:14 | call to sort [element] | semmle.label | call to sort [element] | | array_flow.rb:1384:10:1384:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1384:10:1384:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1384:10:1384:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1384:10:1384:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1385:10:1385:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1385:10:1385:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1385:10:1385:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1385:10:1385:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1386:5:1386:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1386:5:1386:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1386:9:1386:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1386:9:1386:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1386:9:1390:7 | call to sort [element] | semmle.label | call to sort [element] | -| array_flow.rb:1386:9:1390:7 | call to sort [element] | semmle.label | call to sort [element] | -| array_flow.rb:1386:20:1386:20 | x | semmle.label | x | | array_flow.rb:1386:20:1386:20 | x | semmle.label | x | | array_flow.rb:1386:23:1386:23 | y | semmle.label | y | -| array_flow.rb:1386:23:1386:23 | y | semmle.label | y | -| array_flow.rb:1387:14:1387:14 | x | semmle.label | x | | array_flow.rb:1387:14:1387:14 | x | semmle.label | x | | array_flow.rb:1388:14:1388:14 | y | semmle.label | y | -| array_flow.rb:1388:14:1388:14 | y | semmle.label | y | -| array_flow.rb:1391:10:1391:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1391:10:1391:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1391:10:1391:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1391:10:1391:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1392:10:1392:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1392:10:1392:10 | c [element] | semmle.label | c [element] | | array_flow.rb:1392:10:1392:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1392:10:1392:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1396:5:1396:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1396:5:1396:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1396:16:1396:26 | call to source | semmle.label | call to source | -| array_flow.rb:1396:16:1396:26 | call to source | semmle.label | call to source | -| array_flow.rb:1397:5:1397:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1397:5:1397:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1397:9:1397:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1397:9:1397:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1397:9:1397:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1397:9:1397:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1397:9:1397:15 | call to sort! [element] | semmle.label | call to sort! [element] | -| array_flow.rb:1397:9:1397:15 | call to sort! [element] | semmle.label | call to sort! [element] | -| array_flow.rb:1398:10:1398:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1398:10:1398:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1398:10:1398:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1398:10:1398:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1399:10:1399:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1399:10:1399:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1399:10:1399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1399:10:1399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1400:10:1400:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1400:10:1400:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1400:10:1400:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1400:10:1400:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1401:10:1401:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1401:10:1401:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1403:5:1403:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1403:5:1403:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1403:16:1403:26 | call to source | semmle.label | call to source | -| array_flow.rb:1403:16:1403:26 | call to source | semmle.label | call to source | -| array_flow.rb:1404:5:1404:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1404:5:1404:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1404:9:1404:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1404:9:1404:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1404:9:1404:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1404:9:1404:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1404:9:1408:7 | call to sort! [element] | semmle.label | call to sort! [element] | -| array_flow.rb:1404:9:1408:7 | call to sort! [element] | semmle.label | call to sort! [element] | -| array_flow.rb:1404:21:1404:21 | x | semmle.label | x | | array_flow.rb:1404:21:1404:21 | x | semmle.label | x | | array_flow.rb:1404:24:1404:24 | y | semmle.label | y | -| array_flow.rb:1404:24:1404:24 | y | semmle.label | y | -| array_flow.rb:1405:14:1405:14 | x | semmle.label | x | | array_flow.rb:1405:14:1405:14 | x | semmle.label | x | | array_flow.rb:1406:14:1406:14 | y | semmle.label | y | -| array_flow.rb:1406:14:1406:14 | y | semmle.label | y | -| array_flow.rb:1409:10:1409:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1409:10:1409:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1409:10:1409:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1409:10:1409:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1410:10:1410:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1410:10:1410:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1410:10:1410:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1410:10:1410:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1411:10:1411:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1411:10:1411:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1412:10:1412:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1412:10:1412:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1412:10:1412:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1412:10:1412:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1416:5:1416:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1416:5:1416:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1416:16:1416:26 | call to source | semmle.label | call to source | -| array_flow.rb:1416:16:1416:26 | call to source | semmle.label | call to source | -| array_flow.rb:1417:5:1417:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1417:5:1417:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1417:9:1417:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1417:9:1417:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1417:9:1420:7 | call to sort_by [element] | semmle.label | call to sort_by [element] | | array_flow.rb:1417:9:1420:7 | call to sort_by [element] | semmle.label | call to sort_by [element] | | array_flow.rb:1417:23:1417:23 | x | semmle.label | x | -| array_flow.rb:1417:23:1417:23 | x | semmle.label | x | -| array_flow.rb:1418:14:1418:14 | x | semmle.label | x | | array_flow.rb:1418:14:1418:14 | x | semmle.label | x | | array_flow.rb:1421:10:1421:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1421:10:1421:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1421:10:1421:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1421:10:1421:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1422:10:1422:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1422:10:1422:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1422:10:1422:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1422:10:1422:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1426:5:1426:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1426:5:1426:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1426:16:1426:26 | call to source | semmle.label | call to source | | array_flow.rb:1426:16:1426:26 | call to source | semmle.label | call to source | | array_flow.rb:1427:5:1427:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1427:5:1427:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1427:9:1427:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1427:9:1427:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1427:9:1427:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1427:9:1427:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1427:9:1430:7 | call to sort_by! [element] | semmle.label | call to sort_by! [element] | | array_flow.rb:1427:9:1430:7 | call to sort_by! [element] | semmle.label | call to sort_by! [element] | | array_flow.rb:1427:24:1427:24 | x | semmle.label | x | -| array_flow.rb:1427:24:1427:24 | x | semmle.label | x | -| array_flow.rb:1428:14:1428:14 | x | semmle.label | x | | array_flow.rb:1428:14:1428:14 | x | semmle.label | x | | array_flow.rb:1431:10:1431:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1431:10:1431:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1431:10:1431:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1431:10:1431:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1432:10:1432:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1432:10:1432:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1432:10:1432:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1432:10:1432:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1433:10:1433:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1433:10:1433:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1433:10:1433:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1433:10:1433:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1434:10:1434:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1434:10:1434:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1434:10:1434:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1434:10:1434:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1438:5:1438:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1438:5:1438:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1438:16:1438:26 | call to source | semmle.label | call to source | | array_flow.rb:1438:16:1438:26 | call to source | semmle.label | call to source | | array_flow.rb:1439:9:1439:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1439:9:1439:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1439:19:1439:19 | x | semmle.label | x | | array_flow.rb:1439:19:1439:19 | x | semmle.label | x | | array_flow.rb:1440:14:1440:14 | x | semmle.label | x | -| array_flow.rb:1440:14:1440:14 | x | semmle.label | x | -| array_flow.rb:1446:5:1446:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1446:5:1446:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1446:5:1446:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1446:5:1446:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1446:16:1446:28 | call to source | semmle.label | call to source | | array_flow.rb:1446:16:1446:28 | call to source | semmle.label | call to source | | array_flow.rb:1446:31:1446:43 | call to source | semmle.label | call to source | -| array_flow.rb:1446:31:1446:43 | call to source | semmle.label | call to source | -| array_flow.rb:1447:5:1447:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1447:5:1447:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1447:5:1447:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1447:5:1447:5 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1447:9:1447:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1447:9:1447:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1447:9:1447:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1447:9:1447:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1447:9:1447:17 | call to take [element 2] | semmle.label | call to take [element 2] | | array_flow.rb:1447:9:1447:17 | call to take [element 2] | semmle.label | call to take [element 2] | | array_flow.rb:1447:9:1447:17 | call to take [element 3] | semmle.label | call to take [element 3] | -| array_flow.rb:1447:9:1447:17 | call to take [element 3] | semmle.label | call to take [element 3] | -| array_flow.rb:1450:10:1450:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1450:10:1450:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1450:10:1450:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1450:10:1450:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1451:10:1451:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1451:10:1451:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1451:10:1451:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1451:10:1451:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1452:5:1452:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1452:5:1452:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1452:9:1452:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1452:9:1452:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1452:9:1452:17 | call to take [element 2] | semmle.label | call to take [element 2] | | array_flow.rb:1452:9:1452:17 | call to take [element 2] | semmle.label | call to take [element 2] | | array_flow.rb:1455:10:1455:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1455:10:1455:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1457:10:1457:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1457:10:1457:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1457:10:1457:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1457:10:1457:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1458:5:1458:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1458:5:1458:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1458:5:1458:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1458:5:1458:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1458:9:1458:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1458:9:1458:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1458:9:1458:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1458:9:1458:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1458:9:1458:19 | call to take [element 2] | semmle.label | call to take [element 2] | -| array_flow.rb:1458:9:1458:19 | call to take [element 2] | semmle.label | call to take [element 2] | -| array_flow.rb:1458:9:1458:19 | call to take [element 3] | semmle.label | call to take [element 3] | | array_flow.rb:1458:9:1458:19 | call to take [element 3] | semmle.label | call to take [element 3] | | array_flow.rb:1461:10:1461:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1461:10:1461:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1461:10:1461:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1461:10:1461:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1462:10:1462:10 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1462:10:1462:10 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1462:10:1462:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1462:10:1462:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1463:10:1463:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1463:10:1463:10 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1463:10:1463:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1463:10:1463:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1463:10:1463:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1463:10:1463:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1464:5:1464:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1464:5:1464:5 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1464:12:1464:24 | call to source | semmle.label | call to source | -| array_flow.rb:1464:12:1464:24 | call to source | semmle.label | call to source | -| array_flow.rb:1465:5:1465:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1465:5:1465:5 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1465:5:1465:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1465:5:1465:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1465:9:1465:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1465:9:1465:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1465:9:1465:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:1465:9:1465:9 | a [element] | semmle.label | a [element] | -| array_flow.rb:1465:9:1465:17 | call to take [element 2] | semmle.label | call to take [element 2] | | array_flow.rb:1465:9:1465:17 | call to take [element 2] | semmle.label | call to take [element 2] | | array_flow.rb:1465:9:1465:17 | call to take [element] | semmle.label | call to take [element] | -| array_flow.rb:1465:9:1465:17 | call to take [element] | semmle.label | call to take [element] | -| array_flow.rb:1466:10:1466:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1466:10:1466:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1466:10:1466:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1466:10:1466:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1470:5:1470:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1470:5:1470:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1470:16:1470:26 | call to source | semmle.label | call to source | | array_flow.rb:1470:16:1470:26 | call to source | semmle.label | call to source | | array_flow.rb:1471:5:1471:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1471:5:1471:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1471:9:1471:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1471:9:1471:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1471:9:1474:7 | call to take_while [element 2] | semmle.label | call to take_while [element 2] | -| array_flow.rb:1471:9:1474:7 | call to take_while [element 2] | semmle.label | call to take_while [element 2] | -| array_flow.rb:1471:26:1471:26 | x | semmle.label | x | | array_flow.rb:1471:26:1471:26 | x | semmle.label | x | | array_flow.rb:1472:14:1472:14 | x | semmle.label | x | -| array_flow.rb:1472:14:1472:14 | x | semmle.label | x | -| array_flow.rb:1477:10:1477:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1477:10:1477:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1477:10:1477:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1477:10:1477:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1483:5:1483:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1483:5:1483:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1483:19:1483:29 | call to source | semmle.label | call to source | -| array_flow.rb:1483:19:1483:29 | call to source | semmle.label | call to source | -| array_flow.rb:1484:5:1484:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1484:5:1484:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1484:9:1484:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1484:9:1484:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1484:9:1484:14 | call to to_a [element 3] | semmle.label | call to to_a [element 3] | | array_flow.rb:1484:9:1484:14 | call to to_a [element 3] | semmle.label | call to to_a [element 3] | | array_flow.rb:1485:10:1485:10 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1485:10:1485:10 | b [element 3] | semmle.label | b [element 3] | -| array_flow.rb:1485:10:1485:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1485:10:1485:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1489:5:1489:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1489:5:1489:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1489:16:1489:26 | call to source | semmle.label | call to source | | array_flow.rb:1489:16:1489:26 | call to source | semmle.label | call to source | | array_flow.rb:1490:5:1490:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1490:5:1490:5 | b [element 2] | semmle.label | b [element 2] | -| array_flow.rb:1490:9:1490:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1490:9:1490:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1490:9:1490:16 | call to to_ary [element 2] | semmle.label | call to to_ary [element 2] | -| array_flow.rb:1490:9:1490:16 | call to to_ary [element 2] | semmle.label | call to to_ary [element 2] | -| array_flow.rb:1493:10:1493:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1493:10:1493:10 | b [element 2] | semmle.label | b [element 2] | | array_flow.rb:1493:10:1493:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1493:10:1493:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1506:5:1506:5 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | | array_flow.rb:1506:5:1506:5 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | | array_flow.rb:1506:5:1506:5 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | -| array_flow.rb:1506:5:1506:5 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | -| array_flow.rb:1506:5:1506:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:1506:5:1506:5 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | | array_flow.rb:1506:14:1506:26 | call to source | semmle.label | call to source | -| array_flow.rb:1506:14:1506:26 | call to source | semmle.label | call to source | -| array_flow.rb:1506:34:1506:46 | call to source | semmle.label | call to source | | array_flow.rb:1506:34:1506:46 | call to source | semmle.label | call to source | | array_flow.rb:1506:54:1506:66 | call to source | semmle.label | call to source | -| array_flow.rb:1506:54:1506:66 | call to source | semmle.label | call to source | -| array_flow.rb:1507:5:1507:5 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | | array_flow.rb:1507:5:1507:5 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | | array_flow.rb:1507:5:1507:5 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | -| array_flow.rb:1507:5:1507:5 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | -| array_flow.rb:1507:5:1507:5 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | | array_flow.rb:1507:5:1507:5 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | | array_flow.rb:1507:9:1507:9 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | -| array_flow.rb:1507:9:1507:9 | a [element 0, element 1] | semmle.label | a [element 0, element 1] | -| array_flow.rb:1507:9:1507:9 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | | array_flow.rb:1507:9:1507:9 | a [element 1, element 1] | semmle.label | a [element 1, element 1] | | array_flow.rb:1507:9:1507:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:1507:9:1507:9 | a [element 2, element 1] | semmle.label | a [element 2, element 1] | -| array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 0] | semmle.label | call to transpose [element 1, element 0] | | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 0] | semmle.label | call to transpose [element 1, element 0] | | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 1] | semmle.label | call to transpose [element 1, element 1] | -| array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 1] | semmle.label | call to transpose [element 1, element 1] | -| array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 2] | semmle.label | call to transpose [element 1, element 2] | | array_flow.rb:1507:9:1507:19 | call to transpose [element 1, element 2] | semmle.label | call to transpose [element 1, element 2] | | array_flow.rb:1511:10:1511:10 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | -| array_flow.rb:1511:10:1511:10 | b [element 1, element 0] | semmle.label | b [element 1, element 0] | -| array_flow.rb:1511:10:1511:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1511:10:1511:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1511:10:1511:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1511:10:1511:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1512:10:1512:10 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | | array_flow.rb:1512:10:1512:10 | b [element 1, element 1] | semmle.label | b [element 1, element 1] | | array_flow.rb:1512:10:1512:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:1512:10:1512:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| array_flow.rb:1512:10:1512:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1512:10:1512:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1513:10:1513:10 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | -| array_flow.rb:1513:10:1513:10 | b [element 1, element 2] | semmle.label | b [element 1, element 2] | -| array_flow.rb:1513:10:1513:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | | array_flow.rb:1513:10:1513:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | | array_flow.rb:1513:10:1513:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1513:10:1513:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1517:5:1517:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1517:5:1517:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1517:16:1517:28 | call to source | semmle.label | call to source | -| array_flow.rb:1517:16:1517:28 | call to source | semmle.label | call to source | -| array_flow.rb:1518:5:1518:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1518:5:1518:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1518:13:1518:25 | call to source | semmle.label | call to source | -| array_flow.rb:1518:13:1518:25 | call to source | semmle.label | call to source | -| array_flow.rb:1519:5:1519:5 | c [element 1] | semmle.label | c [element 1] | | array_flow.rb:1519:5:1519:5 | c [element 1] | semmle.label | c [element 1] | | array_flow.rb:1519:13:1519:25 | call to source | semmle.label | call to source | -| array_flow.rb:1519:13:1519:25 | call to source | semmle.label | call to source | -| array_flow.rb:1520:5:1520:5 | d [element] | semmle.label | d [element] | | array_flow.rb:1520:5:1520:5 | d [element] | semmle.label | d [element] | | array_flow.rb:1520:9:1520:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1520:9:1520:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1520:9:1520:21 | call to union [element] | semmle.label | call to union [element] | | array_flow.rb:1520:9:1520:21 | call to union [element] | semmle.label | call to union [element] | | array_flow.rb:1520:17:1520:17 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1520:17:1520:17 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1520:20:1520:20 | c [element 1] | semmle.label | c [element 1] | | array_flow.rb:1520:20:1520:20 | c [element 1] | semmle.label | c [element 1] | | array_flow.rb:1521:10:1521:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:1521:10:1521:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:1521:10:1521:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1521:10:1521:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1522:10:1522:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:1522:10:1522:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:1522:10:1522:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1522:10:1522:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1523:10:1523:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:1523:10:1523:10 | d [element] | semmle.label | d [element] | -| array_flow.rb:1523:10:1523:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1523:10:1523:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1527:5:1527:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1527:5:1527:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1527:5:1527:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1527:5:1527:5 | a [element 4] | semmle.label | a [element 4] | | array_flow.rb:1527:19:1527:31 | call to source | semmle.label | call to source | -| array_flow.rb:1527:19:1527:31 | call to source | semmle.label | call to source | -| array_flow.rb:1527:34:1527:46 | call to source | semmle.label | call to source | | array_flow.rb:1527:34:1527:46 | call to source | semmle.label | call to source | | array_flow.rb:1529:5:1529:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1529:5:1529:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1529:9:1529:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1529:9:1529:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1529:9:1529:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1529:9:1529:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1529:9:1529:14 | call to uniq [element] | semmle.label | call to uniq [element] | | array_flow.rb:1529:9:1529:14 | call to uniq [element] | semmle.label | call to uniq [element] | | array_flow.rb:1530:10:1530:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1530:10:1530:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1530:10:1530:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1530:10:1530:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1531:10:1531:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1531:10:1531:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1531:10:1531:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1531:10:1531:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1533:5:1533:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1533:5:1533:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1533:9:1533:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1533:9:1533:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1533:9:1533:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1533:9:1533:9 | a [element 4] | semmle.label | a [element 4] | -| array_flow.rb:1533:9:1536:7 | call to uniq [element] | semmle.label | call to uniq [element] | | array_flow.rb:1533:9:1536:7 | call to uniq [element] | semmle.label | call to uniq [element] | | array_flow.rb:1533:20:1533:20 | x | semmle.label | x | -| array_flow.rb:1533:20:1533:20 | x | semmle.label | x | -| array_flow.rb:1534:14:1534:14 | x | semmle.label | x | | array_flow.rb:1534:14:1534:14 | x | semmle.label | x | | array_flow.rb:1537:10:1537:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1537:10:1537:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1537:10:1537:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1537:10:1537:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1541:5:1541:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1541:5:1541:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1541:5:1541:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1541:5:1541:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1541:16:1541:28 | call to source | semmle.label | call to source | -| array_flow.rb:1541:16:1541:28 | call to source | semmle.label | call to source | -| array_flow.rb:1541:31:1541:43 | call to source | semmle.label | call to source | | array_flow.rb:1541:31:1541:43 | call to source | semmle.label | call to source | | array_flow.rb:1542:5:1542:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1542:5:1542:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1542:9:1542:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1542:9:1542:9 | [post] a [element] | semmle.label | [post] a [element] | | array_flow.rb:1542:9:1542:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1542:9:1542:9 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1542:9:1542:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1542:9:1542:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1542:9:1542:15 | call to uniq! [element] | semmle.label | call to uniq! [element] | -| array_flow.rb:1542:9:1542:15 | call to uniq! [element] | semmle.label | call to uniq! [element] | -| array_flow.rb:1543:10:1543:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1543:10:1543:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1543:10:1543:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1543:10:1543:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1544:10:1544:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1544:10:1544:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1544:10:1544:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1544:10:1544:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1545:10:1545:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1545:10:1545:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1546:10:1546:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1546:10:1546:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1546:10:1546:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1546:10:1546:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1548:5:1548:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1548:5:1548:5 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1548:5:1548:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1548:5:1548:5 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1548:16:1548:28 | call to source | semmle.label | call to source | | array_flow.rb:1548:16:1548:28 | call to source | semmle.label | call to source | | array_flow.rb:1548:31:1548:43 | call to source | semmle.label | call to source | -| array_flow.rb:1548:31:1548:43 | call to source | semmle.label | call to source | -| array_flow.rb:1549:5:1549:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1549:5:1549:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1549:9:1549:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1549:9:1549:9 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1549:9:1549:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1549:9:1549:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1549:9:1549:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1549:9:1549:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1549:9:1552:7 | call to uniq! [element] | semmle.label | call to uniq! [element] | | array_flow.rb:1549:9:1552:7 | call to uniq! [element] | semmle.label | call to uniq! [element] | | array_flow.rb:1549:21:1549:21 | x | semmle.label | x | -| array_flow.rb:1549:21:1549:21 | x | semmle.label | x | -| array_flow.rb:1550:14:1550:14 | x | semmle.label | x | | array_flow.rb:1550:14:1550:14 | x | semmle.label | x | | array_flow.rb:1553:10:1553:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1553:10:1553:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1553:10:1553:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1553:10:1553:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1554:10:1554:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1554:10:1554:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1554:10:1554:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1554:10:1554:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1555:10:1555:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1555:10:1555:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1555:10:1555:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1555:10:1555:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1556:10:1556:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1556:10:1556:10 | a [element] | semmle.label | a [element] | -| 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 2] | semmle.label | a [element 2] | -| array_flow.rb:1560:5:1560:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1560:16:1560:28 | call to source | semmle.label | call to source | | array_flow.rb:1560:16:1560:28 | call to source | semmle.label | call to source | | array_flow.rb:1561:5:1561:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1561:5:1561:5 | [post] a [element 2] | semmle.label | [post] a [element 2] | -| array_flow.rb:1561:5:1561:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | | array_flow.rb:1561:5:1561:5 | [post] a [element 5] | semmle.label | [post] a [element 5] | | array_flow.rb:1561:5:1561:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1561:5:1561:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1561:21:1561:33 | call to source | semmle.label | call to source | | array_flow.rb:1561:21:1561:33 | call to source | semmle.label | call to source | | array_flow.rb:1564:10:1564:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1564:10:1564:10 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1564:10:1564:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1564:10:1564:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1567:10:1567:10 | a [element 5] | semmle.label | a [element 5] | -| array_flow.rb:1567:10:1567:10 | a [element 5] | semmle.label | a [element 5] | -| array_flow.rb:1567:10:1567:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1567:10:1567:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1571:5:1571:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1571:5:1571:5 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1571:5:1571:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1571:5:1571:5 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1571:13:1571:25 | call to source | semmle.label | call to source | -| array_flow.rb:1571:13:1571:25 | call to source | semmle.label | call to source | -| array_flow.rb:1571:31:1571:43 | call to source | semmle.label | call to source | | array_flow.rb:1571:31:1571:43 | call to source | semmle.label | call to source | | array_flow.rb:1573:5:1573:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1573:5:1573:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1573:5:1573:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1573:5:1573:5 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1573:9:1573:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1573:9:1573:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1573:9:1573:31 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | | array_flow.rb:1573:9:1573:31 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | | array_flow.rb:1573:9:1573:31 | call to values_at [element 3] | semmle.label | call to values_at [element 3] | -| array_flow.rb:1573:9:1573:31 | call to values_at [element 3] | semmle.label | call to values_at [element 3] | -| array_flow.rb:1575:10:1575:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1575:10:1575:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1575:10:1575:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1575:10:1575:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1577:10:1577:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1577:10:1577:10 | b [element 3] | semmle.label | b [element 3] | | array_flow.rb:1577:10:1577:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1577:10:1577:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1579:5:1579:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1579:5:1579:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1579:9:1579:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1579:9:1579:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1579:9:1579:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1579:9:1579:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1579:9:1579:25 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1579:9:1579:25 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1580:10:1580:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1580:10:1580:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1581:10:1581:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1581:10:1581:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1581:10:1581:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1581:10:1581:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1583:5:1583:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1583:5:1583:5 | b [element] | semmle.label | b [element] | | array_flow.rb:1583:9:1583:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1583:9:1583:9 | a [element 1] | semmle.label | a [element 1] | -| array_flow.rb:1583:9:1583:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1583:9:1583:9 | a [element 3] | semmle.label | a [element 3] | | array_flow.rb:1583:9:1583:26 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1583:9:1583:26 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1584:10:1584:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1584:10:1584:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1584:10:1584:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1584:10:1584:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1585:10:1585:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1585:10:1585:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1585:10:1585:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1585:10:1585:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1587:5:1587:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1587:5:1587:5 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1587:5:1587:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1587:5:1587:5 | b [element] | semmle.label | b [element] | -| array_flow.rb:1587:9:1587:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1587:9:1587:9 | a [element 1] | semmle.label | a [element 1] | | array_flow.rb:1587:9:1587:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1587:9:1587:9 | a [element 3] | semmle.label | a [element 3] | -| array_flow.rb:1587:9:1587:28 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | | array_flow.rb:1587:9:1587:28 | call to values_at [element 1] | semmle.label | call to values_at [element 1] | | array_flow.rb:1587:9:1587:28 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1587:9:1587:28 | call to values_at [element] | semmle.label | call to values_at [element] | -| array_flow.rb:1588:10:1588:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1588:10:1588:10 | b [element] | semmle.label | b [element] | | array_flow.rb:1588:10:1588:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1588:10:1588:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1589:10:1589:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1589:10:1589:10 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1589:10:1589:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1589:10:1589:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1589:10:1589:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1589:10:1589:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1590:10:1590:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1590:10:1590:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1590:10:1590:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1590:10:1590:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1591:10:1591:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1591:10:1591:10 | b [element] | semmle.label | b [element] | -| array_flow.rb:1591:10:1591:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1591:10:1591:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1595:5:1595:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1595:5:1595:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1595:16:1595:28 | call to source | semmle.label | call to source | | array_flow.rb:1595:16:1595:28 | call to source | semmle.label | call to source | | array_flow.rb:1596:5:1596:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1596:5:1596:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1596:13:1596:25 | call to source | semmle.label | call to source | | array_flow.rb:1596:13:1596:25 | call to source | semmle.label | call to source | | array_flow.rb:1597:5:1597:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1597:5:1597:5 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1597:10:1597:22 | call to source | semmle.label | call to source | | array_flow.rb:1597:10:1597:22 | call to source | semmle.label | call to source | | array_flow.rb:1598:5:1598:5 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | -| array_flow.rb:1598:5:1598:5 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | -| array_flow.rb:1598:5:1598:5 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | | array_flow.rb:1598:5:1598:5 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | | array_flow.rb:1598:5:1598:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | -| array_flow.rb:1598:5:1598:5 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | -| array_flow.rb:1598:9:1598:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1598:9:1598:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1598:9:1598:19 | call to zip [element 0, element 2] | semmle.label | call to zip [element 0, element 2] | -| array_flow.rb:1598:9:1598:19 | call to zip [element 0, element 2] | semmle.label | call to zip [element 0, element 2] | -| array_flow.rb:1598:9:1598:19 | call to zip [element 1, element 1] | semmle.label | call to zip [element 1, element 1] | | array_flow.rb:1598:9:1598:19 | call to zip [element 1, element 1] | semmle.label | call to zip [element 1, element 1] | | array_flow.rb:1598:9:1598:19 | call to zip [element 2, element 0] | semmle.label | call to zip [element 2, element 0] | -| array_flow.rb:1598:9:1598:19 | call to zip [element 2, element 0] | semmle.label | call to zip [element 2, element 0] | -| array_flow.rb:1598:15:1598:15 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1598:15:1598:15 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1598:18:1598:18 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1598:18:1598:18 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1600:10:1600:10 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | | array_flow.rb:1600:10:1600:10 | d [element 0, element 2] | semmle.label | d [element 0, element 2] | | array_flow.rb:1600:10:1600:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | -| array_flow.rb:1600:10:1600:13 | ...[...] [element 2] | semmle.label | ...[...] [element 2] | -| array_flow.rb:1600:10:1600:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1600:10:1600:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1601:10:1601:10 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | -| array_flow.rb:1601:10:1601:10 | d [element 1, element 1] | semmle.label | d [element 1, element 1] | -| array_flow.rb:1601:10:1601:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:1601:10:1601:13 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | array_flow.rb:1601:10:1601:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1601:10:1601:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1602:10:1602:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | | array_flow.rb:1602:10:1602:10 | d [element 2, element 0] | semmle.label | d [element 2, element 0] | | array_flow.rb:1602:10:1602:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | -| array_flow.rb:1602:10:1602:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | -| array_flow.rb:1602:10:1602:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1602:10:1602:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1603:5:1603:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1603:5:1603:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1603:11:1603:11 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1603:11:1603:11 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1603:14:1603:14 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1603:14:1603:14 | c [element 0] | semmle.label | c [element 0] | -| array_flow.rb:1603:21:1603:21 | x [element 0] | semmle.label | x [element 0] | | array_flow.rb:1603:21:1603:21 | x [element 0] | semmle.label | x [element 0] | | array_flow.rb:1603:21:1603:21 | x [element 1] | semmle.label | x [element 1] | -| array_flow.rb:1603:21:1603:21 | x [element 1] | semmle.label | x [element 1] | -| array_flow.rb:1603:21:1603:21 | x [element 2] | semmle.label | x [element 2] | | array_flow.rb:1603:21:1603:21 | x [element 2] | semmle.label | x [element 2] | | array_flow.rb:1604:14:1604:14 | x [element 0] | semmle.label | x [element 0] | -| array_flow.rb:1604:14:1604:14 | x [element 0] | semmle.label | x [element 0] | -| array_flow.rb:1604:14:1604:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1604:14:1604:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1605:14:1605:14 | x [element 1] | semmle.label | x [element 1] | -| array_flow.rb:1605:14:1605:14 | x [element 1] | semmle.label | x [element 1] | -| array_flow.rb:1605:14:1605:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1605:14:1605:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1606:14:1606:14 | x [element 2] | semmle.label | x [element 2] | -| array_flow.rb:1606:14:1606:14 | x [element 2] | semmle.label | x [element 2] | -| array_flow.rb:1606:14:1606:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1606:14:1606:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1611:5:1611:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1611:5:1611:5 | a [element 2] | semmle.label | a [element 2] | -| array_flow.rb:1611:16:1611:28 | call to source | semmle.label | call to source | | array_flow.rb:1611:16:1611:28 | call to source | semmle.label | call to source | | array_flow.rb:1612:5:1612:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1612:5:1612:5 | b [element 1] | semmle.label | b [element 1] | -| array_flow.rb:1612:13:1612:25 | call to source | semmle.label | call to source | | array_flow.rb:1612:13:1612:25 | call to source | semmle.label | call to source | | array_flow.rb:1613:5:1613:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1613:5:1613:5 | c [element] | semmle.label | c [element] | -| array_flow.rb:1613:9:1613:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1613:9:1613:9 | a [element 2] | semmle.label | a [element 2] | | array_flow.rb:1613:9:1613:13 | ... \| ... [element] | semmle.label | ... \| ... [element] | -| array_flow.rb:1613:9:1613:13 | ... \| ... [element] | semmle.label | ... \| ... [element] | -| array_flow.rb:1613:13:1613:13 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1613:13:1613:13 | b [element 1] | semmle.label | b [element 1] | | array_flow.rb:1614:10:1614:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1614:10:1614:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1614:10:1614:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1614:10:1614:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1615:10:1615:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1615:10:1615:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1615:10:1615:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1615:10:1615:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1616:10:1616:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1616:10:1616:10 | c [element] | semmle.label | c [element] | -| array_flow.rb:1616:10:1616:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1616:10:1616:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | semmle.label | [post] a [element, element 0] | -| array_flow.rb:1621:5:1621:5 | [post] a [element, element 0] | semmle.label | [post] a [element, element 0] | -| array_flow.rb:1621:5:1621:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | | array_flow.rb:1621:5:1621:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | | array_flow.rb:1621:15:1621:27 | call to source | semmle.label | call to source | -| array_flow.rb:1621:15:1621:27 | call to source | semmle.label | call to source | -| array_flow.rb:1622:10:1622:10 | a [element, element 0] | semmle.label | a [element, element 0] | | array_flow.rb:1622:10:1622:10 | a [element, element 0] | semmle.label | a [element, element 0] | | array_flow.rb:1622:10:1622:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | -| array_flow.rb:1622:10:1622:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | -| array_flow.rb:1622:10:1622:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1622:10:1622:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1624:5:1624:5 | [post] a [element 1, element 0] | semmle.label | [post] a [element 1, element 0] | -| array_flow.rb:1624:5:1624:5 | [post] a [element 1, element 0] | semmle.label | [post] a [element 1, element 0] | -| array_flow.rb:1624:5:1624:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | | array_flow.rb:1624:5:1624:8 | [post] ...[...] [element 0] | semmle.label | [post] ...[...] [element 0] | | array_flow.rb:1624:15:1624:27 | call to source | semmle.label | call to source | -| array_flow.rb:1624:15:1624:27 | call to source | semmle.label | call to source | -| array_flow.rb:1625:10:1625:10 | a [element 1, element 0] | semmle.label | a [element 1, element 0] | | array_flow.rb:1625:10:1625:10 | a [element 1, element 0] | semmle.label | a [element 1, element 0] | | array_flow.rb:1625:10:1625:10 | a [element, element 0] | semmle.label | a [element, element 0] | -| array_flow.rb:1625:10:1625:10 | a [element, element 0] | semmle.label | a [element, element 0] | -| array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1625:10:1625:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | array_flow.rb:1625:10:1625:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1625:10:1625:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1626:10:1626:10 | a [element, element 0] | semmle.label | a [element, element 0] | | array_flow.rb:1626:10:1626:10 | a [element, element 0] | semmle.label | a [element, element 0] | | array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | -| array_flow.rb:1626:10:1626:13 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | -| array_flow.rb:1626:10:1626:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1626:10:1626:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1631:5:1631:5 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1631:5:1631:5 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| array_flow.rb:1631:12:1631:24 | call to source | semmle.label | call to source | | array_flow.rb:1631:12:1631:24 | call to source | semmle.label | call to source | | array_flow.rb:1633:5:1633:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1633:5:1633:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1633:16:1633:28 | call to source | semmle.label | call to source | | array_flow.rb:1633:16:1633:28 | call to source | semmle.label | call to source | | array_flow.rb:1635:5:1635:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1635:5:1635:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1635:14:1635:26 | call to source | semmle.label | call to source | | array_flow.rb:1635:14:1635:26 | call to source | semmle.label | call to source | | array_flow.rb:1637:5:1637:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1637:5:1637:5 | [post] a [element] | semmle.label | [post] a [element] | -| array_flow.rb:1637:16:1637:28 | call to source | semmle.label | call to source | | array_flow.rb:1637:16:1637:28 | call to source | semmle.label | call to source | | array_flow.rb:1638:10:1638:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1638:10:1638:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1638:10:1638:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1638:10:1638:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1640:10:1640:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1640:10:1640:10 | a [element 0] | semmle.label | a [element 0] | -| array_flow.rb:1640:10:1640:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1640:10:1640:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1640:10:1640:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1640:10:1640:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:1642:10:1642:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1642:10:1642:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1642:10:1642:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1642:10:1642:10 | a [element] | semmle.label | a [element] | -| array_flow.rb:1642:10:1642:15 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1642:10:1642:15 | ...[...] | semmle.label | ...[...] | subpaths #select diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql index dfd6242a414fb..e02827eaf8d09 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql @@ -5,7 +5,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import DefaultFlowTest -import PathGraph +import ValueFlow::PathGraph from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) diff --git a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected index 5c5b0705be9e6..4563c900177c3 100644 --- a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected +++ b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected @@ -1,335 +1,170 @@ testFailures edges | call_sensitivity.rb:9:7:9:13 | call to taint | call_sensitivity.rb:9:6:9:14 | ( ... ) | -| call_sensitivity.rb:9:7:9:13 | call to taint | call_sensitivity.rb:9:6:9:14 | ( ... ) | -| call_sensitivity.rb:11:13:11:13 | x | call_sensitivity.rb:12:11:12:11 | x | | call_sensitivity.rb:11:13:11:13 | x | call_sensitivity.rb:12:11:12:11 | x | | call_sensitivity.rb:12:11:12:11 | x | call_sensitivity.rb:19:22:19:22 | x | -| call_sensitivity.rb:12:11:12:11 | x | call_sensitivity.rb:19:22:19:22 | x | | call_sensitivity.rb:19:9:19:17 | ( ... ) | call_sensitivity.rb:11:13:11:13 | x | -| call_sensitivity.rb:19:9:19:17 | ( ... ) | call_sensitivity.rb:11:13:11:13 | x | -| call_sensitivity.rb:19:10:19:16 | call to taint | call_sensitivity.rb:19:9:19:17 | ( ... ) | | call_sensitivity.rb:19:10:19:16 | call to taint | call_sensitivity.rb:19:9:19:17 | ( ... ) | | call_sensitivity.rb:19:22:19:22 | x | call_sensitivity.rb:19:30:19:30 | x | -| call_sensitivity.rb:19:22:19:22 | x | call_sensitivity.rb:19:30:19:30 | x | -| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | -| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | -| call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | | call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | | call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | | call_sensitivity.rb:21:27:21:27 | x | call_sensitivity.rb:22:17:22:17 | x | | call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:31:17:31:17 | x | -| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:31:17:31:17 | x | -| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:40:23:40:23 | x | | call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:40:23:40:23 | x | | call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:43:24:43:24 | x | -| call_sensitivity.rb:22:17:22:17 | x | call_sensitivity.rb:43:24:43:24 | x | -| call_sensitivity.rb:31:17:31:17 | x | call_sensitivity.rb:31:27:31:27 | x | | call_sensitivity.rb:31:17:31:17 | x | call_sensitivity.rb:31:27:31:27 | x | | call_sensitivity.rb:32:25:32:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | -| call_sensitivity.rb:32:25:32:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | | call_sensitivity.rb:40:23:40:23 | x | call_sensitivity.rb:40:31:40:31 | x | -| call_sensitivity.rb:40:23:40:23 | x | call_sensitivity.rb:40:31:40:31 | x | -| call_sensitivity.rb:41:25:41:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | | call_sensitivity.rb:41:25:41:32 | call to taint | call_sensitivity.rb:21:27:21:27 | x | | call_sensitivity.rb:43:24:43:24 | x | call_sensitivity.rb:43:32:43:32 | x | -| call_sensitivity.rb:43:24:43:24 | x | call_sensitivity.rb:43:32:43:32 | x | -| call_sensitivity.rb:44:26:44:33 | call to taint | call_sensitivity.rb:21:27:21:27 | x | | call_sensitivity.rb:44:26:44:33 | call to taint | call_sensitivity.rb:21:27:21:27 | x | | call_sensitivity.rb:50:15:50:15 | x | call_sensitivity.rb:51:10:51:10 | x | -| call_sensitivity.rb:50:15:50:15 | x | call_sensitivity.rb:51:10:51:10 | x | -| call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | -| call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | | call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | | call_sensitivity.rb:54:15:54:15 | x | call_sensitivity.rb:55:13:55:13 | x | | call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | | call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:55:13:55:13 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:58:20:58:20 | x | call_sensitivity.rb:59:18:59:18 | x | | call_sensitivity.rb:58:20:58:20 | x | call_sensitivity.rb:59:18:59:18 | x | | call_sensitivity.rb:59:18:59:18 | x | call_sensitivity.rb:54:15:54:15 | x | -| call_sensitivity.rb:59:18:59:18 | x | call_sensitivity.rb:54:15:54:15 | x | -| call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | -| call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | | call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | | call_sensitivity.rb:62:18:62:18 | y | call_sensitivity.rb:63:15:63:15 | y | | call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | | call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:63:15:63:15 | y | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:66:20:66:20 | x | call_sensitivity.rb:67:24:67:24 | x | | call_sensitivity.rb:66:20:66:20 | x | call_sensitivity.rb:67:24:67:24 | x | | call_sensitivity.rb:67:24:67:24 | x | call_sensitivity.rb:62:18:62:18 | y | -| call_sensitivity.rb:67:24:67:24 | x | call_sensitivity.rb:62:18:62:18 | y | -| call_sensitivity.rb:70:30:70:30 | x | call_sensitivity.rb:71:10:71:10 | x | | call_sensitivity.rb:70:30:70:30 | x | call_sensitivity.rb:71:10:71:10 | x | | call_sensitivity.rb:74:18:74:18 | y | call_sensitivity.rb:76:17:76:17 | y | -| call_sensitivity.rb:74:18:74:18 | y | call_sensitivity.rb:76:17:76:17 | y | -| call_sensitivity.rb:76:17:76:17 | y | call_sensitivity.rb:50:15:50:15 | x | | call_sensitivity.rb:76:17:76:17 | y | call_sensitivity.rb:50:15:50:15 | x | | call_sensitivity.rb:80:15:80:15 | x | call_sensitivity.rb:81:18:81:18 | x | -| call_sensitivity.rb:80:15:80:15 | x | call_sensitivity.rb:81:18:81:18 | x | | call_sensitivity.rb:81:18:81:18 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:81:18:81:18 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:85:18:85:27 | ( ... ) | call_sensitivity.rb:80:15:80:15 | x | | call_sensitivity.rb:85:18:85:27 | ( ... ) | call_sensitivity.rb:80:15:80:15 | x | | call_sensitivity.rb:85:19:85:26 | call to taint | call_sensitivity.rb:85:18:85:27 | ( ... ) | -| call_sensitivity.rb:85:19:85:26 | call to taint | call_sensitivity.rb:85:18:85:27 | ( ... ) | -| call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | -| call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | | call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | | call_sensitivity.rb:88:30:88:30 | x | call_sensitivity.rb:89:23:89:23 | x | | call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | | call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | -| call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | -| call_sensitivity.rb:89:23:89:23 | x | call_sensitivity.rb:70:30:70:30 | x | | call_sensitivity.rb:92:35:92:35 | x | call_sensitivity.rb:93:28:93:28 | x | -| call_sensitivity.rb:92:35:92:35 | x | call_sensitivity.rb:93:28:93:28 | x | -| call_sensitivity.rb:93:28:93:28 | x | call_sensitivity.rb:88:30:88:30 | x | | call_sensitivity.rb:93:28:93:28 | x | call_sensitivity.rb:88:30:88:30 | x | | call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | | call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | -| call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | -| call_sensitivity.rb:96:33:96:33 | y | call_sensitivity.rb:97:25:97:25 | y | -| call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | -| call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | | call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | | call_sensitivity.rb:97:25:97:25 | y | call_sensitivity.rb:70:30:70:30 | x | | call_sensitivity.rb:100:35:100:35 | x | call_sensitivity.rb:101:34:101:34 | x | -| call_sensitivity.rb:100:35:100:35 | x | call_sensitivity.rb:101:34:101:34 | x | -| call_sensitivity.rb:101:34:101:34 | x | call_sensitivity.rb:96:33:96:33 | y | | call_sensitivity.rb:101:34:101:34 | x | call_sensitivity.rb:96:33:96:33 | y | | call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | | call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | | call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | | call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:105:10:105:10 | x | -| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | -| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | | call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | | call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | | call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | -| call_sensitivity.rb:104:18:104:18 | x | call_sensitivity.rb:106:13:106:13 | x | -| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | | call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | | call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | | call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:106:13:106:13 | x | call_sensitivity.rb:50:15:50:15 | x | -| call_sensitivity.rb:109:21:109:21 | x | call_sensitivity.rb:110:9:110:9 | x | | call_sensitivity.rb:109:21:109:21 | x | call_sensitivity.rb:110:9:110:9 | x | | call_sensitivity.rb:110:9:110:9 | x | call_sensitivity.rb:104:18:104:18 | x | -| call_sensitivity.rb:110:9:110:9 | x | call_sensitivity.rb:104:18:104:18 | x | -| call_sensitivity.rb:114:11:114:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | | call_sensitivity.rb:114:11:114:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | | call_sensitivity.rb:114:12:114:19 | call to taint | call_sensitivity.rb:114:11:114:20 | ( ... ) | -| call_sensitivity.rb:114:12:114:19 | call to taint | call_sensitivity.rb:114:11:114:20 | ( ... ) | -| call_sensitivity.rb:115:11:115:18 | call to taint | call_sensitivity.rb:54:15:54:15 | x | | call_sensitivity.rb:115:11:115:18 | call to taint | call_sensitivity.rb:54:15:54:15 | x | | call_sensitivity.rb:116:16:116:23 | call to taint | call_sensitivity.rb:58:20:58:20 | x | -| call_sensitivity.rb:116:16:116:23 | call to taint | call_sensitivity.rb:58:20:58:20 | x | | call_sensitivity.rb:117:14:117:22 | call to taint | call_sensitivity.rb:62:18:62:18 | y | -| call_sensitivity.rb:117:14:117:22 | call to taint | call_sensitivity.rb:62:18:62:18 | y | -| call_sensitivity.rb:118:16:118:24 | call to taint | call_sensitivity.rb:66:20:66:20 | x | | call_sensitivity.rb:118:16:118:24 | call to taint | call_sensitivity.rb:66:20:66:20 | x | | call_sensitivity.rb:119:14:119:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | -| call_sensitivity.rb:119:14:119:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | -| call_sensitivity.rb:121:21:121:28 | call to taint | call_sensitivity.rb:88:30:88:30 | x | | call_sensitivity.rb:121:21:121:28 | call to taint | call_sensitivity.rb:88:30:88:30 | x | | call_sensitivity.rb:122:26:122:33 | call to taint | call_sensitivity.rb:92:35:92:35 | x | -| call_sensitivity.rb:122:26:122:33 | call to taint | call_sensitivity.rb:92:35:92:35 | x | | call_sensitivity.rb:123:24:123:32 | call to taint | call_sensitivity.rb:96:33:96:33 | y | -| call_sensitivity.rb:123:24:123:32 | call to taint | call_sensitivity.rb:96:33:96:33 | y | -| call_sensitivity.rb:124:26:124:33 | call to taint | call_sensitivity.rb:100:35:100:35 | x | | call_sensitivity.rb:124:26:124:33 | call to taint | call_sensitivity.rb:100:35:100:35 | x | | call_sensitivity.rb:125:12:125:19 | call to taint | call_sensitivity.rb:109:21:109:21 | x | -| call_sensitivity.rb:125:12:125:19 | call to taint | call_sensitivity.rb:109:21:109:21 | x | -| call_sensitivity.rb:166:14:166:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | | call_sensitivity.rb:166:14:166:22 | call to taint | call_sensitivity.rb:74:18:74:18 | y | | call_sensitivity.rb:174:19:174:19 | x | call_sensitivity.rb:175:12:175:12 | x | -| call_sensitivity.rb:174:19:174:19 | x | call_sensitivity.rb:175:12:175:12 | x | | call_sensitivity.rb:175:12:175:12 | x | call_sensitivity.rb:104:18:104:18 | x | -| call_sensitivity.rb:175:12:175:12 | x | call_sensitivity.rb:104:18:104:18 | x | -| call_sensitivity.rb:178:11:178:19 | call to taint | call_sensitivity.rb:174:19:174:19 | x | | call_sensitivity.rb:178:11:178:19 | call to taint | call_sensitivity.rb:174:19:174:19 | x | | call_sensitivity.rb:187:11:187:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | -| call_sensitivity.rb:187:11:187:20 | ( ... ) | call_sensitivity.rb:104:18:104:18 | x | -| call_sensitivity.rb:187:12:187:19 | call to taint | call_sensitivity.rb:187:11:187:20 | ( ... ) | | call_sensitivity.rb:187:12:187:19 | call to taint | call_sensitivity.rb:187:11:187:20 | ( ... ) | nodes | call_sensitivity.rb:9:6:9:14 | ( ... ) | semmle.label | ( ... ) | -| call_sensitivity.rb:9:6:9:14 | ( ... ) | semmle.label | ( ... ) | | call_sensitivity.rb:9:7:9:13 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:9:7:9:13 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:11:13:11:13 | x | semmle.label | x | | call_sensitivity.rb:11:13:11:13 | x | semmle.label | x | | call_sensitivity.rb:12:11:12:11 | x | semmle.label | x | -| call_sensitivity.rb:12:11:12:11 | x | semmle.label | x | -| call_sensitivity.rb:19:9:19:17 | ( ... ) | semmle.label | ( ... ) | | call_sensitivity.rb:19:9:19:17 | ( ... ) | semmle.label | ( ... ) | | call_sensitivity.rb:19:10:19:16 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:19:10:19:16 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:19:22:19:22 | x | semmle.label | x | -| call_sensitivity.rb:19:22:19:22 | x | semmle.label | x | -| call_sensitivity.rb:19:30:19:30 | x | semmle.label | x | | call_sensitivity.rb:19:30:19:30 | x | semmle.label | x | | call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | | call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | | call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | -| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | -| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | -| call_sensitivity.rb:21:27:21:27 | x | semmle.label | x | -| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | -| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | -| call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | | call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | | call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | | call_sensitivity.rb:22:17:22:17 | x | semmle.label | x | | call_sensitivity.rb:31:17:31:17 | x | semmle.label | x | -| call_sensitivity.rb:31:17:31:17 | x | semmle.label | x | -| call_sensitivity.rb:31:27:31:27 | x | semmle.label | x | | call_sensitivity.rb:31:27:31:27 | x | semmle.label | x | | call_sensitivity.rb:32:25:32:32 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:32:25:32:32 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:40:23:40:23 | x | semmle.label | x | -| call_sensitivity.rb:40:23:40:23 | x | semmle.label | x | -| call_sensitivity.rb:40:31:40:31 | x | semmle.label | x | | call_sensitivity.rb:40:31:40:31 | x | semmle.label | x | | call_sensitivity.rb:41:25:41:32 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:41:25:41:32 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:43:24:43:24 | x | semmle.label | x | | call_sensitivity.rb:43:24:43:24 | x | semmle.label | x | | call_sensitivity.rb:43:32:43:32 | x | semmle.label | x | -| call_sensitivity.rb:43:32:43:32 | x | semmle.label | x | | call_sensitivity.rb:44:26:44:33 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:44:26:44:33 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:50:15:50:15 | x | semmle.label | x | | call_sensitivity.rb:50:15:50:15 | x | semmle.label | x | | call_sensitivity.rb:51:10:51:10 | x | semmle.label | x | -| call_sensitivity.rb:51:10:51:10 | x | semmle.label | x | -| call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | -| call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | | call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | | call_sensitivity.rb:54:15:54:15 | x | semmle.label | x | | call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | | call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | -| call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | -| call_sensitivity.rb:55:13:55:13 | x | semmle.label | x | | call_sensitivity.rb:58:20:58:20 | x | semmle.label | x | -| call_sensitivity.rb:58:20:58:20 | x | semmle.label | x | -| call_sensitivity.rb:59:18:59:18 | x | semmle.label | x | | call_sensitivity.rb:59:18:59:18 | x | semmle.label | x | | call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | | call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | -| call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | -| call_sensitivity.rb:62:18:62:18 | y | semmle.label | y | -| call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | | call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | | call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | -| call_sensitivity.rb:63:15:63:15 | y | semmle.label | y | -| call_sensitivity.rb:66:20:66:20 | x | semmle.label | x | | call_sensitivity.rb:66:20:66:20 | x | semmle.label | x | | call_sensitivity.rb:67:24:67:24 | x | semmle.label | x | -| call_sensitivity.rb:67:24:67:24 | x | semmle.label | x | | call_sensitivity.rb:70:30:70:30 | x | semmle.label | x | -| call_sensitivity.rb:70:30:70:30 | x | semmle.label | x | -| call_sensitivity.rb:71:10:71:10 | x | semmle.label | x | | call_sensitivity.rb:71:10:71:10 | x | semmle.label | x | | call_sensitivity.rb:74:18:74:18 | y | semmle.label | y | -| call_sensitivity.rb:74:18:74:18 | y | semmle.label | y | -| call_sensitivity.rb:76:17:76:17 | y | semmle.label | y | | call_sensitivity.rb:76:17:76:17 | y | semmle.label | y | | call_sensitivity.rb:80:15:80:15 | x | semmle.label | x | -| call_sensitivity.rb:80:15:80:15 | x | semmle.label | x | | call_sensitivity.rb:81:18:81:18 | x | semmle.label | x | -| call_sensitivity.rb:81:18:81:18 | x | semmle.label | x | -| call_sensitivity.rb:85:18:85:27 | ( ... ) | semmle.label | ( ... ) | | call_sensitivity.rb:85:18:85:27 | ( ... ) | semmle.label | ( ... ) | | call_sensitivity.rb:85:19:85:26 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:85:19:85:26 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | -| call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | | call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | | call_sensitivity.rb:88:30:88:30 | x | semmle.label | x | | call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | | call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | -| call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | -| call_sensitivity.rb:89:23:89:23 | x | semmle.label | x | -| call_sensitivity.rb:92:35:92:35 | x | semmle.label | x | | call_sensitivity.rb:92:35:92:35 | x | semmle.label | x | | call_sensitivity.rb:93:28:93:28 | x | semmle.label | x | -| call_sensitivity.rb:93:28:93:28 | x | semmle.label | x | -| call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | -| call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | | call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | | call_sensitivity.rb:96:33:96:33 | y | semmle.label | y | | call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | | call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | -| call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | -| call_sensitivity.rb:97:25:97:25 | y | semmle.label | y | | call_sensitivity.rb:100:35:100:35 | x | semmle.label | x | -| call_sensitivity.rb:100:35:100:35 | x | semmle.label | x | -| call_sensitivity.rb:101:34:101:34 | x | semmle.label | x | | call_sensitivity.rb:101:34:101:34 | x | semmle.label | x | | call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | | call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | | call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | | call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | -| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | -| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | -| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | -| call_sensitivity.rb:104:18:104:18 | x | semmle.label | x | -| call_sensitivity.rb:105:10:105:10 | x | semmle.label | x | | call_sensitivity.rb:105:10:105:10 | x | semmle.label | x | | call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | | call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | | call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | -| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | -| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | -| call_sensitivity.rb:106:13:106:13 | x | semmle.label | x | | call_sensitivity.rb:109:21:109:21 | x | semmle.label | x | -| call_sensitivity.rb:109:21:109:21 | x | semmle.label | x | -| call_sensitivity.rb:110:9:110:9 | x | semmle.label | x | | call_sensitivity.rb:110:9:110:9 | x | semmle.label | x | | call_sensitivity.rb:114:11:114:20 | ( ... ) | semmle.label | ( ... ) | -| call_sensitivity.rb:114:11:114:20 | ( ... ) | semmle.label | ( ... ) | | call_sensitivity.rb:114:12:114:19 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:114:12:114:19 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:115:11:115:18 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:115:11:115:18 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:116:16:116:23 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:116:16:116:23 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:117:14:117:22 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:117:14:117:22 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:118:16:118:24 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:118:16:118:24 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:119:14:119:22 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:119:14:119:22 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:121:21:121:28 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:121:21:121:28 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:122:26:122:33 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:122:26:122:33 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:123:24:123:32 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:123:24:123:32 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:124:26:124:33 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:124:26:124:33 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:125:12:125:19 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:125:12:125:19 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:166:14:166:22 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:166:14:166:22 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:174:19:174:19 | x | semmle.label | x | -| call_sensitivity.rb:174:19:174:19 | x | semmle.label | x | -| call_sensitivity.rb:175:12:175:12 | x | semmle.label | x | | call_sensitivity.rb:175:12:175:12 | x | semmle.label | x | | call_sensitivity.rb:178:11:178:19 | call to taint | semmle.label | call to taint | -| call_sensitivity.rb:178:11:178:19 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:187:11:187:20 | ( ... ) | semmle.label | ( ... ) | -| call_sensitivity.rb:187:11:187:20 | ( ... ) | semmle.label | ( ... ) | -| call_sensitivity.rb:187:12:187:19 | call to taint | semmle.label | call to taint | | call_sensitivity.rb:187:12:187:19 | call to taint | semmle.label | call to taint | subpaths #select diff --git a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.ql b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.ql index 08c0fa8fc454c..06dcd9bef7f43 100644 --- a/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.ql +++ b/ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.ql @@ -6,7 +6,7 @@ import codeql.ruby.AST import codeql.ruby.DataFlow import TestUtilities.InlineFlowTest import DefaultFlowTest -import PathGraph +import TaintFlow::PathGraph import codeql.ruby.dataflow.internal.DataFlowDispatch as DataFlowDispatch query predicate mayBenefitFromCallContext = DataFlowDispatch::mayBenefitFromCallContext/2; diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index 19bb4c65b7af0..85daf1fbf6101 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -1,527 +1,275 @@ testFailures edges | captured_variables.rb:1:24:1:24 | x | captured_variables.rb:2:20:2:20 | x | -| captured_variables.rb:1:24:1:24 | x | captured_variables.rb:2:20:2:20 | x | -| captured_variables.rb:5:20:5:30 | call to source | captured_variables.rb:1:24:1:24 | x | | captured_variables.rb:5:20:5:30 | call to source | captured_variables.rb:1:24:1:24 | x | | captured_variables.rb:21:33:21:33 | x | captured_variables.rb:23:14:23:14 | x | -| captured_variables.rb:21:33:21:33 | x | captured_variables.rb:23:14:23:14 | x | -| captured_variables.rb:27:29:27:39 | call to source | captured_variables.rb:21:33:21:33 | x | | captured_variables.rb:27:29:27:39 | call to source | captured_variables.rb:21:33:21:33 | x | | captured_variables.rb:32:31:32:31 | x | captured_variables.rb:34:14:34:14 | x | -| captured_variables.rb:32:31:32:31 | x | captured_variables.rb:34:14:34:14 | x | -| captured_variables.rb:38:27:38:37 | call to source | captured_variables.rb:32:31:32:31 | x | | captured_variables.rb:38:27:38:37 | call to source | captured_variables.rb:32:31:32:31 | x | | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:18:11:18 | x | -| instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:18:11:18 | x | -| instance_variables.rb:11:18:11:18 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | | instance_variables.rb:11:18:11:18 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:16:14:21 | self [@field] | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:16:14:21 | self [@field] | -| instance_variables.rb:14:16:14:21 | @field | instance_variables.rb:14:9:14:21 | return | | instance_variables.rb:14:16:14:21 | @field | instance_variables.rb:14:9:14:21 | return | | instance_variables.rb:14:16:14:21 | self [@field] | instance_variables.rb:14:16:14:21 | @field | -| instance_variables.rb:14:16:14:21 | self [@field] | instance_variables.rb:14:16:14:21 | @field | | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | | instance_variables.rb:17:9:17:14 | [post] self [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | | instance_variables.rb:19:5:19:8 | [post] self [@foo] | instance_variables.rb:20:10:20:13 | self [@foo] | -| instance_variables.rb:19:5:19:8 | [post] self [@foo] | instance_variables.rb:20:10:20:13 | self [@foo] | | instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:19:5:19:8 | [post] self [@foo] | -| instance_variables.rb:19:12:19:21 | call to taint | instance_variables.rb:19:5:19:8 | [post] self [@foo] | -| instance_variables.rb:20:10:20:13 | self [@foo] | instance_variables.rb:20:10:20:13 | @foo | | instance_variables.rb:20:10:20:13 | self [@foo] | instance_variables.rb:20:10:20:13 | @foo | | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:18:23:22 | field | -| instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:18:23:22 | field | -| instance_variables.rb:23:18:23:22 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | | instance_variables.rb:23:18:23:22 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | | instance_variables.rb:24:9:24:17 | call to taint | instance_variables.rb:28:9:28:25 | call to initialize | -| instance_variables.rb:24:9:24:17 | call to taint | instance_variables.rb:28:9:28:25 | call to initialize | -| instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:20:28:24 | field | | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:20:28:24 | field | | instance_variables.rb:28:9:28:25 | call to initialize | instance_variables.rb:119:6:119:37 | call to call_initialize | -| instance_variables.rb:28:9:28:25 | call to initialize | instance_variables.rb:119:6:119:37 | call to call_initialize | -| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | | instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | | instance_variables.rb:28:20:28:24 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | -| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | -| instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:13:33:13 | x | | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:13:33:13 | x | | instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:22:20:22:24 | field | -| instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:22:20:22:24 | field | -| instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:48:20:48:20 | x | | instance_variables.rb:32:13:32:21 | call to taint | instance_variables.rb:48:20:48:20 | x | | instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | -| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | -| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | | instance_variables.rb:33:13:33:13 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | | instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:36:10:36:33 | call to get_field | | instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:36:10:36:33 | call to get_field | | instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | -| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | -| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:23 | call to new [@field] | | instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:36:10:36:23 | call to new [@field] | | instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:39:6:39:33 | call to get_field | | instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:39:6:39:33 | call to get_field | | instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | -| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | -| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:23 | call to bar [@field] | | instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:39:6:39:23 | call to bar [@field] | | instance_variables.rb:43:9:43:17 | call to taint | instance_variables.rb:121:7:121:24 | call to new | -| instance_variables.rb:43:9:43:17 | call to taint | instance_variables.rb:121:7:121:24 | call to new | -| instance_variables.rb:48:20:48:20 | x | instance_variables.rb:49:14:49:14 | x | | instance_variables.rb:48:20:48:20 | x | instance_variables.rb:49:14:49:14 | x | | instance_variables.rb:54:1:54:3 | [post] foo [@field] | instance_variables.rb:55:6:55:8 | foo [@field] | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] | instance_variables.rb:55:6:55:8 | foo [@field] | -| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | | instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | | instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:54:1:54:3 | [post] foo [@field] | -| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:54:1:54:3 | [post] foo [@field] | -| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:55:6:55:18 | call to get_field | | instance_variables.rb:58:1:58:3 | [post] bar [@field] | instance_variables.rb:59:6:59:8 | bar [@field] | | instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:10:19:10:19 | x | | instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:58:1:58:3 | [post] bar [@field] | | instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | | instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | instance_variables.rb:63:6:63:9 | foo1 [@field] | -| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | instance_variables.rb:63:6:63:9 | foo1 [@field] | | instance_variables.rb:62:14:62:22 | call to taint | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | -| instance_variables.rb:62:14:62:22 | call to taint | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | -| instance_variables.rb:63:6:63:9 | foo1 [@field] | instance_variables.rb:63:6:63:15 | call to field | | instance_variables.rb:63:6:63:9 | foo1 [@field] | instance_variables.rb:63:6:63:15 | call to field | | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | instance_variables.rb:67:6:67:9 | foo2 [@field] | -| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | instance_variables.rb:67:6:67:9 | foo2 [@field] | -| instance_variables.rb:66:14:66:22 | call to taint | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | | instance_variables.rb:66:14:66:22 | call to taint | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | | instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:67:6:67:19 | call to get_field | | instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:67:6:67:19 | call to get_field | | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:71:6:71:9 | foo3 [@field] | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:71:6:71:9 | foo3 [@field] | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:83:6:83:9 | foo3 [@field] | | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | instance_variables.rb:83:6:83:9 | foo3 [@field] | | instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | | instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | | instance_variables.rb:71:6:71:9 | foo3 [@field] | instance_variables.rb:71:6:71:15 | call to field | -| instance_variables.rb:71:6:71:9 | foo3 [@field] | instance_variables.rb:71:6:71:15 | call to field | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:79:6:79:9 | foo5 [@field] | | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:79:6:79:9 | foo5 [@field] | | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:84:6:84:9 | foo5 [@field] | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | instance_variables.rb:84:6:84:9 | foo5 [@field] | -| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | | instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | | instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | -| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | instance_variables.rb:85:6:85:9 | foo6 [@field] | | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | instance_variables.rb:85:6:85:9 | foo6 [@field] | | instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | | instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | | instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:84:6:84:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | instance_variables.rb:90:6:90:9 | foo7 [@field] | | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | instance_variables.rb:90:6:90:9 | foo7 [@field] | | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | instance_variables.rb:91:6:91:9 | foo8 [@field] | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | instance_variables.rb:91:6:91:9 | foo8 [@field] | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | | instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:90:6:90:19 | call to get_field | | instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:90:6:90:19 | call to get_field | | instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:91:6:91:19 | call to get_field | | instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:91:6:91:19 | call to get_field | | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | instance_variables.rb:96:6:96:9 | foo9 [@field] | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | instance_variables.rb:96:6:96:9 | foo9 [@field] | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | instance_variables.rb:97:6:97:10 | foo10 [@field] | | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | instance_variables.rb:97:6:97:10 | foo10 [@field] | | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:96:6:96:19 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | | instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | | instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | -| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | -| instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | | instance_variables.rb:100:5:100:5 | [post] x [@field] | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | | instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | -| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:100:5:100:5 | [post] x [@field] | | instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:100:5:100:5 | [post] x [@field] | | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | instance_variables.rb:105:6:105:10 | foo11 [@field] | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | instance_variables.rb:105:6:105:10 | foo11 [@field] | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | instance_variables.rb:109:6:109:10 | foo12 [@field] | | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | instance_variables.rb:109:6:109:10 | foo12 [@field] | | instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:109:6:109:20 | call to get_field | | instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:109:6:109:20 | call to get_field | | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | instance_variables.rb:114:6:114:10 | foo13 [@field] | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | instance_variables.rb:114:6:114:10 | foo13 [@field] | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:116:1:116:5 | foo15 [@field] | instance_variables.rb:117:6:117:10 | foo15 [@field] | | instance_variables.rb:116:1:116:5 | foo15 [@field] | instance_variables.rb:117:6:117:10 | foo15 [@field] | | instance_variables.rb:116:9:116:26 | call to new [@field] | instance_variables.rb:116:1:116:5 | foo15 [@field] | -| instance_variables.rb:116:9:116:26 | call to new [@field] | instance_variables.rb:116:1:116:5 | foo15 [@field] | -| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | | instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | | instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:116:9:116:26 | call to new [@field] | -| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:116:9:116:26 | call to new [@field] | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | | instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | instance_variables.rb:120:6:120:10 | foo16 [@field] | | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | instance_variables.rb:120:6:120:10 | foo16 [@field] | | instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | -| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | -| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | | instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | | instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:120:6:120:20 | call to get_field | | instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:120:6:120:20 | call to get_field | | instance_variables.rb:121:1:121:3 | bar | instance_variables.rb:122:6:122:8 | bar | -| instance_variables.rb:121:1:121:3 | bar | instance_variables.rb:122:6:122:8 | bar | -| instance_variables.rb:121:7:121:24 | call to new | instance_variables.rb:121:1:121:3 | bar | | instance_variables.rb:121:7:121:24 | call to new | instance_variables.rb:121:1:121:3 | bar | nodes | captured_variables.rb:1:24:1:24 | x | semmle.label | x | -| captured_variables.rb:1:24:1:24 | x | semmle.label | x | -| captured_variables.rb:2:20:2:20 | x | semmle.label | x | | captured_variables.rb:2:20:2:20 | x | semmle.label | x | | captured_variables.rb:5:20:5:30 | call to source | semmle.label | call to source | -| captured_variables.rb:5:20:5:30 | call to source | semmle.label | call to source | -| captured_variables.rb:21:33:21:33 | x | semmle.label | x | | captured_variables.rb:21:33:21:33 | x | semmle.label | x | | captured_variables.rb:23:14:23:14 | x | semmle.label | x | -| captured_variables.rb:23:14:23:14 | x | semmle.label | x | -| captured_variables.rb:27:29:27:39 | call to source | semmle.label | call to source | | captured_variables.rb:27:29:27:39 | call to source | semmle.label | call to source | | captured_variables.rb:32:31:32:31 | x | semmle.label | x | -| captured_variables.rb:32:31:32:31 | x | semmle.label | x | -| captured_variables.rb:34:14:34:14 | x | semmle.label | x | | captured_variables.rb:34:14:34:14 | x | semmle.label | x | | captured_variables.rb:38:27:38:37 | call to source | semmle.label | call to source | -| captured_variables.rb:38:27:38:37 | call to source | semmle.label | call to source | -| instance_variables.rb:10:19:10:19 | x | semmle.label | x | | instance_variables.rb:10:19:10:19 | x | semmle.label | x | | instance_variables.rb:11:9:11:14 | [post] self [@field] | semmle.label | [post] self [@field] | -| instance_variables.rb:11:9:11:14 | [post] self [@field] | semmle.label | [post] self [@field] | -| instance_variables.rb:11:18:11:18 | x | semmle.label | x | | instance_variables.rb:11:18:11:18 | x | semmle.label | x | | instance_variables.rb:13:5:15:7 | self in get_field [@field] | semmle.label | self in get_field [@field] | -| instance_variables.rb:13:5:15:7 | self in get_field [@field] | semmle.label | self in get_field [@field] | | instance_variables.rb:14:9:14:21 | return | semmle.label | return | -| instance_variables.rb:14:9:14:21 | return | semmle.label | return | -| instance_variables.rb:14:16:14:21 | @field | semmle.label | @field | | instance_variables.rb:14:16:14:21 | @field | semmle.label | @field | | instance_variables.rb:14:16:14:21 | self [@field] | semmle.label | self [@field] | -| instance_variables.rb:14:16:14:21 | self [@field] | semmle.label | self [@field] | | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | semmle.label | self in inc_field [@field] | | instance_variables.rb:17:9:17:14 | [post] self [@field] | semmle.label | [post] self [@field] | | instance_variables.rb:19:5:19:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | -| instance_variables.rb:19:5:19:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | instance_variables.rb:19:12:19:21 | call to taint | semmle.label | call to taint | -| instance_variables.rb:19:12:19:21 | call to taint | semmle.label | call to taint | -| instance_variables.rb:20:10:20:13 | @foo | semmle.label | @foo | | instance_variables.rb:20:10:20:13 | @foo | semmle.label | @foo | | instance_variables.rb:20:10:20:13 | self [@foo] | semmle.label | self [@foo] | -| instance_variables.rb:20:10:20:13 | self [@foo] | semmle.label | self [@foo] | -| instance_variables.rb:22:20:22:24 | field | semmle.label | field | | instance_variables.rb:22:20:22:24 | field | semmle.label | field | | instance_variables.rb:23:9:23:14 | [post] self [@field] | semmle.label | [post] self [@field] | -| instance_variables.rb:23:9:23:14 | [post] self [@field] | semmle.label | [post] self [@field] | -| instance_variables.rb:23:18:23:22 | field | semmle.label | field | | instance_variables.rb:23:18:23:22 | field | semmle.label | field | | instance_variables.rb:24:9:24:17 | call to taint | semmle.label | call to taint | -| instance_variables.rb:24:9:24:17 | call to taint | semmle.label | call to taint | -| instance_variables.rb:27:25:27:29 | field | semmle.label | field | | instance_variables.rb:27:25:27:29 | field | semmle.label | field | | instance_variables.rb:28:9:28:25 | [post] self [@field] | semmle.label | [post] self [@field] | -| instance_variables.rb:28:9:28:25 | [post] self [@field] | semmle.label | [post] self [@field] | -| instance_variables.rb:28:9:28:25 | call to initialize | semmle.label | call to initialize | | instance_variables.rb:28:9:28:25 | call to initialize | semmle.label | call to initialize | | instance_variables.rb:28:20:28:24 | field | semmle.label | field | -| instance_variables.rb:28:20:28:24 | field | semmle.label | field | -| instance_variables.rb:31:18:31:18 | x | semmle.label | x | | instance_variables.rb:31:18:31:18 | x | semmle.label | x | | instance_variables.rb:32:13:32:21 | call to taint | semmle.label | call to taint | -| instance_variables.rb:32:13:32:21 | call to taint | semmle.label | call to taint | -| instance_variables.rb:33:9:33:14 | call to new [@field] | semmle.label | call to new [@field] | | instance_variables.rb:33:9:33:14 | call to new [@field] | semmle.label | call to new [@field] | | instance_variables.rb:33:13:33:13 | x | semmle.label | x | -| instance_variables.rb:33:13:33:13 | x | semmle.label | x | -| instance_variables.rb:36:10:36:23 | call to new [@field] | semmle.label | call to new [@field] | | instance_variables.rb:36:10:36:23 | call to new [@field] | semmle.label | call to new [@field] | | instance_variables.rb:36:10:36:33 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:36:10:36:33 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:36:14:36:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:36:14:36:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:39:6:39:23 | call to bar [@field] | semmle.label | call to bar [@field] | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | semmle.label | call to bar [@field] | -| instance_variables.rb:39:6:39:33 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:39:6:39:33 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:39:14:39:22 | call to taint | semmle.label | call to taint | -| instance_variables.rb:39:14:39:22 | call to taint | semmle.label | call to taint | -| instance_variables.rb:43:9:43:17 | call to taint | semmle.label | call to taint | | instance_variables.rb:43:9:43:17 | call to taint | semmle.label | call to taint | | instance_variables.rb:48:20:48:20 | x | semmle.label | x | -| instance_variables.rb:48:20:48:20 | x | semmle.label | x | -| instance_variables.rb:49:14:49:14 | x | semmle.label | x | | instance_variables.rb:49:14:49:14 | x | semmle.label | x | | instance_variables.rb:54:1:54:3 | [post] foo [@field] | semmle.label | [post] foo [@field] | -| instance_variables.rb:54:1:54:3 | [post] foo [@field] | semmle.label | [post] foo [@field] | -| instance_variables.rb:54:15:54:23 | call to taint | semmle.label | call to taint | | instance_variables.rb:54:15:54:23 | call to taint | semmle.label | call to taint | | instance_variables.rb:55:6:55:8 | foo [@field] | semmle.label | foo [@field] | -| instance_variables.rb:55:6:55:8 | foo [@field] | semmle.label | foo [@field] | -| instance_variables.rb:55:6:55:18 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:55:6:55:18 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:58:1:58:3 | [post] bar [@field] | semmle.label | [post] bar [@field] | | instance_variables.rb:58:15:58:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:59:6:59:8 | bar [@field] | semmle.label | bar [@field] | | instance_variables.rb:59:6:59:18 | call to inc_field | semmle.label | call to inc_field | | instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | semmle.label | [post] foo1 [@field] | -| instance_variables.rb:62:1:62:4 | [post] foo1 [@field] | semmle.label | [post] foo1 [@field] | -| instance_variables.rb:62:14:62:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:62:14:62:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:63:6:63:9 | foo1 [@field] | semmle.label | foo1 [@field] | -| instance_variables.rb:63:6:63:9 | foo1 [@field] | semmle.label | foo1 [@field] | -| instance_variables.rb:63:6:63:15 | call to field | semmle.label | call to field | | instance_variables.rb:63:6:63:15 | call to field | semmle.label | call to field | | instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | semmle.label | [post] foo2 [@field] | -| instance_variables.rb:66:1:66:4 | [post] foo2 [@field] | semmle.label | [post] foo2 [@field] | -| instance_variables.rb:66:14:66:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:66:14:66:22 | call to taint | semmle.label | call to taint | | instance_variables.rb:67:6:67:9 | foo2 [@field] | semmle.label | foo2 [@field] | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | semmle.label | foo2 [@field] | -| instance_variables.rb:67:6:67:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:67:6:67:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | semmle.label | [post] foo3 [@field] | -| instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | semmle.label | [post] foo3 [@field] | -| instance_variables.rb:70:16:70:24 | call to taint | semmle.label | call to taint | | instance_variables.rb:70:16:70:24 | call to taint | semmle.label | call to taint | | instance_variables.rb:71:6:71:9 | foo3 [@field] | semmle.label | foo3 [@field] | -| instance_variables.rb:71:6:71:9 | foo3 [@field] | semmle.label | foo3 [@field] | -| instance_variables.rb:71:6:71:15 | call to field | semmle.label | call to field | | instance_variables.rb:71:6:71:15 | call to field | semmle.label | call to field | | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | semmle.label | [post] foo5 [@field] | -| instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | semmle.label | [post] foo5 [@field] | -| instance_variables.rb:78:18:78:26 | call to taint | semmle.label | call to taint | | instance_variables.rb:78:18:78:26 | call to taint | semmle.label | call to taint | | instance_variables.rb:79:6:79:9 | foo5 [@field] | semmle.label | foo5 [@field] | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | semmle.label | foo5 [@field] | -| instance_variables.rb:79:6:79:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:79:6:79:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | semmle.label | [post] foo6 [@field] | -| instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | semmle.label | [post] foo6 [@field] | -| instance_variables.rb:82:32:82:40 | call to taint | semmle.label | call to taint | | instance_variables.rb:82:32:82:40 | call to taint | semmle.label | call to taint | | instance_variables.rb:83:6:83:9 | foo3 [@field] | semmle.label | foo3 [@field] | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | semmle.label | foo3 [@field] | -| instance_variables.rb:83:6:83:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:83:6:83:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:84:6:84:9 | foo5 [@field] | semmle.label | foo5 [@field] | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | semmle.label | foo5 [@field] | -| instance_variables.rb:84:6:84:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:84:6:84:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:85:6:85:9 | foo6 [@field] | semmle.label | foo6 [@field] | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | semmle.label | foo6 [@field] | -| instance_variables.rb:85:6:85:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:85:6:85:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | semmle.label | [post] foo7 [@field] | -| instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | semmle.label | [post] foo7 [@field] | -| instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | semmle.label | [post] foo8 [@field] | | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | semmle.label | [post] foo8 [@field] | | instance_variables.rb:89:45:89:53 | call to taint | semmle.label | call to taint | -| instance_variables.rb:89:45:89:53 | call to taint | semmle.label | call to taint | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | semmle.label | foo7 [@field] | | instance_variables.rb:90:6:90:9 | foo7 [@field] | semmle.label | foo7 [@field] | | instance_variables.rb:90:6:90:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:90:6:90:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | semmle.label | foo8 [@field] | | instance_variables.rb:91:6:91:9 | foo8 [@field] | semmle.label | foo8 [@field] | | instance_variables.rb:91:6:91:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:91:6:91:19 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | semmle.label | [post] foo9 [@field] | -| instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | semmle.label | [post] foo9 [@field] | -| instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | semmle.label | [post] foo10 [@field] | | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | semmle.label | [post] foo10 [@field] | | instance_variables.rb:95:53:95:61 | call to taint | semmle.label | call to taint | -| instance_variables.rb:95:53:95:61 | call to taint | semmle.label | call to taint | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | semmle.label | foo9 [@field] | | instance_variables.rb:96:6:96:9 | foo9 [@field] | semmle.label | foo9 [@field] | | instance_variables.rb:96:6:96:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:96:6:96:19 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | semmle.label | foo10 [@field] | | instance_variables.rb:97:6:97:10 | foo10 [@field] | semmle.label | foo10 [@field] | | instance_variables.rb:97:6:97:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:97:6:97:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:100:5:100:5 | [post] x [@field] | semmle.label | [post] x [@field] | | instance_variables.rb:100:5:100:5 | [post] x [@field] | semmle.label | [post] x [@field] | | instance_variables.rb:100:17:100:25 | call to taint | semmle.label | call to taint | -| instance_variables.rb:100:17:100:25 | call to taint | semmle.label | call to taint | -| instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | semmle.label | [post] foo11 [@field] | | instance_variables.rb:104:14:104:18 | [post] foo11 [@field] | semmle.label | [post] foo11 [@field] | | instance_variables.rb:105:6:105:10 | foo11 [@field] | semmle.label | foo11 [@field] | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | semmle.label | foo11 [@field] | -| instance_variables.rb:105:6:105:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:105:6:105:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | semmle.label | [post] foo12 [@field] | -| instance_variables.rb:108:15:108:19 | [post] foo12 [@field] | semmle.label | [post] foo12 [@field] | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | semmle.label | foo12 [@field] | | instance_variables.rb:109:6:109:10 | foo12 [@field] | semmle.label | foo12 [@field] | | instance_variables.rb:109:6:109:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:109:6:109:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | semmle.label | [post] foo13 [@field] | | instance_variables.rb:113:22:113:26 | [post] foo13 [@field] | semmle.label | [post] foo13 [@field] | | instance_variables.rb:114:6:114:10 | foo13 [@field] | semmle.label | foo13 [@field] | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | semmle.label | foo13 [@field] | -| instance_variables.rb:114:6:114:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:114:6:114:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:116:1:116:5 | foo15 [@field] | semmle.label | foo15 [@field] | -| instance_variables.rb:116:1:116:5 | foo15 [@field] | semmle.label | foo15 [@field] | -| instance_variables.rb:116:9:116:26 | call to new [@field] | semmle.label | call to new [@field] | | instance_variables.rb:116:9:116:26 | call to new [@field] | semmle.label | call to new [@field] | | instance_variables.rb:116:17:116:25 | call to taint | semmle.label | call to taint | -| instance_variables.rb:116:17:116:25 | call to taint | semmle.label | call to taint | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | semmle.label | foo15 [@field] | | instance_variables.rb:117:6:117:10 | foo15 [@field] | semmle.label | foo15 [@field] | | instance_variables.rb:117:6:117:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:117:6:117:20 | call to get_field | semmle.label | call to get_field | -| instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | semmle.label | [post] foo16 [@field] | | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | semmle.label | [post] foo16 [@field] | | instance_variables.rb:119:6:119:37 | call to call_initialize | semmle.label | call to call_initialize | -| instance_variables.rb:119:6:119:37 | call to call_initialize | semmle.label | call to call_initialize | -| instance_variables.rb:119:28:119:36 | call to taint | semmle.label | call to taint | | instance_variables.rb:119:28:119:36 | call to taint | semmle.label | call to taint | | instance_variables.rb:120:6:120:10 | foo16 [@field] | semmle.label | foo16 [@field] | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | semmle.label | foo16 [@field] | -| instance_variables.rb: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 | -| instance_variables.rb:122:6:122:8 | bar | semmle.label | bar | subpaths | instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:28:9:28:25 | [post] self [@field] | -| instance_variables.rb:28:20:28:24 | field | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:28:9:28:25 | [post] self [@field] | | instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:33:9:33:14 | call to new [@field] | -| instance_variables.rb:33:13:33:13 | x | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:33:9:33:14 | call to new [@field] | -| instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | | instance_variables.rb:36:10:36:23 | call to new [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:36:10:36:33 | call to get_field | | instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:36:10:36:23 | call to new [@field] | -| instance_variables.rb:36:14:36:22 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:36:10:36:23 | call to new [@field] | -| instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | | instance_variables.rb:39:6:39:23 | call to bar [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:39:6:39:33 | call to get_field | | instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | instance_variables.rb:39:6:39:23 | call to bar [@field] | -| instance_variables.rb:39:14:39:22 | call to taint | instance_variables.rb:31:18:31:18 | x | instance_variables.rb:33:9:33:14 | call to new [@field] | instance_variables.rb:39:6:39:23 | call to bar [@field] | -| instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:54:1:54:3 | [post] foo [@field] | | instance_variables.rb:54:15:54:23 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:54:1:54:3 | [post] foo [@field] | | instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | -| instance_variables.rb:55:6:55:8 | foo [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:55:6:55:18 | call to get_field | | instance_variables.rb:58:15:58:22 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:58:1:58:3 | [post] bar [@field] | | instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | | instance_variables.rb:59:6:59:8 | bar [@field] | instance_variables.rb:16:5:18:7 | self in inc_field [@field] | instance_variables.rb:17:9:17:14 | [post] self [@field] | instance_variables.rb:59:6:59:18 | call to inc_field | | instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | -| instance_variables.rb:67:6:67:9 | foo2 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:67:6:67:19 | call to get_field | | instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | -| instance_variables.rb:70:16:70:24 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:70:1:70:4 | [post] foo3 [@field] | -| instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | | instance_variables.rb:78:18:78:26 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:78:2:78:5 | [post] foo5 [@field] | | instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:79:6:79:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:79:6:79:19 | call to get_field | -| instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | | instance_variables.rb:82:32:82:40 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:82:15:82:18 | [post] foo6 [@field] | | instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:83:6:83:9 | foo3 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:83:6:83:19 | call to get_field | -| instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | | instance_variables.rb:84:6:84:9 | foo5 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:84:6:84:19 | call to get_field | | instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:85:6:85:9 | foo6 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:85:6:85:19 | call to get_field | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:15:89:18 | [post] foo7 [@field] | | instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | -| instance_variables.rb:89:45:89:53 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:89:25:89:28 | [post] foo8 [@field] | -| instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | | instance_variables.rb:90:6:90:9 | foo7 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:90:6:90:19 | call to get_field | | instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:91:6:91:9 | foo8 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:91:6:91:19 | call to get_field | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:22:95:25 | [post] foo9 [@field] | | instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | -| instance_variables.rb:95:53:95:61 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:95:32:95:36 | [post] foo10 [@field] | -| instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | | instance_variables.rb:96:6:96:9 | foo9 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:96:6:96:19 | call to get_field | | instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:97:6:97:10 | foo10 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:97:6:97:20 | call to get_field | -| instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:100:5:100:5 | [post] x [@field] | | instance_variables.rb:100:17:100:25 | call to taint | instance_variables.rb:10:19:10:19 | x | instance_variables.rb:11:9:11:14 | [post] self [@field] | instance_variables.rb:100:5:100:5 | [post] x [@field] | | instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:105:6:105:10 | foo11 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:105:6:105:20 | call to get_field | -| instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | | instance_variables.rb:109:6:109:10 | foo12 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:109:6:109:20 | call to get_field | | instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:114:6:114:10 | foo13 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:116:9:116:26 | call to new [@field] | | instance_variables.rb:116:17:116:25 | call to taint | instance_variables.rb:22:20:22:24 | field | instance_variables.rb:23:9:23:14 | [post] self [@field] | instance_variables.rb:116:9:116:26 | call to new [@field] | | instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:117:6:117:10 | foo15 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:117:6:117:20 | call to get_field | -| instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | | instance_variables.rb:119:28:119:36 | call to taint | instance_variables.rb:27:25:27:29 | field | instance_variables.rb:28:9:28:25 | [post] self [@field] | instance_variables.rb:119:6:119:10 | [post] foo16 [@field] | | instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | -| instance_variables.rb:120:6:120:10 | foo16 [@field] | instance_variables.rb:13:5:15:7 | self in get_field [@field] | instance_variables.rb:14:9:14:21 | return | instance_variables.rb:120:6:120:20 | call to get_field | #select | captured_variables.rb:2:20:2:20 | x | captured_variables.rb:5:20:5:30 | call to source | captured_variables.rb:2:20:2:20 | x | $@ | captured_variables.rb:5:20:5:30 | call to source | call to source | | captured_variables.rb:23:14:23:14 | x | captured_variables.rb:27:29:27:39 | call to source | captured_variables.rb:23:14:23:14 | x | $@ | captured_variables.rb:27:29:27:39 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.ql b/ruby/ql/test/library-tests/dataflow/global/Flow.ql index 64ce30508fb0f..51f0816cbba5d 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.ql +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.ql @@ -6,7 +6,7 @@ import codeql.ruby.AST import codeql.ruby.DataFlow private import TestUtilities.InlineFlowTest import DefaultFlowTest -import PathGraph +import TaintFlow::PathGraph from TaintFlow::PathNode source, TaintFlow::PathNode sink where TaintFlow::flowPath(source, sink) 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 0ec677d4198a8..79f2565a5904c 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 @@ -81,8 +81,7 @@ edges | hash_flow.rb:96:30:96:33 | hash [element :a] | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] | | hash_flow.rb:97:10:97:14 | hash2 [element :a] | hash_flow.rb:97:10:97:18 | ...[...] | | hash_flow.rb:105:5:105:5 | b | hash_flow.rb:106:10:106:10 | b | -| hash_flow.rb:105:21:105:30 | __synth__0 | hash_flow.rb:105:5:105:5 | b | -| hash_flow.rb:105:21:105:30 | call to taint | hash_flow.rb:105:21:105:30 | __synth__0 | +| hash_flow.rb:105:21:105:30 | call to taint | hash_flow.rb:105:5:105:5 | b | | hash_flow.rb:113:5:113:5 | b | hash_flow.rb:115:10:115:10 | b | | hash_flow.rb:113:9:113:12 | [post] hash [element :a] | hash_flow.rb:114:10:114:13 | hash [element :a] | | hash_flow.rb:113:9:113:34 | call to store | hash_flow.rb:113:5:113:5 | b | @@ -1063,7 +1062,6 @@ nodes | 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 | diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql index 3194189793646..6f8978fe81947 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql @@ -5,7 +5,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import ValueFlowTest -import PathGraph +import ValueFlow::PathGraph from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) diff --git a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected index f19065fb778ed..f97456205d3ce 100644 --- a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected +++ b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected @@ -19,67 +19,36 @@ edges | local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:78:3:78:3 | z | | local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:87:25:87:25 | x | | local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:3:93:3 | a | | local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:3:93:3 | a | | local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:3:93:3 | a | -| local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:3:93:3 | a | | local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:3:95:3 | b | | local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:3:95:3 | b | | local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:3:95:3 | b | -| local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:3:95:3 | b | -| local_dataflow.rb:98:3:98:3 | a | local_dataflow.rb:99:8:99:8 | a | | local_dataflow.rb:98:3:98:3 | a | local_dataflow.rb:99:8:99:8 | a | | local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:3:98:3 | a | -| local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:3:98:3 | a | | local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:3:98:3 | a | -| local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:3:98:3 | a | -| local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | | local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | | local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:3:100:3 | b | -| local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:3:100:3 | b | -| local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:3:100:3 | b | | local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:3:100:3 | b | | local_dataflow.rb:103:3:103:3 | a | local_dataflow.rb:104:3:104:3 | a | -| local_dataflow.rb:103:3:103:3 | a | local_dataflow.rb:104:3:104:3 | a | | local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:3 | a | -| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:3 | a | -| local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | | local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | | local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:3:104:3 | a | -| local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:3:104:3 | a | -| local_dataflow.rb:106:3:106:3 | b | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:106:3:106:3 | b | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:3 | b | -| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:3 | b | -| local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | | local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:3:107:3 | b | -| local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:3:107:3 | b | -| local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | -| local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | -| local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | -| local_dataflow.rb:117:8:117:16 | call to source | local_dataflow.rb:117:8:117:23 | call to tap | | local_dataflow.rb:117:8:117:16 | call to source | local_dataflow.rb:117:8:117:23 | call to tap | | local_dataflow.rb:118:3:118:11 | call to source | local_dataflow.rb:118:20:118:20 | x | -| local_dataflow.rb:118:3:118:11 | call to source | local_dataflow.rb:118:20:118:20 | x | -| local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | -| local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | -| local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | -| local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | -| local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | -| local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | nodes | local_dataflow.rb:78:3:78:3 | z | semmle.label | z | | local_dataflow.rb:78:12:78:20 | call to source | semmle.label | call to source | @@ -101,90 +70,47 @@ nodes | 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 | -| local_dataflow.rb:108:8:108:8 | b | semmle.label | b | -| local_dataflow.rb:112:8:112:16 | call to source | semmle.label | call to source | | local_dataflow.rb:112:8:112:16 | call to source | semmle.label | call to source | | local_dataflow.rb:112:8:112:20 | call to dup | semmle.label | call to dup | -| local_dataflow.rb:112:8:112:20 | call to dup | semmle.label | call to dup | | local_dataflow.rb:113:8:113:16 | call to source | semmle.label | call to source | -| local_dataflow.rb:113:8:113:16 | call to source | semmle.label | call to source | -| local_dataflow.rb:113:8:113:20 | call to dup | semmle.label | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | semmle.label | call to dup | | local_dataflow.rb:113:8:113:24 | call to dup | semmle.label | call to dup | -| local_dataflow.rb:113:8:113:24 | call to dup | semmle.label | call to dup | -| local_dataflow.rb:117:8:117:16 | call to source | semmle.label | call to source | | local_dataflow.rb:117:8:117:16 | call to source | semmle.label | call to source | | local_dataflow.rb:117:8:117:23 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:117:8:117:23 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:118:3:118:11 | call to source | semmle.label | call to source | | local_dataflow.rb:118:3:118:11 | call to source | semmle.label | call to source | | local_dataflow.rb:118:20:118:20 | x | semmle.label | x | -| local_dataflow.rb:118:20:118:20 | x | semmle.label | x | -| local_dataflow.rb:118:28:118:28 | x | semmle.label | x | | local_dataflow.rb:118:28:118:28 | x | semmle.label | x | | local_dataflow.rb:119:8:119:16 | call to source | semmle.label | call to source | -| local_dataflow.rb:119:8:119:16 | call to source | semmle.label | call to source | | local_dataflow.rb:119:8:119:23 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:119:8:119:23 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:119:8:119:30 | call to tap | semmle.label | call to tap | | local_dataflow.rb:119:8:119:30 | call to tap | semmle.label | call to tap | | local_dataflow.rb:123:8:123:16 | call to source | semmle.label | call to source | -| local_dataflow.rb:123:8:123:16 | call to source | semmle.label | call to source | -| local_dataflow.rb:123:8:123:20 | call to dup | semmle.label | call to dup | | local_dataflow.rb:123:8:123:20 | call to dup | semmle.label | call to dup | | local_dataflow.rb:123:8:123:45 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:123:8:123:45 | call to tap | semmle.label | call to tap | -| local_dataflow.rb:123:8:123:49 | call to dup | semmle.label | call to dup | | local_dataflow.rb:123:8:123:49 | call to dup | semmle.label | call to dup | subpaths #select diff --git a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.ql b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.ql index 9a5ca73aa1258..e30fe4c131b95 100644 --- a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.ql +++ b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.ql @@ -5,7 +5,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import DefaultFlowTest -import PathGraph +import TaintFlow::PathGraph from TaintFlow::PathNode source, TaintFlow::PathNode sink where TaintFlow::flowPath(source, sink) diff --git a/ruby/ql/test/library-tests/dataflow/params/params-flow.ql b/ruby/ql/test/library-tests/dataflow/params/params-flow.ql index 3194189793646..6f8978fe81947 100644 --- a/ruby/ql/test/library-tests/dataflow/params/params-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/params/params-flow.ql @@ -5,7 +5,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import ValueFlowTest -import PathGraph +import ValueFlow::PathGraph from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) 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 1e0abf53c9937..cf6472ea6def5 100644 --- a/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected @@ -1,293 +1,5 @@ testFailures edges -| pathname_flow.rb:4:5:4:6 | pn | pathname_flow.rb:5:10:5:11 | pn | -| pathname_flow.rb:4:10:4:33 | call to new | pathname_flow.rb:4:5:4:6 | pn | -| pathname_flow.rb:4:23:4:32 | call to source | pathname_flow.rb:4:10:4:33 | call to new | -| pathname_flow.rb:9:3:9:3 | a | pathname_flow.rb:11:8:11:12 | ... + ... | -| pathname_flow.rb:9:7:9:30 | call to new | pathname_flow.rb:9:3:9:3 | a | -| pathname_flow.rb:9:20:9:29 | call to source | pathname_flow.rb:9:7:9:30 | call to new | -| pathname_flow.rb:10:3:10:3 | b | pathname_flow.rb:11:8:11:12 | ... + ... | -| pathname_flow.rb:10:7:10:30 | call to new | pathname_flow.rb:10:3:10:3 | b | -| pathname_flow.rb:10:20:10:29 | call to source | pathname_flow.rb:10:7:10:30 | call to new | -| pathname_flow.rb:15:3:15:4 | pn | pathname_flow.rb:16:8:16:9 | pn | -| pathname_flow.rb:15:8:15:31 | call to new | pathname_flow.rb:15:3:15:4 | pn | -| pathname_flow.rb:15:21:15:30 | call to source | pathname_flow.rb:15:8:15:31 | call to new | -| pathname_flow.rb:16:8:16:9 | pn | pathname_flow.rb:16:8:16:17 | call to dirname | -| pathname_flow.rb:20:3:20:3 | a | pathname_flow.rb:21:3:21:3 | a | -| pathname_flow.rb:20:7:20:30 | call to new | pathname_flow.rb:20:3:20:3 | a | -| pathname_flow.rb:20:20:20:29 | call to source | pathname_flow.rb:20:7:20:30 | call to new | -| pathname_flow.rb:21:3:21:3 | a | pathname_flow.rb:21:23:21:23 | x | -| pathname_flow.rb:21:23:21:23 | x | pathname_flow.rb:22:10:22:10 | x | -| pathname_flow.rb:27:3:27:3 | a | pathname_flow.rb:28:8:28:8 | a | -| pathname_flow.rb:27:7:27:30 | call to new | pathname_flow.rb:27:3:27:3 | a | -| pathname_flow.rb:27:20:27:29 | call to source | pathname_flow.rb:27:7:27:30 | call to new | -| pathname_flow.rb:28:8:28:8 | a | pathname_flow.rb:28:8:28:22 | call to expand_path | -| pathname_flow.rb:32:3:32:3 | a | pathname_flow.rb:35:8:35:8 | a | -| pathname_flow.rb:32:7:32:30 | call to new | pathname_flow.rb:32:3:32:3 | a | -| pathname_flow.rb:32:20:32:29 | call to source | pathname_flow.rb:32:7:32:30 | call to new | -| pathname_flow.rb:34:3:34:3 | c | pathname_flow.rb:35:18:35:18 | c | -| pathname_flow.rb:34:7:34:30 | call to new | pathname_flow.rb:34:3:34:3 | c | -| pathname_flow.rb:34:20:34:29 | call to source | pathname_flow.rb:34:7:34:30 | call to new | -| pathname_flow.rb:35:8:35:8 | a | pathname_flow.rb:35:8:35:19 | call to join | -| pathname_flow.rb:35:18:35:18 | c | pathname_flow.rb:35:8:35:19 | call to join | -| pathname_flow.rb:39:3:39:3 | a | pathname_flow.rb:40:8:40:8 | a | -| pathname_flow.rb:39:7:39:30 | call to new | pathname_flow.rb:39:3:39:3 | a | -| pathname_flow.rb:39:20:39:29 | call to source | pathname_flow.rb:39:7:39:30 | call to new | -| pathname_flow.rb:40:8:40:8 | a | pathname_flow.rb:40:8:40:17 | call to parent | -| pathname_flow.rb:44:3:44:3 | a | pathname_flow.rb:45:8:45:8 | a | -| pathname_flow.rb:44:7:44:30 | call to new | pathname_flow.rb:44:3:44:3 | a | -| pathname_flow.rb:44:20:44:29 | call to source | pathname_flow.rb:44:7:44:30 | call to new | -| pathname_flow.rb:45:8:45:8 | a | pathname_flow.rb:45:8:45:19 | call to realpath | -| pathname_flow.rb:49:3:49:3 | a | pathname_flow.rb:50:8:50:8 | a | -| pathname_flow.rb:49:7:49:30 | call to new | pathname_flow.rb:49:3:49:3 | a | -| pathname_flow.rb:49:20:49:29 | call to source | pathname_flow.rb:49:7:49:30 | call to new | -| pathname_flow.rb:50:8:50:8 | a | pathname_flow.rb:50:8:50:39 | call to relative_path_from | -| pathname_flow.rb:54:3:54:3 | a | pathname_flow.rb:55:8:55:8 | a | -| pathname_flow.rb:54:7:54:30 | call to new | pathname_flow.rb:54:3:54:3 | a | -| pathname_flow.rb:54:20:54:29 | call to source | pathname_flow.rb:54:7:54:30 | call to new | -| pathname_flow.rb:55:8:55:8 | a | pathname_flow.rb:55:8:55:16 | call to to_path | -| pathname_flow.rb:59:3:59:3 | a | pathname_flow.rb:60:8:60:8 | a | -| pathname_flow.rb:59:7:59:30 | call to new | pathname_flow.rb:59:3:59:3 | a | -| pathname_flow.rb:59:20:59:29 | call to source | pathname_flow.rb:59:7:59:30 | call to new | -| pathname_flow.rb:60:8:60:8 | a | pathname_flow.rb:60:8:60:13 | call to to_s | -| pathname_flow.rb:64:3:64:3 | a | pathname_flow.rb:65:3:65:3 | b | -| pathname_flow.rb:64:7:64:30 | call to new | pathname_flow.rb:64:3:64:3 | a | -| pathname_flow.rb:64:20:64:29 | call to source | pathname_flow.rb:64:7:64:30 | call to new | -| pathname_flow.rb:65:3:65:3 | b | pathname_flow.rb:66:8:66:8 | b | -| pathname_flow.rb:70:3:70:3 | a | pathname_flow.rb:71:3:71:3 | b | -| pathname_flow.rb:70:7:70:30 | call to new | pathname_flow.rb:70:3:70:3 | a | -| pathname_flow.rb:70:20:70:29 | call to source | pathname_flow.rb:70:7:70:30 | call to new | -| pathname_flow.rb:71:3:71:3 | b | pathname_flow.rb:72:8:72:8 | b | -| pathname_flow.rb:76:3:76:3 | a | pathname_flow.rb:77:7:77:7 | a | -| pathname_flow.rb:76:7:76:30 | call to new | pathname_flow.rb:76:3:76:3 | a | -| pathname_flow.rb:76:20:76:29 | call to source | pathname_flow.rb:76:7:76:30 | call to new | -| pathname_flow.rb:77:3:77:3 | b | pathname_flow.rb:78:8:78:8 | b | -| pathname_flow.rb:77:7:77:7 | a | pathname_flow.rb:77:7:77:16 | call to basename | -| pathname_flow.rb:77:7:77:16 | call to basename | pathname_flow.rb:77:3:77:3 | b | -| pathname_flow.rb:82:3:82:3 | a | pathname_flow.rb:83:7:83:7 | a | -| pathname_flow.rb:82:7:82:30 | call to new | pathname_flow.rb:82:3:82:3 | a | -| pathname_flow.rb:82:20:82:29 | call to source | pathname_flow.rb:82:7:82:30 | call to new | -| pathname_flow.rb:83:3:83:3 | b | pathname_flow.rb:84:8:84:8 | b | -| pathname_flow.rb:83:7:83:7 | a | pathname_flow.rb:83:7:83:17 | call to cleanpath | -| pathname_flow.rb:83:7:83:17 | call to cleanpath | pathname_flow.rb:83:3:83:3 | b | -| pathname_flow.rb:88:3:88:3 | a | pathname_flow.rb:89:7:89:7 | a | -| pathname_flow.rb:88:7:88:30 | call to new | pathname_flow.rb:88:3:88:3 | a | -| pathname_flow.rb:88:20:88:29 | call to source | pathname_flow.rb:88:7:88:30 | call to new | -| pathname_flow.rb:89:3:89:3 | b | pathname_flow.rb:90:8:90:8 | b | -| pathname_flow.rb:89:7:89:7 | a | pathname_flow.rb:89:7:89:25 | call to sub | -| pathname_flow.rb:89:7:89:25 | call to sub | pathname_flow.rb:89:3:89:3 | b | -| pathname_flow.rb:94:3:94:3 | a | pathname_flow.rb:95:7:95:7 | a | -| pathname_flow.rb:94:7:94:30 | call to new | pathname_flow.rb:94:3:94:3 | a | -| pathname_flow.rb:94:20:94:29 | call to source | pathname_flow.rb:94:7:94:30 | call to new | -| pathname_flow.rb:95:3:95:3 | b | pathname_flow.rb:96:8:96:8 | b | -| pathname_flow.rb:95:7:95:7 | a | pathname_flow.rb:95:7:95:23 | call to sub_ext | -| pathname_flow.rb:95:7:95:23 | call to sub_ext | pathname_flow.rb:95:3:95:3 | b | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:103:3:103:3 | b | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:106:3:106:3 | c | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:109:7:109:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:112:7:112:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:115:7:115:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:118:7:118:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:121:7:121:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:124:7:124:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:127:7:127:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:130:7:130:7 | a | -| pathname_flow.rb:101:3:101:3 | a | pathname_flow.rb:133:7:133:7 | a | -| pathname_flow.rb:101:7:101:30 | call to new | pathname_flow.rb:101:3:101:3 | a | -| pathname_flow.rb:101:20:101:29 | call to source | pathname_flow.rb:101:7:101:30 | call to new | -| pathname_flow.rb:103:3:103:3 | b | pathname_flow.rb:104:8:104:8 | b | -| pathname_flow.rb:104:8:104:8 | b | pathname_flow.rb:104:8:104:17 | call to realpath | -| pathname_flow.rb:106:3:106:3 | c | pathname_flow.rb:107:8:107:8 | c | -| pathname_flow.rb:107:8:107:8 | c | pathname_flow.rb:107:8:107:17 | call to realpath | -| pathname_flow.rb:109:3:109:3 | d | pathname_flow.rb:110:8:110:8 | d | -| pathname_flow.rb:109:7:109:7 | a | pathname_flow.rb:109:7:109:16 | call to basename | -| pathname_flow.rb:109:7:109:16 | call to basename | pathname_flow.rb:109:3:109:3 | d | -| pathname_flow.rb:110:8:110:8 | d | pathname_flow.rb:110:8:110:17 | call to realpath | -| pathname_flow.rb:112:3:112:3 | e | pathname_flow.rb:113:8:113:8 | e | -| pathname_flow.rb:112:7:112:7 | a | pathname_flow.rb:112:7:112:17 | call to cleanpath | -| pathname_flow.rb:112:7:112:17 | call to cleanpath | pathname_flow.rb:112:3:112:3 | e | -| pathname_flow.rb:113:8:113:8 | e | pathname_flow.rb:113:8:113:17 | call to realpath | -| pathname_flow.rb:115:3:115:3 | f | pathname_flow.rb:116:8:116:8 | f | -| pathname_flow.rb:115:7:115:7 | a | pathname_flow.rb:115:7:115:19 | call to expand_path | -| pathname_flow.rb:115:7:115:19 | call to expand_path | pathname_flow.rb:115:3:115:3 | f | -| pathname_flow.rb:116:8:116:8 | f | pathname_flow.rb:116:8:116:17 | call to realpath | -| pathname_flow.rb:118:3:118:3 | g | pathname_flow.rb:119:8:119:8 | g | -| pathname_flow.rb:118:7:118:7 | a | pathname_flow.rb:118:7:118:19 | call to join | -| pathname_flow.rb:118:7:118:19 | call to join | pathname_flow.rb:118:3:118:3 | g | -| pathname_flow.rb:119:8:119:8 | g | pathname_flow.rb:119:8:119:17 | call to realpath | -| pathname_flow.rb:121:3:121:3 | h | pathname_flow.rb:122:8:122:8 | h | -| pathname_flow.rb:121:7:121:7 | a | pathname_flow.rb:121:7:121:16 | call to realpath | -| pathname_flow.rb:121:7:121:16 | call to realpath | pathname_flow.rb:121:3:121:3 | h | -| pathname_flow.rb:122:8:122:8 | h | pathname_flow.rb:122:8:122:17 | call to realpath | -| pathname_flow.rb:124:3:124:3 | i | pathname_flow.rb:125:8:125:8 | i | -| pathname_flow.rb:124:7:124:7 | a | pathname_flow.rb:124:7:124:38 | call to relative_path_from | -| pathname_flow.rb:124:7:124:38 | call to relative_path_from | pathname_flow.rb:124:3:124:3 | i | -| pathname_flow.rb:125:8:125:8 | i | pathname_flow.rb:125:8:125:17 | call to realpath | -| pathname_flow.rb:127:3:127:3 | j | pathname_flow.rb:128:8:128:8 | j | -| pathname_flow.rb:127:7:127:7 | a | pathname_flow.rb:127:7:127:25 | call to sub | -| pathname_flow.rb:127:7:127:25 | call to sub | pathname_flow.rb:127:3:127:3 | j | -| pathname_flow.rb:128:8:128:8 | j | pathname_flow.rb:128:8:128:17 | call to realpath | -| pathname_flow.rb:130:3:130:3 | k | pathname_flow.rb:131:8:131:8 | k | -| pathname_flow.rb:130:7:130:7 | a | pathname_flow.rb:130:7:130:23 | call to sub_ext | -| pathname_flow.rb:130:7:130:23 | call to sub_ext | pathname_flow.rb:130:3:130:3 | k | -| pathname_flow.rb:131:8:131:8 | k | pathname_flow.rb:131:8:131:17 | call to realpath | -| pathname_flow.rb:133:3:133:3 | l | pathname_flow.rb:134:8:134:8 | l | -| pathname_flow.rb:133:7:133:7 | a | pathname_flow.rb:133:7:133:15 | call to to_path | -| pathname_flow.rb:133:7:133:15 | call to to_path | pathname_flow.rb:133:3:133:3 | l | -| pathname_flow.rb:134:8:134:8 | l | pathname_flow.rb:134:8:134:17 | call to realpath | 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 | -| pathname_flow.rb:134:8:134:17 | call to realpath | semmle.label | call to realpath | subpaths #select diff --git a/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.ql b/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.ql index dfd6242a414fb..e02827eaf8d09 100644 --- a/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.ql @@ -5,7 +5,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import DefaultFlowTest -import PathGraph +import ValueFlow::PathGraph from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) diff --git a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected index c673ee77e66cf..c7a8595c46449 100644 --- a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.expected @@ -1,20 +1,13 @@ testFailures edges | ssa_flow.rb:12:9:12:9 | [post] a [element 0] | ssa_flow.rb:16:10:16:10 | a [element 0] | -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | ssa_flow.rb:16:10:16:10 | a [element 0] | -| ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:12:9:12:9 | [post] a [element 0] | | ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:12:9:12:9 | [post] a [element 0] | | ssa_flow.rb:16:10:16:10 | a [element 0] | ssa_flow.rb:16:10:16:13 | ...[...] | -| ssa_flow.rb:16:10:16:10 | a [element 0] | ssa_flow.rb:16:10:16:13 | ...[...] | nodes | ssa_flow.rb:12:9:12:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | -| ssa_flow.rb:12:9:12:9 | [post] a [element 0] | semmle.label | [post] a [element 0] | | ssa_flow.rb:12:16:12:23 | call to taint | semmle.label | call to taint | -| ssa_flow.rb:12:16:12:23 | call to taint | semmle.label | call to taint | -| ssa_flow.rb:16:10:16:10 | a [element 0] | semmle.label | a [element 0] | | ssa_flow.rb:16:10:16:10 | a [element 0] | semmle.label | a [element 0] | | ssa_flow.rb:16:10:16:13 | ...[...] | semmle.label | ...[...] | -| ssa_flow.rb:16:10:16:13 | ...[...] | semmle.label | ...[...] | subpaths #select | ssa_flow.rb:16:10:16:13 | ...[...] | ssa_flow.rb:12:16:12:23 | call to taint | ssa_flow.rb:16:10:16:13 | ...[...] | $@ | ssa_flow.rb:12:16:12:23 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.ql b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.ql index dfd6242a414fb..e02827eaf8d09 100644 --- a/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/ssa-flow/ssa-flow.ql @@ -5,7 +5,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import DefaultFlowTest -import PathGraph +import ValueFlow::PathGraph from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) 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 93c84461ff17e..ec483b6fc8e32 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 @@ -3,763 +3,31 @@ testFailures | string_flow.rb:227:10:227:10 | a | Unexpected result: hasValueFlow=a | edges | string_flow.rb:2:5:2:5 | a | string_flow.rb:3:21:3:21 | a | -| string_flow.rb:2:5:2:5 | a | string_flow.rb:3:21:3:21 | a | -| string_flow.rb:2:9:2:18 | call to source | string_flow.rb:2:5:2:5 | a | | string_flow.rb:2:9:2:18 | call to source | string_flow.rb:2:5:2:5 | a | | string_flow.rb:3:21:3:21 | a | string_flow.rb:3:10:3:22 | call to new | -| string_flow.rb:3:21:3:21 | a | string_flow.rb:3:10:3:22 | call to new | -| string_flow.rb:7:5:7:5 | a | string_flow.rb:9:29:9:29 | a | -| string_flow.rb:7:9:7:18 | call to source | string_flow.rb:7:5:7:5 | a | -| string_flow.rb:8:5:8:5 | b | string_flow.rb:10:29:10:29 | b | -| string_flow.rb:8:9:8:16 | call to source | string_flow.rb:8:5:8:5 | b | -| string_flow.rb:9:29:9:29 | a | string_flow.rb:9:10:9:30 | call to try_convert | -| string_flow.rb:10:29:10:29 | b | string_flow.rb:10:10:10:30 | call to try_convert | -| string_flow.rb:14:5:14:5 | a | string_flow.rb:15:10:15:17 | ... % ... | -| string_flow.rb:14:5:14:5 | a | string_flow.rb:15:17:15:17 | a | -| string_flow.rb:14:5:14:5 | a | string_flow.rb:16:10:16:29 | ... % ... | -| string_flow.rb:14:5:14:5 | a | string_flow.rb:16:28:16:28 | a | -| string_flow.rb:14:5:14:5 | a | string_flow.rb:17:10:17:10 | a | -| string_flow.rb:14:5:14:5 | a | string_flow.rb:17:10:17:18 | ... % ... | -| string_flow.rb:14:9:14:18 | call to source | string_flow.rb:14:5:14:5 | a | -| string_flow.rb:15:17:15:17 | a | string_flow.rb:15:10:15:17 | ... % ... | -| string_flow.rb:16:28:16:28 | a | string_flow.rb:16:10:16:29 | ... % ... | -| string_flow.rb:17:10:17:10 | a | string_flow.rb:17:10:17:18 | ... % ... | -| string_flow.rb:21:5:21:5 | a | string_flow.rb:22:5:22:5 | b | -| string_flow.rb:21:9:21:18 | call to source | string_flow.rb:21:5:21:5 | a | -| string_flow.rb:22:5:22:5 | b | string_flow.rb:23:10:23:10 | b | -| string_flow.rb:27:5:27:5 | a | string_flow.rb:28:5:28:5 | b | -| string_flow.rb:27:9:27:18 | call to source | string_flow.rb:27:5:27:5 | a | -| string_flow.rb:28:5:28:5 | b | string_flow.rb:29:10:29:10 | b | -| string_flow.rb:33:5:33:5 | a | string_flow.rb:34:5:34:5 | b | -| string_flow.rb:33:5:33:5 | a | string_flow.rb:36:5:36:5 | c | -| string_flow.rb:33:9:33:18 | call to source | string_flow.rb:33:5:33:5 | a | -| string_flow.rb:34:5:34:5 | b | string_flow.rb:35:10:35:10 | b | -| string_flow.rb:36:5:36:5 | c | string_flow.rb:37:10:37:10 | c | -| string_flow.rb:41:5:41:5 | a | string_flow.rb:42:10:42:10 | a | -| string_flow.rb:41:9:41:18 | call to source | string_flow.rb:41:5:41:5 | a | -| string_flow.rb:42:10:42:10 | a | string_flow.rb:42:10:42:12 | call to b | -| string_flow.rb:46:5:46:5 | a | string_flow.rb:47:10:47:10 | a | -| string_flow.rb:46:5:46:5 | a | string_flow.rb:48:10:48:10 | a | -| string_flow.rb:46:5:46:5 | a | string_flow.rb:49:10:49:10 | a | -| string_flow.rb:46:9:46:18 | call to source | string_flow.rb:46:5:46:5 | a | -| string_flow.rb:47:10:47:10 | a | string_flow.rb:47:10:47:23 | call to byteslice | -| string_flow.rb:48:10:48:10 | a | string_flow.rb:48:10:48:26 | call to byteslice | -| string_flow.rb:49:10:49:10 | a | string_flow.rb:49:10:49:26 | call to byteslice | -| string_flow.rb:53:5:53:5 | a | string_flow.rb:54:10:54:10 | a | -| string_flow.rb:53:5:53:5 | a | string_flow.rb:55:10:55:10 | a | -| string_flow.rb:53:9:53:18 | call to source | string_flow.rb:53:5:53:5 | a | -| string_flow.rb:54:10:54:10 | a | string_flow.rb:54:10:54:21 | call to capitalize | -| string_flow.rb:55:10:55:10 | a | string_flow.rb:55:10:55:22 | call to capitalize! | -| string_flow.rb:59:5:59:5 | a | string_flow.rb:60:10:60:10 | a | -| string_flow.rb:59:5:59:5 | a | string_flow.rb:61:27:61:27 | a | -| string_flow.rb:59:5:59:5 | a | string_flow.rb:62:10:62:10 | a | -| string_flow.rb:59:5:59:5 | a | string_flow.rb:63:26:63:26 | a | -| string_flow.rb:59:5:59:5 | a | string_flow.rb:64:10:64:10 | a | -| string_flow.rb:59:5:59:5 | a | string_flow.rb:65:26:65:26 | a | -| string_flow.rb:59:9:59:18 | call to source | string_flow.rb:59:5:59:5 | a | -| string_flow.rb:60:10:60:10 | a | string_flow.rb:60:10:60:21 | call to center | -| string_flow.rb:61:27:61:27 | a | string_flow.rb:61:10:61:28 | call to center | -| string_flow.rb:62:10:62:10 | a | string_flow.rb:62:10:62:20 | call to ljust | -| string_flow.rb:63:26:63:26 | a | string_flow.rb:63:10:63:27 | call to ljust | -| string_flow.rb:64:10:64:10 | a | string_flow.rb:64:10:64:20 | call to rjust | -| string_flow.rb:65:26:65:26 | a | string_flow.rb:65:10:65:27 | call to rjust | -| string_flow.rb:69:5:69:5 | a | string_flow.rb:70:10:70:10 | a | -| string_flow.rb:69:5:69:5 | a | string_flow.rb:71:10:71:10 | a | -| string_flow.rb:69:9:69:18 | call to source | string_flow.rb:69:5:69:5 | a | -| string_flow.rb:70:10:70:10 | a | string_flow.rb:70:10:70:16 | call to chomp | -| string_flow.rb:71:10:71:10 | a | string_flow.rb:71:10:71:17 | call to chomp! | -| string_flow.rb:75:5:75:5 | a | string_flow.rb:76:10:76:10 | a | -| string_flow.rb:75:5:75:5 | a | string_flow.rb:77:10:77:10 | a | -| string_flow.rb:75:9:75:18 | call to source | string_flow.rb:75:5:75:5 | a | -| string_flow.rb:76:10:76:10 | a | string_flow.rb:76:10:76:15 | call to chop | -| string_flow.rb:77:10:77:10 | a | string_flow.rb:77:10:77:16 | call to chop! | -| string_flow.rb:83:5:83:5 | a | string_flow.rb:84:5:84:5 | a | | string_flow.rb:83:5:83:5 | a | string_flow.rb:84:5:84:5 | a | | string_flow.rb:83:9:83:18 | call to source | string_flow.rb:83:5:83:5 | a | -| string_flow.rb:83:9:83:18 | call to source | string_flow.rb:83:5:83:5 | a | -| string_flow.rb:84:5:84:5 | [post] a | string_flow.rb:85:10:85:10 | a | | string_flow.rb:84:5:84:5 | [post] a | string_flow.rb:85:10:85:10 | a | | string_flow.rb:84:5:84:5 | a | string_flow.rb:84:5:84:5 | [post] a | -| string_flow.rb:84:5:84:5 | a | string_flow.rb:84:5:84:5 | [post] a | -| string_flow.rb:108:5:108:5 | a | string_flow.rb:109:10:109:10 | a | -| string_flow.rb:108:9:108:18 | call to source | string_flow.rb:108:5:108:5 | a | -| string_flow.rb:109:10:109:10 | [post] a | string_flow.rb:110:10:110:10 | a | -| string_flow.rb:109:10:109:10 | [post] a | string_flow.rb:111:10:111:10 | a | -| string_flow.rb:109:10:109:10 | a | string_flow.rb:109:10:109:10 | [post] a | -| string_flow.rb:109:10:109:10 | a | string_flow.rb:109:10:109:22 | call to delete | -| string_flow.rb:110:10:110:10 | a | string_flow.rb:110:10:110:29 | call to delete_prefix | -| string_flow.rb:111:10:111:10 | a | string_flow.rb:111:10:111:29 | call to delete_suffix | -| string_flow.rb:115:5:115:5 | a | string_flow.rb:116:10:116:10 | a | -| string_flow.rb:115:5:115:5 | a | string_flow.rb:117:10:117:10 | a | -| string_flow.rb:115:5:115:5 | a | string_flow.rb:118:10:118:10 | a | -| string_flow.rb:115:5:115:5 | a | string_flow.rb:119:10:119:10 | a | -| string_flow.rb:115:5:115:5 | a | string_flow.rb:120:10:120:10 | a | -| string_flow.rb:115:5:115:5 | a | string_flow.rb:121:10:121:10 | a | -| string_flow.rb:115:9:115:18 | call to source | string_flow.rb:115:5:115:5 | a | -| string_flow.rb:116:10:116:10 | a | string_flow.rb:116:10:116:19 | call to downcase | -| string_flow.rb:117:10:117:10 | a | string_flow.rb:117:10:117:20 | call to downcase! | -| string_flow.rb:118:10:118:10 | a | string_flow.rb:118:10:118:19 | call to swapcase | -| string_flow.rb:119:10:119:10 | a | string_flow.rb:119:10:119:20 | call to swapcase! | -| string_flow.rb:120:10:120:10 | a | string_flow.rb:120:10:120:17 | call to upcase | -| string_flow.rb:121:10:121:10 | a | string_flow.rb:121:10:121:18 | call to upcase! | -| string_flow.rb:125:5:125:5 | a | string_flow.rb:126:9:126:9 | a | -| string_flow.rb:125:9:125:18 | call to source | string_flow.rb:125:5:125:5 | a | -| string_flow.rb:126:5:126:5 | b | string_flow.rb:127:10:127:10 | b | -| string_flow.rb:126:5:126:5 | b | string_flow.rb:128:10:128:10 | b | -| string_flow.rb:126:9:126:9 | a | string_flow.rb:126:9:126:14 | call to dump | -| string_flow.rb:126:9:126:14 | call to dump | string_flow.rb:126:5:126:5 | b | -| string_flow.rb:128:10:128:10 | b | string_flow.rb:128:10:128:17 | call to undump | -| string_flow.rb:132:5:132:5 | a | string_flow.rb:133:9:133:9 | a | -| string_flow.rb:132:5:132:5 | a | string_flow.rb:135:9:135:9 | a | -| string_flow.rb:132:9:132:18 | call to source | string_flow.rb:132:5:132:5 | a | -| string_flow.rb:133:5:133:5 | b | string_flow.rb:134:10:134:10 | b | -| string_flow.rb:133:9:133:9 | a | string_flow.rb:133:9:133:40 | call to each_line | -| string_flow.rb:133:9:133:9 | a | string_flow.rb:133:24:133:27 | line | -| string_flow.rb:133:9:133:40 | call to each_line | string_flow.rb:133:5:133:5 | b | -| string_flow.rb:133:24:133:27 | line | string_flow.rb:133:35:133:38 | line | -| string_flow.rb:135:5:135:5 | c [element] | string_flow.rb:136:10:136:10 | c [element] | -| string_flow.rb:135:9:135:9 | a | string_flow.rb:135:9:135:19 | call to each_line [element] | -| string_flow.rb:135:9:135:19 | call to each_line [element] | string_flow.rb:135:5:135:5 | c [element] | -| string_flow.rb:136:10:136:10 | c [element] | string_flow.rb:136:10:136:15 | call to to_a [element] | -| string_flow.rb:136:10:136:15 | call to to_a [element] | string_flow.rb:136:10:136:18 | ...[...] | -| string_flow.rb:140:5:140:5 | a | string_flow.rb:141:9:141:9 | a | -| string_flow.rb:140:5:140:5 | a | string_flow.rb:143:9:143:9 | a | -| string_flow.rb:140:9:140:18 | call to source | string_flow.rb:140:5:140:5 | a | -| string_flow.rb:141:5:141:5 | b | string_flow.rb:142:10:142:10 | b | -| string_flow.rb:141:9:141:9 | a | string_flow.rb:141:9:141:36 | call to lines | -| string_flow.rb:141:9:141:9 | a | string_flow.rb:141:20:141:23 | line | -| string_flow.rb:141:9:141:36 | call to lines | string_flow.rb:141:5:141:5 | b | -| string_flow.rb:141:20:141:23 | line | string_flow.rb:141:31:141:34 | line | -| string_flow.rb:143:5:143:5 | c [element] | string_flow.rb:144:10:144:10 | c [element] | -| string_flow.rb:143:9:143:9 | a | string_flow.rb:143:9:143:15 | call to lines [element] | -| string_flow.rb:143:9:143:15 | call to lines [element] | string_flow.rb:143:5:143:5 | c [element] | -| string_flow.rb:144:10:144:10 | c [element] | string_flow.rb:144:10:144:13 | ...[...] | -| string_flow.rb:148:5:148:5 | a | string_flow.rb:149:10:149:10 | a | -| string_flow.rb:148:5:148:5 | a | string_flow.rb:150:10:150:10 | a | -| string_flow.rb:148:5:148:5 | a | string_flow.rb:151:10:151:10 | a | -| string_flow.rb:148:5:148:5 | a | string_flow.rb:152:10:152:10 | a | -| string_flow.rb:148:9:148:18 | call to source | string_flow.rb:148:5:148:5 | a | -| string_flow.rb:149:10:149:10 | a | string_flow.rb:149:10:149:26 | call to encode | -| string_flow.rb:150:10:150:10 | a | string_flow.rb:150:10:150:27 | call to encode! | -| string_flow.rb:151:10:151:10 | a | string_flow.rb:151:10:151:28 | call to unicode_normalize | -| string_flow.rb:152:10:152:10 | a | string_flow.rb:152:10:152:29 | call to unicode_normalize! | -| string_flow.rb:156:5:156:5 | a | string_flow.rb:157:10:157:10 | a | -| string_flow.rb:156:9:156:18 | call to source | string_flow.rb:156:5:156:5 | a | -| string_flow.rb:157:10:157:10 | a | string_flow.rb:157:10:157:34 | call to force_encoding | -| string_flow.rb:161:5:161:5 | a | string_flow.rb:162:10:162:10 | a | -| string_flow.rb:161:9:161:18 | call to source | string_flow.rb:161:5:161:5 | a | -| string_flow.rb:162:10:162:10 | a | string_flow.rb:162:10:162:17 | call to freeze | -| string_flow.rb:166:5:166:5 | a | string_flow.rb:168:10:168:10 | a | -| string_flow.rb:166:5:166:5 | a | string_flow.rb:169:10:169:10 | a | -| string_flow.rb:166:5:166:5 | a | string_flow.rb:170:10:170:10 | a | -| string_flow.rb:166:5:166:5 | a | string_flow.rb:171:10:171:10 | a | -| string_flow.rb:166:9:166:18 | call to source | string_flow.rb:166:5:166:5 | a | -| string_flow.rb:167:5:167:5 | c | string_flow.rb:168:22:168:22 | c | -| string_flow.rb:167:5:167:5 | c | string_flow.rb:169:23:169:23 | c | -| string_flow.rb:167:9:167:18 | call to source | string_flow.rb:167:5:167:5 | c | -| string_flow.rb:168:10:168:10 | a | string_flow.rb:168:10:168:23 | call to gsub | -| string_flow.rb:168:22:168:22 | c | string_flow.rb:168:10:168:23 | call to gsub | -| string_flow.rb:169:10:169:10 | a | string_flow.rb:169:10:169:24 | call to gsub! | -| string_flow.rb:169:23:169:23 | c | string_flow.rb:169:10:169:24 | call to gsub! | -| string_flow.rb:170:10:170:10 | a | string_flow.rb:170:10:170:43 | call to gsub | -| string_flow.rb:170:32:170:41 | call to source | string_flow.rb:170:10:170:43 | call to gsub | -| string_flow.rb:171:10:171:10 | a | string_flow.rb:171:10:171:44 | call to gsub! | -| string_flow.rb:171:33:171:42 | call to source | string_flow.rb:171:10:171:44 | call to gsub! | -| string_flow.rb:175:5:175:5 | a | string_flow.rb:177:10:177:10 | a | -| string_flow.rb:175:5:175:5 | a | string_flow.rb:178:10:178:10 | a | -| string_flow.rb:175:5:175:5 | a | string_flow.rb:179:10:179:10 | a | -| string_flow.rb:175:5:175:5 | a | string_flow.rb:180:10:180:10 | a | -| string_flow.rb:175:9:175:18 | call to source | string_flow.rb:175:5:175:5 | a | -| string_flow.rb:176:5:176:5 | c | string_flow.rb:177:21:177:21 | c | -| string_flow.rb:176:5:176:5 | c | string_flow.rb:178:22:178:22 | c | -| string_flow.rb:176:9:176:18 | call to source | string_flow.rb:176:5:176:5 | c | -| string_flow.rb:177:10:177:10 | a | string_flow.rb:177:10:177:22 | call to sub | -| string_flow.rb:177:21:177:21 | c | string_flow.rb:177:10:177:22 | call to sub | -| string_flow.rb:178:10:178:10 | a | string_flow.rb:178:10:178:23 | call to sub! | -| string_flow.rb:178:22:178:22 | c | string_flow.rb:178:10:178:23 | call to sub! | -| string_flow.rb:179:10:179:10 | a | string_flow.rb:179:10:179:42 | call to sub | -| string_flow.rb:179:31:179:40 | call to source | string_flow.rb:179:10:179:42 | call to sub | -| string_flow.rb:180:10:180:10 | a | string_flow.rb:180:10:180:43 | call to sub! | -| string_flow.rb:180:32:180:41 | call to source | string_flow.rb:180:10:180:43 | call to sub! | -| string_flow.rb:191:5:191:5 | a | string_flow.rb:192:10:192:10 | a | -| string_flow.rb:191:9:191:18 | call to source | string_flow.rb:191:5:191:5 | a | -| string_flow.rb:192:10:192:10 | a | string_flow.rb:192:10:192:18 | call to inspect | -| string_flow.rb:196:5:196:5 | a | string_flow.rb:197:10:197:10 | a | -| string_flow.rb:196:5:196:5 | a | string_flow.rb:198:10:198:10 | a | -| string_flow.rb:196:5:196:5 | a | string_flow.rb:199:10:199:10 | a | -| string_flow.rb:196:5:196:5 | a | string_flow.rb:200:10:200:10 | a | -| string_flow.rb:196:5:196:5 | a | string_flow.rb:201:10:201:10 | a | -| string_flow.rb:196:5:196:5 | a | string_flow.rb:202:10:202:10 | a | -| string_flow.rb:196:9:196:18 | call to source | string_flow.rb:196:5:196:5 | a | -| string_flow.rb:197:10:197:10 | a | string_flow.rb:197:10:197:16 | call to strip | -| string_flow.rb:198:10:198:10 | a | string_flow.rb:198:10:198:17 | call to strip! | -| string_flow.rb:199:10:199:10 | a | string_flow.rb:199:10:199:17 | call to lstrip | -| string_flow.rb:200:10:200:10 | a | string_flow.rb:200:10:200:18 | call to lstrip! | -| string_flow.rb:201:10:201:10 | a | string_flow.rb:201:10:201:17 | call to rstrip | -| string_flow.rb:202:10:202:10 | a | string_flow.rb:202:10:202:18 | call to rstrip! | -| string_flow.rb:206:5:206:5 | a | string_flow.rb:207:10:207:10 | a | -| string_flow.rb:206:5:206:5 | a | string_flow.rb:208:10:208:10 | a | -| string_flow.rb:206:5:206:5 | a | string_flow.rb:209:10:209:10 | a | -| string_flow.rb:206:5:206:5 | a | string_flow.rb:210:10:210:10 | a | -| string_flow.rb:206:9:206:18 | call to source | string_flow.rb:206:5:206:5 | a | -| string_flow.rb:207:10:207:10 | a | string_flow.rb:207:10:207:15 | call to next | -| string_flow.rb:208:10:208:10 | a | string_flow.rb:208:10:208:16 | call to next! | -| string_flow.rb:209:10:209:10 | a | string_flow.rb:209:10:209:15 | call to succ | -| string_flow.rb:210:10:210:10 | a | string_flow.rb:210:10:210:16 | call to succ! | -| string_flow.rb:214:5:214:5 | a | string_flow.rb:215:9:215:9 | a | -| string_flow.rb:214:9:214:18 | call to source | string_flow.rb:214:5:214:5 | a | -| string_flow.rb:215:5:215:5 | b [element 0] | string_flow.rb:216:10:216:10 | b [element 0] | -| string_flow.rb:215:5:215:5 | b [element 1] | string_flow.rb:217:10:217:10 | b [element 1] | -| string_flow.rb:215:5:215:5 | b [element 2] | string_flow.rb:218:10:218:10 | b [element 2] | -| string_flow.rb:215:9:215:9 | a | string_flow.rb:215:9:215:24 | call to partition [element 0] | -| string_flow.rb:215:9:215:9 | a | string_flow.rb:215:9:215:24 | call to partition [element 1] | -| string_flow.rb:215:9:215:9 | a | string_flow.rb:215:9:215:24 | call to partition [element 2] | -| string_flow.rb:215:9:215:24 | call to partition [element 0] | string_flow.rb:215:5:215:5 | b [element 0] | -| string_flow.rb:215:9:215:24 | call to partition [element 1] | string_flow.rb:215:5:215:5 | b [element 1] | -| string_flow.rb:215:9:215:24 | call to partition [element 2] | string_flow.rb:215:5:215:5 | b [element 2] | -| string_flow.rb:216:10:216:10 | b [element 0] | string_flow.rb:216:10:216:13 | ...[...] | -| string_flow.rb:217:10:217:10 | b [element 1] | string_flow.rb:217:10:217:13 | ...[...] | -| string_flow.rb:218:10:218:10 | b [element 2] | string_flow.rb:218:10:218:13 | ...[...] | | string_flow.rb:223:5:223:5 | a | string_flow.rb:225:10:225:10 | a | -| string_flow.rb:223:5:223:5 | a | string_flow.rb:225:10:225:10 | a | -| string_flow.rb:223:9:223:18 | call to source | string_flow.rb:223:5:223:5 | a | | string_flow.rb:223:9:223:18 | call to source | string_flow.rb:223:5:223:5 | a | -| string_flow.rb:224:5:224:5 | b | string_flow.rb:225:20:225:20 | b | -| string_flow.rb:224:9:224:18 | call to source | string_flow.rb:224:5:224:5 | b | -| string_flow.rb:225:10:225:10 | [post] a | string_flow.rb:227:10:227:10 | a | | string_flow.rb:225:10:225:10 | [post] a | string_flow.rb:227:10:227:10 | a | | string_flow.rb:225:10:225:10 | a | string_flow.rb:225:10:225:10 | [post] a | -| string_flow.rb:225:10:225:10 | a | string_flow.rb:225:10:225:10 | [post] a | -| string_flow.rb:225:20:225:20 | b | string_flow.rb:225:10:225:10 | [post] a | -| string_flow.rb:225:20:225:20 | b | string_flow.rb:225:10:225:21 | call to replace | -| string_flow.rb:231:5:231:5 | a | string_flow.rb:232:10:232:10 | a | -| string_flow.rb:231:9:231:18 | call to source | string_flow.rb:231:5:231:5 | a | -| string_flow.rb:232:10:232:10 | a | string_flow.rb:232:10:232:18 | call to reverse | -| string_flow.rb:236:5:236:5 | a | string_flow.rb:237:9:237:9 | a | -| string_flow.rb:236:5:236:5 | a | string_flow.rb:238:9:238:9 | a | -| string_flow.rb:236:5:236:5 | a | string_flow.rb:240:9:240:9 | a | -| string_flow.rb:236:9:236:18 | call to source | string_flow.rb:236:5:236:5 | a | -| string_flow.rb:237:9:237:9 | a | string_flow.rb:237:24:237:24 | x | -| string_flow.rb:237:24:237:24 | x | string_flow.rb:237:35:237:35 | x | -| string_flow.rb:238:5:238:5 | b | string_flow.rb:239:10:239:10 | b | -| string_flow.rb:238:9:238:9 | a | string_flow.rb:238:9:238:37 | call to scan | -| string_flow.rb:238:9:238:9 | a | string_flow.rb:238:27:238:27 | y | -| string_flow.rb:238:9:238:37 | call to scan | string_flow.rb:238:5:238:5 | b | -| string_flow.rb:238:27:238:27 | y | string_flow.rb:238:35:238:35 | y | -| string_flow.rb:240:5:240:5 | b [element] | string_flow.rb:241:10:241:10 | b [element] | -| string_flow.rb:240:5:240:5 | b [element] | string_flow.rb:242:10:242:10 | b [element] | -| string_flow.rb:240:9:240:9 | a | string_flow.rb:240:9:240:19 | call to scan [element] | -| string_flow.rb:240:9:240:19 | call to scan [element] | string_flow.rb:240:5:240:5 | b [element] | -| string_flow.rb:241:10:241:10 | b [element] | string_flow.rb:241:10:241:13 | ...[...] | -| string_flow.rb:242:10:242:10 | b [element] | string_flow.rb:242:10:242:13 | ...[...] | -| string_flow.rb:246:5:246:5 | a | string_flow.rb:247:10:247:10 | a | -| string_flow.rb:246:5:246:5 | a | string_flow.rb:248:20:248:20 | a | -| string_flow.rb:246:5:246:5 | a | string_flow.rb:249:5:249:5 | a | -| string_flow.rb:246:5:246:5 | a | string_flow.rb:250:26:250:26 | a | -| string_flow.rb:246:5:246:5 | a | string_flow.rb:252:10:252:10 | a | -| string_flow.rb:246:5:246:5 | a | string_flow.rb:253:21:253:21 | a | -| string_flow.rb:246:9:246:18 | call to source | string_flow.rb:246:5:246:5 | a | -| string_flow.rb:247:10:247:10 | a | string_flow.rb:247:10:247:21 | call to scrub | -| string_flow.rb:248:20:248:20 | a | string_flow.rb:248:10:248:21 | call to scrub | -| string_flow.rb:249:5:249:5 | a | string_flow.rb:249:16:249:16 | x | -| string_flow.rb:249:16:249:16 | x | string_flow.rb:249:24:249:24 | x | -| string_flow.rb:250:26:250:26 | a | string_flow.rb:250:10:250:28 | call to scrub | -| string_flow.rb:252:10:252:10 | a | string_flow.rb:252:10:252:22 | call to scrub! | -| string_flow.rb:253:21:253:21 | a | string_flow.rb:253:10:253:22 | call to scrub! | -| string_flow.rb:255:5:255:5 | a | string_flow.rb:256:5:256:5 | a | -| string_flow.rb:255:5:255:5 | a | string_flow.rb:258:27:258:27 | a | -| string_flow.rb:255:9:255:18 | call to source | string_flow.rb:255:5:255:5 | a | -| string_flow.rb:256:5:256:5 | a | string_flow.rb:256:17:256:17 | x | -| string_flow.rb:256:17:256:17 | x | string_flow.rb:256:25:256:25 | x | -| string_flow.rb:258:27:258:27 | a | string_flow.rb:258:10:258:29 | call to scrub! | -| string_flow.rb:262:5:262:5 | a | string_flow.rb:263:10:263:10 | a | -| string_flow.rb:262:9:262:18 | call to source | string_flow.rb:262:5:262:5 | a | -| string_flow.rb:263:10:263:10 | a | string_flow.rb:263:10:263:22 | call to shellescape | -| string_flow.rb:267:5:267:5 | a | string_flow.rb:268:9:268:9 | a | -| string_flow.rb:267:9:267:18 | call to source | string_flow.rb:267:5:267:5 | a | -| string_flow.rb:268:5:268:5 | b [element] | string_flow.rb:269:10:269:10 | b [element] | -| string_flow.rb:268:9:268:9 | a | string_flow.rb:268:9:268:20 | call to shellsplit [element] | -| string_flow.rb:268:9:268:20 | call to shellsplit [element] | string_flow.rb:268:5:268:5 | b [element] | -| string_flow.rb:269:10:269:10 | b [element] | string_flow.rb:269:10:269:13 | ...[...] | -| string_flow.rb:273:5:273:5 | a | string_flow.rb:274:9:274:9 | a | -| string_flow.rb:273:5:273:5 | a | string_flow.rb:277:9:277:9 | a | -| string_flow.rb:273:9:273:18 | call to source | string_flow.rb:273:5:273:5 | a | -| string_flow.rb:274:5:274:5 | b | string_flow.rb:275:10:275:10 | b | -| string_flow.rb:274:9:274:9 | a | string_flow.rb:274:9:274:18 | call to slice | -| string_flow.rb:274:9:274:18 | call to slice | string_flow.rb:274:5:274:5 | b | -| string_flow.rb:275:10:275:10 | b | string_flow.rb:275:10:275:13 | ...[...] | -| string_flow.rb:277:5:277:5 | b | string_flow.rb:278:10:278:10 | b | -| string_flow.rb:277:9:277:9 | [post] a | string_flow.rb:280:9:280:9 | a | -| string_flow.rb:277:9:277:9 | [post] a | string_flow.rb:283:9:283:9 | a | -| string_flow.rb:277:9:277:9 | [post] a [element 1] | string_flow.rb:283:9:283:9 | a [element 1] | -| string_flow.rb:277:9:277:9 | [post] a [element 2] | string_flow.rb:283:9:283:9 | a [element 2] | -| string_flow.rb:277:9:277:9 | [post] a [element] | string_flow.rb:283:9:283:9 | a [element] | -| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a | -| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a [element 1] | -| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a [element 2] | -| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:9 | [post] a [element] | -| string_flow.rb:277:9:277:9 | a | string_flow.rb:277:9:277:19 | call to slice! | -| string_flow.rb:277:9:277:19 | call to slice! | string_flow.rb:277:5:277:5 | b | -| string_flow.rb:278:10:278:10 | b | string_flow.rb:278:10:278:13 | ...[...] | -| string_flow.rb:280:5:280:5 | b | string_flow.rb:281:10:281:10 | b | -| string_flow.rb:280:9:280:9 | a | string_flow.rb:280:9:280:20 | call to split | -| string_flow.rb:280:9:280:20 | call to split | string_flow.rb:280:5:280:5 | b | -| string_flow.rb:281:10:281:10 | b | string_flow.rb:281:10:281:13 | ...[...] | -| string_flow.rb:283:5:283:5 | b | string_flow.rb:284:10:284:10 | b | -| string_flow.rb:283:5:283:5 | b [element 0] | string_flow.rb:284:10:284:10 | b [element 0] | -| string_flow.rb:283:5:283:5 | b [element 1] | string_flow.rb:284:10:284:10 | b [element 1] | -| string_flow.rb:283:5:283:5 | b [element] | string_flow.rb:284:10:284:10 | b [element] | -| string_flow.rb:283:9:283:9 | a | string_flow.rb:283:9:283:14 | ...[...] | -| string_flow.rb:283:9:283:9 | a | string_flow.rb:283:9:283:14 | ...[...] [element 0] | -| string_flow.rb:283:9:283:9 | a | string_flow.rb:283:9:283:14 | ...[...] [element 1] | -| string_flow.rb:283:9:283:9 | a [element 1] | string_flow.rb:283:9:283:14 | ...[...] [element 0] | -| string_flow.rb:283:9:283:9 | a [element 2] | string_flow.rb:283:9:283:14 | ...[...] [element 1] | -| string_flow.rb:283:9:283:9 | a [element] | string_flow.rb:283:9:283:14 | ...[...] [element] | -| string_flow.rb:283:9:283:14 | ...[...] | string_flow.rb:283:5:283:5 | b | -| string_flow.rb:283:9:283:14 | ...[...] [element 0] | string_flow.rb:283:5:283:5 | b [element 0] | -| string_flow.rb:283:9:283:14 | ...[...] [element 1] | string_flow.rb:283:5:283:5 | b [element 1] | -| string_flow.rb:283:9:283:14 | ...[...] [element] | string_flow.rb:283:5:283:5 | b [element] | -| string_flow.rb:284:10:284:10 | b | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:284:10:284:10 | b [element 0] | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:284:10:284:10 | b [element 1] | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:284:10:284:10 | b [element] | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:288:5:288:5 | a | string_flow.rb:289:10:289:10 | a | -| string_flow.rb:288:5:288:5 | a | string_flow.rb:290:10:290:10 | a | -| string_flow.rb:288:5:288:5 | a | string_flow.rb:291:10:291:10 | a | -| string_flow.rb:288:5:288:5 | a | string_flow.rb:292:10:292:10 | a | -| string_flow.rb:288:9:288:18 | call to source | string_flow.rb:288:5:288:5 | a | -| string_flow.rb:289:10:289:10 | a | string_flow.rb:289:10:289:18 | call to squeeze | -| string_flow.rb:290:10:290:10 | a | string_flow.rb:290:10:290:23 | call to squeeze | -| string_flow.rb:291:10:291:10 | a | string_flow.rb:291:10:291:19 | call to squeeze! | -| string_flow.rb:292:10:292:10 | a | string_flow.rb:292:10:292:24 | call to squeeze! | -| string_flow.rb:296:5:296:5 | a | string_flow.rb:297:10:297:10 | a | -| string_flow.rb:296:5:296:5 | a | string_flow.rb:298:10:298:10 | a | -| string_flow.rb:296:9:296:18 | call to source | string_flow.rb:296:5:296:5 | a | -| string_flow.rb:297:10:297:10 | a | string_flow.rb:297:10:297:17 | call to to_str | -| string_flow.rb:298:10:298:10 | a | string_flow.rb:298:10:298:15 | call to to_s | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:303:10:303:10 | a | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:304:22:304:22 | a | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:305:10:305:10 | a | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:306:23:306:23 | a | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:307:10:307:10 | a | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:308:24:308:24 | a | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:309:10:309:10 | a | -| string_flow.rb:302:5:302:5 | a | string_flow.rb:310:25:310:25 | a | -| string_flow.rb:302:9:302:18 | call to source | string_flow.rb:302:5:302:5 | a | -| string_flow.rb:303:10:303:10 | a | string_flow.rb:303:10:303:23 | call to tr | -| string_flow.rb:304:22:304:22 | a | string_flow.rb:304:10:304:23 | call to tr | -| string_flow.rb:305:10:305:10 | a | string_flow.rb:305:10:305:24 | call to tr! | -| string_flow.rb:306:23:306:23 | a | string_flow.rb:306:10:306:24 | call to tr! | -| string_flow.rb:307:10:307:10 | a | string_flow.rb:307:10:307:25 | call to tr_s | -| string_flow.rb:308:24:308:24 | a | string_flow.rb:308:10:308:25 | call to tr_s | -| string_flow.rb:309:10:309:10 | a | string_flow.rb:309:10:309:26 | call to tr_s! | -| string_flow.rb:310:25:310:25 | a | string_flow.rb:310:10:310:26 | call to tr_s! | -| string_flow.rb:314:5:314:5 | a | string_flow.rb:315:5:315:5 | a | -| string_flow.rb:314:5:314:5 | a | string_flow.rb:316:5:316:5 | a | -| string_flow.rb:314:5:314:5 | a | string_flow.rb:317:14:317:14 | a | -| string_flow.rb:314:9:314:18 | call to source | string_flow.rb:314:5:314:5 | a | -| string_flow.rb:315:5:315:5 | a | string_flow.rb:315:20:315:20 | x | -| string_flow.rb:315:20:315:20 | x | string_flow.rb:315:28:315:28 | x | -| string_flow.rb:316:5:316:5 | a | string_flow.rb:316:26:316:26 | x | -| string_flow.rb:316:26:316:26 | x | string_flow.rb:316:34:316:34 | x | -| string_flow.rb:317:14:317:14 | a | string_flow.rb:317:20:317:20 | x | -| string_flow.rb:317:20:317:20 | x | string_flow.rb:317:28:317:28 | x | 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 | -| string_flow.rb:16:10:16:29 | ... % ... | semmle.label | ... % ... | -| string_flow.rb:16:28:16:28 | a | semmle.label | a | -| string_flow.rb:17:10:17:10 | a | semmle.label | a | -| string_flow.rb: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 | -| string_flow.rb:48:10:48:10 | a | semmle.label | a | -| string_flow.rb:48:10:48:26 | call to byteslice | semmle.label | call to byteslice | -| string_flow.rb:49:10:49:10 | a | semmle.label | a | -| string_flow.rb:49:10:49: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 | -| string_flow.rb:61:10:61:28 | call to center | semmle.label | call to center | -| string_flow.rb:61:27:61:27 | a | semmle.label | a | -| string_flow.rb:62:10:62:10 | a | semmle.label | a | -| string_flow.rb:62:10:62:20 | call to ljust | semmle.label | call to ljust | -| string_flow.rb:63:10:63:27 | call to ljust | semmle.label | call to ljust | -| string_flow.rb:63:26:63:26 | a | semmle.label | a | -| string_flow.rb:64:10:64:10 | a | semmle.label | a | -| string_flow.rb: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 | | string_flow.rb:84:5:84:5 | [post] a | semmle.label | [post] a | | string_flow.rb:84:5:84:5 | a | semmle.label | a | -| string_flow.rb:84:5:84:5 | a | semmle.label | a | | string_flow.rb:85:10:85:10 | a | semmle.label | a | -| string_flow.rb:85:10:85:10 | a | semmle.label | a | -| string_flow.rb:108:5:108:5 | a | semmle.label | a | -| string_flow.rb:108:9:108:18 | call to source | semmle.label | call to source | -| string_flow.rb:109:10:109:10 | [post] a | semmle.label | [post] a | -| string_flow.rb:109:10:109:10 | a | semmle.label | a | -| string_flow.rb:109:10:109:22 | call to delete | semmle.label | call to delete | -| string_flow.rb:110:10:110:10 | a | semmle.label | a | -| string_flow.rb:110:10:110: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 | -| string_flow.rb:117:10:117:10 | a | semmle.label | a | -| string_flow.rb:117:10:117:20 | call to downcase! | semmle.label | call to downcase! | -| string_flow.rb:118:10:118:10 | a | semmle.label | a | -| string_flow.rb:118:10:118:19 | call to swapcase | semmle.label | call to swapcase | -| string_flow.rb:119:10:119:10 | a | semmle.label | a | -| string_flow.rb:119:10:119:20 | call to swapcase! | semmle.label | call to swapcase! | -| string_flow.rb:120:10:120:10 | a | semmle.label | a | -| string_flow.rb:120:10:120: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 | -| string_flow.rb:150:10:150:10 | a | semmle.label | a | -| string_flow.rb:150:10:150:27 | call to encode! | semmle.label | call to encode! | -| string_flow.rb:151:10:151:10 | a | semmle.label | a | -| string_flow.rb:151:10:151: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 | -| string_flow.rb:168:22:168:22 | c | semmle.label | c | -| string_flow.rb:169:10:169:10 | a | semmle.label | a | -| string_flow.rb:169:10:169:24 | call to gsub! | semmle.label | call to gsub! | -| string_flow.rb:169:23:169:23 | c | semmle.label | c | -| string_flow.rb:170:10:170:10 | a | semmle.label | a | -| string_flow.rb:170:10:170:43 | call to gsub | semmle.label | call to gsub | -| string_flow.rb:170:32:170:41 | call to source | semmle.label | call to source | -| string_flow.rb:171:10:171:10 | a | semmle.label | a | -| string_flow.rb: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 | -| string_flow.rb:177:21:177:21 | c | semmle.label | c | -| string_flow.rb:178:10:178:10 | a | semmle.label | a | -| string_flow.rb:178:10:178:23 | call to sub! | semmle.label | call to sub! | -| string_flow.rb:178:22:178:22 | c | semmle.label | c | -| string_flow.rb:179:10:179:10 | a | semmle.label | a | -| string_flow.rb:179:10:179:42 | call to sub | semmle.label | call to sub | -| string_flow.rb:179:31:179:40 | call to source | semmle.label | call to source | -| string_flow.rb:180:10:180:10 | a | semmle.label | a | -| string_flow.rb: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 | -| string_flow.rb:198:10:198:10 | a | semmle.label | a | -| string_flow.rb:198:10:198:17 | call to strip! | semmle.label | call to strip! | -| string_flow.rb:199:10:199:10 | a | semmle.label | a | -| string_flow.rb:199:10:199:17 | call to lstrip | semmle.label | call to lstrip | -| string_flow.rb:200:10:200:10 | a | semmle.label | a | -| string_flow.rb:200:10:200:18 | call to lstrip! | semmle.label | call to lstrip! | -| string_flow.rb:201:10:201:10 | a | semmle.label | a | -| string_flow.rb:201:10:201: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 | -| string_flow.rb:208:10:208:10 | a | semmle.label | a | -| string_flow.rb:208:10:208:16 | call to next! | semmle.label | call to next! | -| string_flow.rb:209:10:209:10 | a | semmle.label | a | -| string_flow.rb:209:10:209: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] | -| string_flow.rb:215:9:215:24 | call to partition [element 2] | semmle.label | call to partition [element 2] | -| string_flow.rb:216:10:216:10 | b [element 0] | semmle.label | b [element 0] | -| string_flow.rb:216:10:216:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:217:10:217:10 | b [element 1] | semmle.label | b [element 1] | -| string_flow.rb:217:10:217: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 | -| string_flow.rb:225:10:225:10 | a | semmle.label | a | | string_flow.rb:225:10:225:10 | a | semmle.label | a | -| string_flow.rb:225:10:225:21 | call to replace | semmle.label | call to replace | -| string_flow.rb:225:20:225:20 | b | semmle.label | b | -| string_flow.rb: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:5 | a | semmle.label | a | -| string_flow.rb:246:9:246:18 | call to source | semmle.label | call to source | -| string_flow.rb:247:10:247:10 | a | semmle.label | a | -| string_flow.rb:247:10:247:21 | call to scrub | semmle.label | call to scrub | -| string_flow.rb:248:10:248:21 | call to scrub | semmle.label | call to scrub | -| string_flow.rb:248:20:248:20 | a | semmle.label | a | -| string_flow.rb:249:5:249:5 | a | semmle.label | a | -| string_flow.rb:249:16:249:16 | x | semmle.label | x | -| string_flow.rb:249:24:249:24 | x | semmle.label | x | -| string_flow.rb:250:10:250:28 | call to scrub | semmle.label | call to scrub | -| string_flow.rb:250:26:250:26 | a | semmle.label | a | -| string_flow.rb:252:10:252:10 | a | semmle.label | a | -| string_flow.rb:252:10:252:22 | call to scrub! | semmle.label | call to scrub! | -| string_flow.rb:253:10:253:22 | call to scrub! | semmle.label | call to scrub! | -| string_flow.rb:253:21:253:21 | a | semmle.label | a | -| string_flow.rb:255:5:255:5 | a | semmle.label | a | -| string_flow.rb:255:9:255:18 | call to source | semmle.label | call to source | -| string_flow.rb:256:5:256:5 | a | semmle.label | a | -| string_flow.rb:256:17:256:17 | x | semmle.label | x | -| string_flow.rb: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] | -| string_flow.rb:277:9:277:9 | [post] a [element] | semmle.label | [post] a [element] | -| string_flow.rb:277:9:277:9 | a | semmle.label | a | -| string_flow.rb:277:9:277:19 | call to slice! | semmle.label | call to slice! | -| string_flow.rb:278:10:278:10 | b | semmle.label | b | -| string_flow.rb:278:10:278:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:280:5:280:5 | b | semmle.label | b | -| string_flow.rb:280:9:280:9 | a | semmle.label | a | -| string_flow.rb:280:9:280:20 | call to split | semmle.label | call to split | -| string_flow.rb:281:10:281:10 | b | semmle.label | b | -| string_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:283:5:283:5 | b | semmle.label | b | -| string_flow.rb:283:5:283:5 | b [element 0] | semmle.label | b [element 0] | -| string_flow.rb:283:5:283:5 | b [element 1] | semmle.label | b [element 1] | -| string_flow.rb:283:5:283:5 | b [element] | semmle.label | b [element] | -| string_flow.rb:283:9:283:9 | a | semmle.label | a | -| string_flow.rb:283:9:283:9 | a [element 1] | semmle.label | a [element 1] | -| string_flow.rb:283:9:283:9 | a [element 2] | semmle.label | a [element 2] | -| string_flow.rb:283:9:283:9 | a [element] | semmle.label | a [element] | -| string_flow.rb:283:9:283:14 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:283:9:283:14 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | -| string_flow.rb:283:9:283:14 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| string_flow.rb:283:9:283:14 | ...[...] [element] | semmle.label | ...[...] [element] | -| string_flow.rb:284:10:284:10 | b | semmle.label | b | -| string_flow.rb:284:10:284:10 | b [element 0] | semmle.label | b [element 0] | -| string_flow.rb:284:10:284:10 | b [element 1] | semmle.label | b [element 1] | -| string_flow.rb:284:10:284:10 | b [element] | semmle.label | b [element] | -| string_flow.rb: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 | -| string_flow.rb:290:10:290:10 | a | semmle.label | a | -| string_flow.rb:290:10:290:23 | call to squeeze | semmle.label | call to squeeze | -| string_flow.rb:291:10:291:10 | a | semmle.label | a | -| string_flow.rb:291:10:291: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 | -| string_flow.rb:304:10:304:23 | call to tr | semmle.label | call to tr | -| string_flow.rb:304:22:304:22 | a | semmle.label | a | -| string_flow.rb:305:10:305:10 | a | semmle.label | a | -| string_flow.rb:305:10:305:24 | call to tr! | semmle.label | call to tr! | -| string_flow.rb:306:10:306:24 | call to tr! | semmle.label | call to tr! | -| string_flow.rb:306:23:306:23 | a | semmle.label | a | -| string_flow.rb:307:10:307:10 | a | semmle.label | a | -| string_flow.rb:307:10:307:25 | call to tr_s | semmle.label | call to tr_s | -| string_flow.rb:308:10:308:25 | call to tr_s | semmle.label | call to tr_s | -| string_flow.rb:308:24:308:24 | a | semmle.label | a | -| string_flow.rb:309:10:309:10 | a | semmle.label | a | -| string_flow.rb:309:10:309:26 | call to tr_s! | semmle.label | call to tr_s! | -| string_flow.rb:310:10:310:26 | call to tr_s! | semmle.label | call to tr_s! | -| string_flow.rb:310:25:310:25 | a | semmle.label | a | -| string_flow.rb:314:5:314:5 | a | semmle.label | a | -| string_flow.rb:314:9:314:18 | call to source | semmle.label | call to source | -| string_flow.rb:315:5:315:5 | a | semmle.label | a | -| string_flow.rb:315:20:315:20 | x | semmle.label | x | -| string_flow.rb:315:28:315:28 | x | semmle.label | x | -| string_flow.rb:316:5:316:5 | a | semmle.label | a | -| string_flow.rb:316:26:316:26 | x | semmle.label | x | -| string_flow.rb:316:34:316:34 | x | semmle.label | x | -| string_flow.rb:317:14:317:14 | a | semmle.label | a | -| string_flow.rb:317:20:317:20 | x | semmle.label | x | -| string_flow.rb:317:28:317:28 | x | semmle.label | x | subpaths #select | string_flow.rb:3:10:3:22 | call to new | string_flow.rb:2:9:2:18 | call to source | string_flow.rb:3:10:3:22 | call to new | $@ | string_flow.rb:2:9:2:18 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.ql b/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.ql index dfd6242a414fb..e02827eaf8d09 100644 --- a/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.ql @@ -5,7 +5,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import DefaultFlowTest -import PathGraph +import ValueFlow::PathGraph from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) diff --git a/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.ql b/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.ql index 1e4e66c558433..d6e9c9e6f538e 100644 --- a/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.ql +++ b/ruby/ql/test/library-tests/frameworks/action_controller/params-flow.ql @@ -4,7 +4,7 @@ import ruby import TestUtilities.InlineFlowTest -import PathGraph +import TaintFlow::PathGraph import codeql.ruby.frameworks.Rails module ParamsTaintFlowConfig implements DataFlow::ConfigSig { diff --git a/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.ql b/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.ql index 1e4e66c558433..d6e9c9e6f538e 100644 --- a/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.ql +++ b/ruby/ql/test/library-tests/frameworks/action_mailer/params-flow.ql @@ -4,7 +4,7 @@ import ruby import TestUtilities.InlineFlowTest -import PathGraph +import TaintFlow::PathGraph import codeql.ruby.frameworks.Rails module ParamsTaintFlowConfig implements DataFlow::ConfigSig { 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 756e41c448d9d..b4178c9bac50e 100644 --- a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected +++ b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected @@ -1,1292 +1,433 @@ testFailures | hash_extensions.rb:126:10:126:19 | call to sole | Unexpected result: hasValueFlow=b | edges -| active_support.rb:10:5:10:5 | x | active_support.rb:11:10:11:10 | x | -| active_support.rb:10:9:10:18 | call to source | active_support.rb:10:5:10:5 | x | -| active_support.rb:11:10:11:10 | x | active_support.rb:11:10:11:19 | call to at | -| active_support.rb:15:5:15:5 | x | active_support.rb:16:10:16:10 | x | -| active_support.rb:15:9:15:18 | call to source | active_support.rb:15:5:15:5 | x | -| active_support.rb:16:10:16:10 | x | active_support.rb:16:10:16:19 | call to camelize | -| active_support.rb:20:5:20:5 | x | active_support.rb:21:10:21:10 | x | -| active_support.rb:20:9:20:18 | call to source | active_support.rb:20:5:20:5 | x | -| active_support.rb:21:10:21:10 | x | active_support.rb:21:10:21:20 | call to camelcase | -| active_support.rb:25:5:25:5 | x | active_support.rb:26:10:26:10 | x | -| active_support.rb:25:9:25:18 | call to source | active_support.rb:25:5:25:5 | x | -| active_support.rb:26:10:26:10 | x | active_support.rb:26:10:26:19 | call to classify | -| active_support.rb:30:5:30:5 | x | active_support.rb:31:10:31:10 | x | -| active_support.rb:30:9:30:18 | call to source | active_support.rb:30:5:30:5 | x | -| active_support.rb:31:10:31:10 | x | active_support.rb:31:10:31:20 | call to dasherize | -| active_support.rb:35:5:35:5 | x | active_support.rb:36:10:36:10 | x | -| active_support.rb:35:9:35:18 | call to source | active_support.rb:35:5:35:5 | x | -| active_support.rb:36:10:36:10 | x | active_support.rb:36:10:36:24 | call to deconstantize | -| active_support.rb:40:5:40:5 | x | active_support.rb:41:10:41:10 | x | -| active_support.rb:40:9:40:18 | call to source | active_support.rb:40:5:40:5 | x | -| active_support.rb:41:10:41:10 | x | active_support.rb:41:10:41:21 | call to demodulize | -| active_support.rb:45:5:45:5 | x | active_support.rb:46:10:46:10 | x | -| active_support.rb:45:9:45:18 | call to source | active_support.rb:45:5:45:5 | x | -| active_support.rb:46:10:46:10 | x | active_support.rb:46:10:46:19 | call to first | -| active_support.rb:50:5:50:5 | x | active_support.rb:51:10:51:10 | x | -| active_support.rb:50:9:50:18 | call to source | active_support.rb:50:5:50:5 | x | -| active_support.rb:51:10:51:10 | x | active_support.rb:51:10:51:22 | call to foreign_key | -| active_support.rb:55:5:55:5 | x | active_support.rb:56:10:56:10 | x | -| active_support.rb:55:9:55:18 | call to source | active_support.rb:55:5:55:5 | x | -| active_support.rb:56:10:56:10 | x | active_support.rb:56:10:56:18 | call to from | -| active_support.rb:60:5:60:5 | x | active_support.rb:61:10:61:10 | x | -| active_support.rb:60:9:60:18 | call to source | active_support.rb:60:5:60:5 | x | -| active_support.rb:61:10:61:10 | x | active_support.rb:61:10:61:20 | call to html_safe | -| active_support.rb:65:5:65:5 | x | active_support.rb:66:10:66:10 | x | -| active_support.rb:65:9:65:18 | call to source | active_support.rb:65:5:65:5 | x | -| active_support.rb:66:10:66:10 | x | active_support.rb:66:10:66:19 | call to humanize | -| active_support.rb:70:5:70:5 | x | active_support.rb:71:10:71:10 | x | -| active_support.rb:70:9:70:18 | call to source | active_support.rb:70:5:70:5 | x | -| active_support.rb:71:10:71:10 | x | active_support.rb:71:10:71:20 | call to indent | -| active_support.rb:75:5:75:5 | x | active_support.rb:76:10:76:10 | x | -| active_support.rb:75:9:75:18 | call to source | active_support.rb:75:5:75:5 | x | -| active_support.rb:76:10:76:10 | x | active_support.rb:76:10:76:21 | call to indent! | -| active_support.rb:80:5:80:5 | x | active_support.rb:81:10:81:10 | x | -| active_support.rb:80:9:80:18 | call to source | active_support.rb:80:5:80:5 | x | -| active_support.rb:81:10:81:10 | x | active_support.rb:81:10:81:18 | call to inquiry | -| active_support.rb:85:5:85:5 | x | active_support.rb:86:10:86:10 | x | -| active_support.rb:85:9:85:18 | call to source | active_support.rb:85:5:85:5 | x | -| active_support.rb:86:10:86:10 | x | active_support.rb:86:10:86:18 | call to last | -| active_support.rb:90:5:90:5 | x | active_support.rb:91:10:91:10 | x | -| active_support.rb:90:9:90:18 | call to source | active_support.rb:90:5:90:5 | x | -| active_support.rb:91:10:91:10 | x | active_support.rb:91:10:91:19 | call to mb_chars | -| active_support.rb:95:5:95:5 | x | active_support.rb:96:10:96:10 | x | -| active_support.rb:95:9:95:18 | call to source | active_support.rb:95:5:95:5 | x | -| active_support.rb:96:10:96:10 | x | active_support.rb:96:10:96:23 | call to parameterize | -| active_support.rb:100:5:100:5 | x | active_support.rb:101:10:101:10 | x | -| active_support.rb:100:9:100:18 | call to source | active_support.rb:100:5:100:5 | x | -| active_support.rb:101:10:101:10 | x | active_support.rb:101:10:101:20 | call to pluralize | -| active_support.rb:105:5:105:5 | x | active_support.rb:106:10:106:10 | x | -| active_support.rb:105:9:105:18 | call to source | active_support.rb:105:5:105:5 | x | -| active_support.rb:106:10:106:10 | x | active_support.rb:106:10:106:24 | call to remove | -| active_support.rb:110:5:110:5 | x | active_support.rb:111:10:111:10 | x | -| active_support.rb:110:9:110:18 | call to source | active_support.rb:110:5:110:5 | x | -| active_support.rb:111:10:111:10 | x | active_support.rb:111:10:111:25 | call to remove! | -| active_support.rb:115:5:115:5 | x | active_support.rb:116:10:116:10 | x | -| active_support.rb:115:9:115:18 | call to source | active_support.rb:115:5:115:5 | x | -| active_support.rb:116:10:116:10 | x | active_support.rb:116:10:116:22 | call to singularize | -| active_support.rb:120:5:120:5 | x | active_support.rb:121:10:121:10 | x | -| active_support.rb:120:9:120:18 | call to source | active_support.rb:120:5:120:5 | x | -| active_support.rb:121:10:121:10 | x | active_support.rb:121:10:121:17 | call to squish | -| active_support.rb:125:5:125:5 | x | active_support.rb:126:10:126:10 | x | -| active_support.rb:125:9:125:18 | call to source | active_support.rb:125:5:125:5 | x | -| active_support.rb:126:10:126:10 | x | active_support.rb:126:10:126:18 | call to squish! | -| active_support.rb:130:5:130:5 | x | active_support.rb:131:10:131:10 | x | -| active_support.rb:130:9:130:18 | call to source | active_support.rb:130:5:130:5 | x | -| active_support.rb:131:10:131:10 | x | active_support.rb:131:10:131:24 | call to strip_heredoc | -| active_support.rb:135:5:135:5 | x | active_support.rb:136:10:136:10 | x | -| active_support.rb:135:9:135:18 | call to source | active_support.rb:135:5:135:5 | x | -| active_support.rb:136:10:136:10 | x | active_support.rb:136:10:136:19 | call to tableize | -| active_support.rb:140:5:140:5 | x | active_support.rb:141:10:141:10 | x | -| active_support.rb:140:9:140:18 | call to source | active_support.rb:140:5:140:5 | x | -| active_support.rb:141:10:141:10 | x | active_support.rb:141:10:141:20 | call to titlecase | -| active_support.rb:145:5:145:5 | x | active_support.rb:146:10:146:10 | x | -| active_support.rb:145:9:145:18 | call to source | active_support.rb:145:5:145:5 | x | -| active_support.rb:146:10:146:10 | x | active_support.rb:146:10:146:19 | call to titleize | -| active_support.rb:150:5:150:5 | x | active_support.rb:151:10:151:10 | x | -| active_support.rb:150:9:150:18 | call to source | active_support.rb:150:5:150:5 | x | -| active_support.rb:151:10:151:10 | x | active_support.rb:151:10:151:16 | call to to | -| active_support.rb:155:5:155:5 | x | active_support.rb:156:10:156:10 | x | -| active_support.rb:155:9:155:18 | call to source | active_support.rb:155:5:155:5 | x | -| active_support.rb:156:10:156:10 | x | active_support.rb:156:10:156:22 | call to truncate | -| active_support.rb:160:5:160:5 | x | active_support.rb:161:10:161:10 | x | -| active_support.rb:160:9:160:18 | call to source | active_support.rb:160:5:160:5 | x | -| active_support.rb:161:10:161:10 | x | active_support.rb:161:10:161:28 | call to truncate_bytes | -| active_support.rb:165:5:165:5 | x | active_support.rb:166:10:166:10 | x | -| active_support.rb:165:9:165:18 | call to source | active_support.rb:165:5:165:5 | x | -| active_support.rb:166:10:166:10 | x | active_support.rb:166:10:166:28 | call to truncate_words | -| active_support.rb:170:5:170:5 | x | active_support.rb:171:10:171:10 | x | -| active_support.rb:170:9:170:18 | call to source | active_support.rb:170:5:170:5 | x | -| active_support.rb:171:10:171:10 | x | active_support.rb:171:10:171:21 | call to underscore | -| active_support.rb:175:5:175:5 | x | active_support.rb:176:10:176:10 | x | -| active_support.rb:175:9:175:18 | call to source | active_support.rb:175:5:175:5 | x | -| active_support.rb:176:10:176:10 | x | active_support.rb:176:10:176:23 | call to upcase_first | | active_support.rb:180:5:180:5 | x [element 0] | active_support.rb:181:9:181:9 | x [element 0] | -| active_support.rb:180:5:180:5 | x [element 0] | active_support.rb:181:9:181:9 | x [element 0] | -| active_support.rb:180:10:180:17 | call to source | active_support.rb:180:5:180:5 | x [element 0] | | active_support.rb:180:10:180:17 | call to source | active_support.rb:180:5:180:5 | x [element 0] | | active_support.rb:181:5:181:5 | y [element] | active_support.rb:182:10:182:10 | y [element] | -| active_support.rb:181:5:181:5 | y [element] | active_support.rb:182:10:182:10 | y [element] | -| active_support.rb:181:9:181:9 | x [element 0] | active_support.rb:181:9:181:23 | call to compact_blank [element] | | active_support.rb:181:9:181:9 | x [element 0] | active_support.rb:181:9:181:23 | call to compact_blank [element] | | active_support.rb:181:9:181:23 | call to compact_blank [element] | active_support.rb:181:5:181:5 | y [element] | -| active_support.rb:181:9:181:23 | call to compact_blank [element] | active_support.rb:181:5:181:5 | y [element] | -| active_support.rb:182:10:182:10 | y [element] | active_support.rb:182:10:182:13 | ...[...] | | active_support.rb:182:10:182:10 | y [element] | active_support.rb:182:10:182:13 | ...[...] | | active_support.rb:186:5:186:5 | x [element 0] | active_support.rb:187:9:187:9 | x [element 0] | -| active_support.rb:186:5:186:5 | x [element 0] | active_support.rb:187:9:187:9 | x [element 0] | | active_support.rb:186:10:186:18 | call to source | active_support.rb:186:5:186:5 | x [element 0] | -| active_support.rb:186:10:186:18 | call to source | active_support.rb:186:5:186:5 | x [element 0] | -| active_support.rb:187:5:187:5 | y [element] | active_support.rb:188:10:188:10 | y [element] | | active_support.rb:187:5:187:5 | y [element] | active_support.rb:188:10:188:10 | y [element] | | active_support.rb:187:9:187:9 | x [element 0] | active_support.rb:187:9:187:21 | call to excluding [element] | -| active_support.rb:187:9:187:9 | x [element 0] | active_support.rb:187:9:187:21 | call to excluding [element] | -| active_support.rb:187:9:187:21 | call to excluding [element] | active_support.rb:187:5:187:5 | y [element] | | active_support.rb:187:9:187:21 | call to excluding [element] | active_support.rb:187:5:187:5 | y [element] | | active_support.rb:188:10:188:10 | y [element] | active_support.rb:188:10:188:13 | ...[...] | -| active_support.rb:188:10:188:10 | y [element] | active_support.rb:188:10:188:13 | ...[...] | -| active_support.rb:192:5:192:5 | x [element 0] | active_support.rb:193:9:193:9 | x [element 0] | | active_support.rb:192:5:192:5 | x [element 0] | active_support.rb:193:9:193:9 | x [element 0] | | active_support.rb:192:10:192:18 | call to source | active_support.rb:192:5:192:5 | x [element 0] | -| active_support.rb:192:10:192:18 | call to source | active_support.rb:192:5:192:5 | x [element 0] | | active_support.rb:193:5:193:5 | y [element] | active_support.rb:194:10:194:10 | y [element] | -| active_support.rb:193:5:193:5 | y [element] | active_support.rb:194:10:194:10 | y [element] | -| active_support.rb:193:9:193:9 | x [element 0] | active_support.rb:193:9:193:19 | call to without [element] | | active_support.rb:193:9:193:9 | x [element 0] | active_support.rb:193:9:193:19 | call to without [element] | | active_support.rb:193:9:193:19 | call to without [element] | active_support.rb:193:5:193:5 | y [element] | -| active_support.rb:193:9:193:19 | call to without [element] | active_support.rb:193:5:193:5 | y [element] | -| active_support.rb:194:10:194:10 | y [element] | active_support.rb:194:10:194:13 | ...[...] | | active_support.rb:194:10:194:10 | y [element] | active_support.rb:194:10:194:13 | ...[...] | | active_support.rb:198:5:198:5 | x [element 0] | active_support.rb:199:9:199:9 | x [element 0] | -| active_support.rb:198:5:198:5 | x [element 0] | active_support.rb:199:9:199:9 | x [element 0] | -| active_support.rb:198:10:198:18 | call to source | active_support.rb:198:5:198:5 | x [element 0] | | active_support.rb:198:10:198:18 | call to source | active_support.rb:198:5:198:5 | x [element 0] | | active_support.rb:199:5:199:5 | y [element] | active_support.rb:200:10:200:10 | y [element] | -| active_support.rb:199:5:199:5 | y [element] | active_support.rb:200:10:200:10 | y [element] | | active_support.rb:199:9:199:9 | x [element 0] | active_support.rb:199:9:199:37 | call to in_order_of [element] | -| active_support.rb:199:9:199:9 | x [element 0] | active_support.rb:199:9:199:37 | call to in_order_of [element] | -| active_support.rb:199:9:199:37 | call to in_order_of [element] | active_support.rb:199:5:199:5 | y [element] | | active_support.rb:199:9:199:37 | call to in_order_of [element] | active_support.rb:199:5:199:5 | y [element] | | active_support.rb:200:10:200:10 | y [element] | active_support.rb:200:10:200:13 | ...[...] | -| active_support.rb:200:10:200:10 | y [element] | active_support.rb:200:10:200:13 | ...[...] | | active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:205:9:205:9 | a [element 0] | -| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:205:9:205:9 | a [element 0] | -| active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:206:10:206:10 | a [element 0] | | active_support.rb:204:5:204:5 | a [element 0] | active_support.rb:206:10:206:10 | a [element 0] | | active_support.rb:204:10:204:18 | call to source | active_support.rb:204:5:204:5 | a [element 0] | -| active_support.rb:204:10:204:18 | call to source | active_support.rb:204:5:204:5 | a [element 0] | | active_support.rb:205:5:205:5 | b [element 0] | active_support.rb:208:10:208:10 | b [element 0] | -| active_support.rb:205:5:205:5 | b [element 0] | active_support.rb:208:10:208:10 | b [element 0] | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:208:10:208:10 | b [element] | | active_support.rb:205:5:205:5 | b [element] | active_support.rb:208:10:208:10 | b [element] | | active_support.rb:205:5:205:5 | b [element] | active_support.rb:209:10:209:10 | b [element] | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:209:10:209:10 | b [element] | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:210:10:210:10 | b [element] | | active_support.rb:205:5:205:5 | b [element] | active_support.rb:210:10:210:10 | b [element] | | active_support.rb:205:5:205:5 | b [element] | active_support.rb:211:10:211:10 | b [element] | -| active_support.rb:205:5:205:5 | b [element] | active_support.rb:211:10:211:10 | b [element] | -| active_support.rb:205:9:205:9 | a [element 0] | active_support.rb:205:9:205:41 | call to including [element 0] | | active_support.rb:205:9:205:9 | a [element 0] | active_support.rb:205:9:205:41 | call to including [element 0] | | active_support.rb:205:9:205:41 | call to including [element 0] | active_support.rb:205:5:205:5 | b [element 0] | -| active_support.rb:205:9:205:41 | call to including [element 0] | active_support.rb:205:5:205:5 | b [element 0] | | active_support.rb:205:9:205:41 | call to including [element] | active_support.rb:205:5:205:5 | b [element] | -| active_support.rb:205:9:205:41 | call to including [element] | active_support.rb:205:5:205:5 | b [element] | -| active_support.rb:205:21:205:29 | call to source | active_support.rb:205:9:205:41 | call to including [element] | | active_support.rb:205:21:205:29 | call to source | active_support.rb:205:9:205:41 | call to including [element] | | active_support.rb:205:32:205:40 | call to source | active_support.rb:205:9:205:41 | call to including [element] | -| active_support.rb:205:32:205:40 | call to source | active_support.rb:205:9:205:41 | call to including [element] | -| active_support.rb:206:10:206:10 | a [element 0] | active_support.rb:206:10:206:13 | ...[...] | | active_support.rb:206:10:206:10 | a [element 0] | active_support.rb:206:10:206:13 | ...[...] | | active_support.rb:208:10:208:10 | b [element 0] | active_support.rb:208:10:208:13 | ...[...] | -| active_support.rb:208:10:208:10 | b [element 0] | active_support.rb:208:10:208:13 | ...[...] | -| active_support.rb:208:10:208:10 | b [element] | active_support.rb:208:10:208:13 | ...[...] | | active_support.rb:208:10:208:10 | b [element] | active_support.rb:208:10:208:13 | ...[...] | | active_support.rb:209:10:209:10 | b [element] | active_support.rb:209:10:209:13 | ...[...] | -| active_support.rb:209:10:209:10 | b [element] | active_support.rb:209:10:209:13 | ...[...] | | active_support.rb:210:10:210:10 | b [element] | active_support.rb:210:10:210:13 | ...[...] | -| active_support.rb:210:10:210:10 | b [element] | active_support.rb:210:10:210:13 | ...[...] | -| active_support.rb:211:10:211:10 | b [element] | active_support.rb:211:10:211:13 | ...[...] | | active_support.rb:211:10:211:10 | b [element] | active_support.rb:211:10:211:13 | ...[...] | -| active_support.rb:215:3:215:3 | x | active_support.rb:216:34:216:34 | x | -| active_support.rb:215:7:215:16 | call to source | active_support.rb:215:3:215:3 | x | -| active_support.rb:216:3:216:3 | y | active_support.rb:217:8:217:8 | y | -| active_support.rb:216:7:216:35 | call to new | active_support.rb:216:3:216:3 | y | -| active_support.rb:216:34:216:34 | x | active_support.rb:216:7:216:35 | call to new | -| active_support.rb:222:3:222:3 | b | active_support.rb:223:21:223:21 | b | -| active_support.rb:222:7:222:16 | call to source | active_support.rb:222:3:222:3 | b | -| active_support.rb:223:3:223:3 | y | active_support.rb:224:8:224:8 | y | -| active_support.rb:223:7:223:22 | call to safe_concat | active_support.rb:223:3:223:3 | y | -| active_support.rb:223:21:223:21 | b | active_support.rb:223:7:223:22 | call to safe_concat | -| active_support.rb:229:3:229:3 | b | active_support.rb:230:17:230:17 | b | -| active_support.rb:229:7:229:16 | call to source | active_support.rb:229:3:229:3 | b | -| active_support.rb:230:3:230:3 | [post] x | active_support.rb:231:8:231:8 | x | -| active_support.rb:230:17:230:17 | b | active_support.rb:230:3:230:3 | [post] x | -| active_support.rb:235:3:235:3 | a | active_support.rb:237:34:237:34 | a | -| active_support.rb:235:7:235:16 | call to source | active_support.rb:235:3:235:3 | a | -| active_support.rb:237:3:237:3 | x | active_support.rb:238:7:238:7 | x | -| active_support.rb:237:7:237:35 | call to new | active_support.rb:237:3:237:3 | x | -| active_support.rb:237:34:237:34 | a | active_support.rb:237:7:237:35 | call to new | -| active_support.rb:238:3:238:3 | y | active_support.rb:239:8:239:8 | y | -| active_support.rb:238:7:238:7 | x | active_support.rb:238:7:238:17 | call to concat | -| active_support.rb:238:7:238:17 | call to concat | active_support.rb:238:3:238:3 | y | -| active_support.rb:243:3:243:3 | a | active_support.rb:245:34:245:34 | a | -| active_support.rb:243:7:243:16 | call to source | active_support.rb:243:3:243:3 | a | -| active_support.rb:245:3:245:3 | x | active_support.rb:246:7:246:7 | x | -| active_support.rb:245:7:245:35 | call to new | active_support.rb:245:3:245:3 | x | -| active_support.rb:245:34:245:34 | a | active_support.rb:245:7:245:35 | call to new | -| active_support.rb:246:3:246:3 | y | active_support.rb:247:8:247:8 | y | -| active_support.rb:246:7:246:7 | x | active_support.rb:246:7:246:20 | call to insert | -| active_support.rb:246:7:246:20 | call to insert | active_support.rb:246:3:246:3 | y | -| active_support.rb:251:3:251:3 | a | active_support.rb:253:34:253:34 | a | -| active_support.rb:251:7:251:16 | call to source | active_support.rb:251:3:251:3 | a | -| active_support.rb:253:3:253:3 | x | active_support.rb:254:7:254:7 | x | -| active_support.rb:253:7:253:35 | call to new | active_support.rb:253:3:253:3 | x | -| active_support.rb:253:34:253:34 | a | active_support.rb:253:7:253:35 | call to new | -| active_support.rb:254:3:254:3 | y | active_support.rb:255:8:255:8 | y | -| active_support.rb:254:7:254:7 | x | active_support.rb:254:7:254:18 | call to prepend | -| active_support.rb:254:7:254:18 | call to prepend | active_support.rb:254:3:254:3 | y | -| active_support.rb:259:3:259:3 | a | active_support.rb:260:34:260:34 | a | -| active_support.rb:259:7:259:16 | call to source | active_support.rb:259:3:259:3 | a | -| active_support.rb:260:3:260:3 | x | active_support.rb:261:7:261:7 | x | -| active_support.rb:260:7:260:35 | call to new | active_support.rb:260:3:260:3 | x | -| active_support.rb:260:34:260:34 | a | active_support.rb:260:7:260:35 | call to new | -| active_support.rb:261:3:261:3 | y | active_support.rb:262:8:262:8 | y | -| active_support.rb:261:7:261:7 | x | active_support.rb:261:7:261:12 | call to to_s | -| active_support.rb:261:7:261:12 | call to to_s | active_support.rb:261:3:261:3 | y | -| active_support.rb:266:3:266:3 | a | active_support.rb:267:34:267:34 | a | -| active_support.rb:266:7:266:16 | call to source | active_support.rb:266:3:266:3 | a | -| active_support.rb:267:3:267:3 | x | active_support.rb:268:7:268:7 | x | -| active_support.rb:267:7:267:35 | call to new | active_support.rb:267:3:267:3 | x | -| active_support.rb:267:34:267:34 | a | active_support.rb:267:7:267:35 | call to new | -| active_support.rb:268:3:268:3 | y | active_support.rb:269:8:269:8 | y | -| active_support.rb:268:7:268:7 | x | active_support.rb:268:7:268:16 | call to to_param | -| active_support.rb:268:7:268:16 | call to to_param | active_support.rb:268:3:268:3 | y | -| active_support.rb:273:3:273:3 | a | active_support.rb:274:20:274:20 | a | -| active_support.rb:273:7:273:16 | call to source | active_support.rb:273:3:273:3 | a | -| active_support.rb:274:3:274:3 | x | active_support.rb:275:7:275:7 | x | -| active_support.rb:274:7:274:21 | call to new | active_support.rb:274:3:274:3 | x | -| active_support.rb:274:20:274:20 | a | active_support.rb:274:7:274:21 | call to new | -| active_support.rb:275:3:275:3 | y | active_support.rb:276:8:276:8 | y | -| active_support.rb:275:3:275:3 | y | active_support.rb:277:7:277:7 | y | -| active_support.rb:275:7:275:7 | x | active_support.rb:275:7:275:17 | call to existence | -| active_support.rb:275:7:275:17 | call to existence | active_support.rb:275:3:275:3 | y | -| active_support.rb:277:3:277:3 | z | active_support.rb:278:8:278:8 | z | -| active_support.rb:277:7:277:7 | y | active_support.rb:277:7:277:17 | call to existence | -| active_support.rb:277:7:277:17 | call to existence | active_support.rb:277:3:277:3 | z | | active_support.rb:282:3:282:3 | x | active_support.rb:283:8:283:8 | x | -| active_support.rb:282:3:282:3 | x | active_support.rb:283:8:283:8 | x | -| active_support.rb:282:7:282:16 | call to source | active_support.rb:282:3:282:3 | x | | active_support.rb:282:7:282:16 | call to source | active_support.rb:282:3:282:3 | x | | active_support.rb:283:8:283:8 | x | active_support.rb:283:8:283:17 | call to presence | -| active_support.rb:283:8:283:8 | x | active_support.rb:283:8:283:17 | call to presence | -| active_support.rb:285:3:285:3 | y | active_support.rb:286:8:286:8 | y | | active_support.rb:285:3:285:3 | y | active_support.rb:286:8:286:8 | y | | active_support.rb:285:7:285:16 | call to source | active_support.rb:285:3:285:3 | y | -| active_support.rb:285:7:285:16 | call to source | active_support.rb:285:3:285:3 | y | | active_support.rb:286:8:286:8 | y | active_support.rb:286:8:286:17 | call to presence | -| active_support.rb:286:8:286:8 | y | active_support.rb:286:8:286:17 | call to presence | -| active_support.rb:290:3:290:3 | x | active_support.rb:291:8:291:8 | x | | active_support.rb:290:3:290:3 | x | active_support.rb:291:8:291:8 | x | | active_support.rb:290:7:290:16 | call to source | active_support.rb:290:3:290:3 | x | -| active_support.rb:290:7:290:16 | call to source | active_support.rb:290:3:290:3 | x | | active_support.rb:291:8:291:8 | x | active_support.rb:291:8:291:17 | call to deep_dup | -| active_support.rb:291:8:291:8 | x | active_support.rb:291:8:291:17 | call to deep_dup | -| active_support.rb:303:3:303:3 | a | active_support.rb:304:19:304:19 | a | -| active_support.rb:303:7:303:16 | call to source | active_support.rb:303:3:303:3 | a | -| active_support.rb:304:3:304:3 | b | active_support.rb:305:8:305:8 | b | -| active_support.rb:304:7:304:19 | call to json_escape | active_support.rb:304:3:304:3 | b | -| active_support.rb:304:19:304:19 | a | active_support.rb:304:7:304:19 | call to json_escape | -| active_support.rb:309:5:309:5 | x | active_support.rb:310:37:310:37 | x | -| active_support.rb:309:9:309:18 | call to source | active_support.rb:309:5:309:5 | x | -| active_support.rb:310:37:310:37 | x | active_support.rb:310:10:310:38 | call to encode | -| active_support.rb:314:5:314:5 | x | active_support.rb:315:37:315:37 | x | -| active_support.rb:314:9:314:18 | call to source | active_support.rb:314:5:314:5 | x | -| active_support.rb:315:37:315:37 | x | active_support.rb:315:10:315:38 | call to decode | -| active_support.rb:319:5:319:5 | x | active_support.rb:320:35:320:35 | x | -| active_support.rb:319:9:319:18 | call to source | active_support.rb:319:5:319:5 | x | -| active_support.rb:320:35:320:35 | x | active_support.rb:320:10:320:36 | call to dump | -| active_support.rb:324:5:324:5 | x | active_support.rb:325:35:325:35 | x | -| active_support.rb:324:9:324:18 | call to source | active_support.rb:324:5:324:5 | x | -| active_support.rb:325:35:325:35 | x | active_support.rb:325:10:325:36 | call to load | -| active_support.rb:329:5:329:5 | x | active_support.rb:330:10:330:10 | x | -| active_support.rb:329:5:329:5 | x | active_support.rb:331:10:331:10 | x | -| active_support.rb:329:9:329:18 | call to source | active_support.rb:329:5:329:5 | x | -| active_support.rb:330:5:330:5 | y [element 0] | active_support.rb:332:10:332:10 | y [element 0] | -| active_support.rb:330:10:330:10 | x | active_support.rb:330:5:330:5 | y [element 0] | -| active_support.rb:331:10:331:10 | x | active_support.rb:331:10:331:18 | call to to_json | -| active_support.rb:332:10:332:10 | y [element 0] | active_support.rb:332:10:332:18 | call to to_json | -| hash_extensions.rb:2:5:2:5 | h [element :a] | hash_extensions.rb:3:9:3:9 | h [element :a] | | hash_extensions.rb:2:5:2:5 | h [element :a] | hash_extensions.rb:3:9:3:9 | h [element :a] | | hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:5:2:5 | h [element :a] | -| hash_extensions.rb:2:14:2:24 | call to source | hash_extensions.rb:2:5:2:5 | h [element :a] | | hash_extensions.rb:3:5:3:5 | x [element] | hash_extensions.rb:4:10:4:10 | x [element] | -| hash_extensions.rb:3:5:3:5 | x [element] | hash_extensions.rb:4:10:4:10 | x [element] | -| hash_extensions.rb:3:9:3:9 | h [element :a] | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | | hash_extensions.rb:3:9:3:9 | h [element :a] | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | hash_extensions.rb:3:5:3:5 | x [element] | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | hash_extensions.rb:3:5:3:5 | x [element] | -| hash_extensions.rb:4:10:4:10 | x [element] | hash_extensions.rb:4:10:4:14 | ...[...] | | hash_extensions.rb:4:10:4:10 | x [element] | hash_extensions.rb:4:10:4:14 | ...[...] | | hash_extensions.rb:10:5:10:5 | h [element :a] | hash_extensions.rb:11:9:11:9 | h [element :a] | -| hash_extensions.rb:10:5:10:5 | h [element :a] | hash_extensions.rb:11:9:11:9 | h [element :a] | -| hash_extensions.rb:10:14:10:24 | call to source | hash_extensions.rb:10:5:10:5 | h [element :a] | | hash_extensions.rb:10:14:10:24 | call to source | hash_extensions.rb:10:5:10:5 | h [element :a] | | hash_extensions.rb:11:5:11:5 | x [element] | hash_extensions.rb:12:10:12:10 | x [element] | -| hash_extensions.rb:11:5:11:5 | x [element] | hash_extensions.rb:12:10:12:10 | x [element] | | hash_extensions.rb:11:9:11:9 | h [element :a] | hash_extensions.rb:11:9:11:20 | call to to_options [element] | -| hash_extensions.rb:11:9:11:9 | h [element :a] | hash_extensions.rb:11:9:11:20 | call to to_options [element] | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] | hash_extensions.rb:11:5:11:5 | x [element] | | hash_extensions.rb:11:9:11:20 | call to to_options [element] | hash_extensions.rb:11:5:11:5 | x [element] | | hash_extensions.rb:12:10:12:10 | x [element] | hash_extensions.rb:12:10:12:14 | ...[...] | -| hash_extensions.rb:12:10:12:10 | x [element] | hash_extensions.rb:12:10:12:14 | ...[...] | -| hash_extensions.rb:18:5:18:5 | h [element :a] | hash_extensions.rb:19:9:19:9 | h [element :a] | | hash_extensions.rb:18:5:18:5 | h [element :a] | hash_extensions.rb:19:9:19:9 | h [element :a] | | hash_extensions.rb:18:14:18:24 | call to source | hash_extensions.rb:18:5:18:5 | h [element :a] | -| hash_extensions.rb:18:14:18:24 | call to source | hash_extensions.rb:18:5:18:5 | h [element :a] | -| hash_extensions.rb:19:5:19:5 | x [element] | hash_extensions.rb:20:10:20:10 | x [element] | | hash_extensions.rb:19:5:19:5 | x [element] | hash_extensions.rb:20:10:20:10 | x [element] | | hash_extensions.rb:19:9:19:9 | h [element :a] | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | -| hash_extensions.rb:19:9:19:9 | h [element :a] | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | hash_extensions.rb:19:5:19:5 | x [element] | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | hash_extensions.rb:19:5:19:5 | x [element] | -| hash_extensions.rb:20:10:20:10 | x [element] | hash_extensions.rb:20:10:20:14 | ...[...] | | hash_extensions.rb:20:10:20:10 | x [element] | hash_extensions.rb:20:10:20:14 | ...[...] | | hash_extensions.rb:26:5:26:5 | h [element :a] | hash_extensions.rb:27:9:27:9 | h [element :a] | -| hash_extensions.rb:26:5:26:5 | h [element :a] | hash_extensions.rb:27:9:27:9 | h [element :a] | -| hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:5:26:5 | h [element :a] | | hash_extensions.rb:26:14:26:24 | call to source | hash_extensions.rb:26:5:26:5 | h [element :a] | | hash_extensions.rb:27:5:27:5 | x [element] | hash_extensions.rb:28:10:28:10 | x [element] | -| hash_extensions.rb:27:5:27:5 | x [element] | hash_extensions.rb:28:10:28:10 | x [element] | -| hash_extensions.rb:27:9:27:9 | h [element :a] | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | | hash_extensions.rb:27:9:27:9 | h [element :a] | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | hash_extensions.rb:27:5:27:5 | x [element] | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | hash_extensions.rb:27:5:27:5 | x [element] | | hash_extensions.rb:28:10:28:10 | x [element] | hash_extensions.rb:28:10:28:14 | ...[...] | -| hash_extensions.rb:28:10:28:10 | x [element] | hash_extensions.rb:28:10:28:14 | ...[...] | -| hash_extensions.rb:34:5:34:5 | h [element :a] | hash_extensions.rb:35:9:35:9 | h [element :a] | | hash_extensions.rb:34:5:34:5 | h [element :a] | hash_extensions.rb:35:9:35:9 | h [element :a] | | hash_extensions.rb:34:14:34:24 | call to source | hash_extensions.rb:34:5:34:5 | h [element :a] | -| hash_extensions.rb:34:14:34:24 | call to source | hash_extensions.rb:34:5:34:5 | h [element :a] | | hash_extensions.rb:35:5:35:5 | x [element] | hash_extensions.rb:36:10:36:10 | x [element] | -| hash_extensions.rb:35:5:35:5 | x [element] | hash_extensions.rb:36:10:36:10 | x [element] | -| hash_extensions.rb:35:9:35:9 | h [element :a] | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | | hash_extensions.rb:35:9:35:9 | h [element :a] | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | hash_extensions.rb:35:5:35:5 | x [element] | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | hash_extensions.rb:35:5:35:5 | x [element] | | hash_extensions.rb:36:10:36:10 | x [element] | hash_extensions.rb:36:10:36:14 | ...[...] | -| hash_extensions.rb:36:10:36:10 | x [element] | hash_extensions.rb:36:10:36:14 | ...[...] | -| hash_extensions.rb:42:5:42:5 | h [element :a] | hash_extensions.rb:43:9:43:9 | h [element :a] | | hash_extensions.rb:42:5:42:5 | h [element :a] | hash_extensions.rb:43:9:43:9 | h [element :a] | | hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:5:42:5 | h [element :a] | -| hash_extensions.rb:42:14:42:24 | call to source | hash_extensions.rb:42:5:42:5 | h [element :a] | -| hash_extensions.rb:43:5:43:5 | x [element] | hash_extensions.rb:44:10:44:10 | x [element] | | hash_extensions.rb:43:5:43:5 | x [element] | hash_extensions.rb:44:10:44:10 | x [element] | | hash_extensions.rb:43:9:43:9 | h [element :a] | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | -| hash_extensions.rb:43:9:43:9 | h [element :a] | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | hash_extensions.rb:43:5:43:5 | x [element] | | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | hash_extensions.rb:43:5:43:5 | x [element] | | hash_extensions.rb:44:10:44:10 | x [element] | hash_extensions.rb:44:10:44:14 | ...[...] | -| hash_extensions.rb:44:10:44:10 | x [element] | hash_extensions.rb:44:10:44:14 | ...[...] | | hash_extensions.rb:50:5:50:5 | h [element :a] | hash_extensions.rb:51:9:51:9 | h [element :a] | -| hash_extensions.rb:50:5:50:5 | h [element :a] | hash_extensions.rb:51:9:51:9 | h [element :a] | -| hash_extensions.rb:50:5:50:5 | h [element :b] | hash_extensions.rb:51:9:51:9 | h [element :b] | | hash_extensions.rb:50:5:50:5 | h [element :b] | hash_extensions.rb:51:9:51:9 | h [element :b] | | hash_extensions.rb:50:5:50:5 | h [element :d] | hash_extensions.rb:51:9:51:9 | h [element :d] | -| hash_extensions.rb:50:5:50:5 | h [element :d] | hash_extensions.rb:51:9:51:9 | h [element :d] | | hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :a] | -| hash_extensions.rb:50:14:50:23 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :a] | -| hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :b] | | hash_extensions.rb:50:29:50:38 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :b] | | hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :d] | -| hash_extensions.rb:50:52:50:61 | call to taint | hash_extensions.rb:50:5:50:5 | h [element :d] | | hash_extensions.rb:51:5:51:5 | x [element :a] | hash_extensions.rb:58:10:58:10 | x [element :a] | -| hash_extensions.rb:51:5:51:5 | x [element :a] | hash_extensions.rb:58:10:58:10 | x [element :a] | -| hash_extensions.rb:51:5:51:5 | x [element :b] | hash_extensions.rb:59:10:59:10 | x [element :b] | | hash_extensions.rb:51:5:51:5 | x [element :b] | hash_extensions.rb:59:10:59:10 | x [element :b] | | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | hash_extensions.rb:56:10:56:10 | h [element :d] | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | hash_extensions.rb:56:10:56:10 | h [element :d] | -| hash_extensions.rb:51:9:51:9 | h [element :a] | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | | hash_extensions.rb:51:9:51:9 | h [element :a] | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | | hash_extensions.rb:51:9:51:9 | h [element :b] | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | -| hash_extensions.rb:51:9:51:9 | h [element :b] | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | -| hash_extensions.rb:51:9:51:9 | h [element :d] | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | | hash_extensions.rb:51:9:51:9 | h [element :d] | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | hash_extensions.rb:51:5:51:5 | x [element :a] | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | hash_extensions.rb:51:5:51:5 | x [element :a] | | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | hash_extensions.rb:51:5:51:5 | x [element :b] | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | hash_extensions.rb:51:5:51:5 | x [element :b] | -| hash_extensions.rb:56:10:56:10 | h [element :d] | hash_extensions.rb:56:10:56:14 | ...[...] | | hash_extensions.rb:56:10:56:10 | h [element :d] | hash_extensions.rb:56:10:56:14 | ...[...] | | hash_extensions.rb:58:10:58:10 | x [element :a] | hash_extensions.rb:58:10:58:14 | ...[...] | -| hash_extensions.rb:58:10:58:10 | x [element :a] | hash_extensions.rb:58:10:58:14 | ...[...] | | hash_extensions.rb:59:10:59:10 | x [element :b] | hash_extensions.rb:59:10:59:14 | ...[...] | -| hash_extensions.rb:59:10:59:10 | x [element :b] | hash_extensions.rb:59:10:59:14 | ...[...] | -| hash_extensions.rb:67:5:67:10 | values [element 0] | hash_extensions.rb:68:9:68:14 | values [element 0] | | hash_extensions.rb:67:5:67:10 | values [element 0] | hash_extensions.rb:68:9:68:14 | values [element 0] | | hash_extensions.rb:67:5:67:10 | values [element 1] | hash_extensions.rb:68:9:68:14 | values [element 1] | -| hash_extensions.rb:67:5:67:10 | values [element 1] | hash_extensions.rb:68:9:68:14 | values [element 1] | | hash_extensions.rb:67:5:67:10 | values [element 2] | hash_extensions.rb:68:9:68:14 | values [element 2] | -| hash_extensions.rb:67:5:67:10 | values [element 2] | hash_extensions.rb:68:9:68:14 | values [element 2] | -| hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:5:67:10 | values [element 0] | | hash_extensions.rb:67:15:67:25 | call to source | hash_extensions.rb:67:5:67:10 | values [element 0] | | hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:5:67:10 | values [element 1] | -| hash_extensions.rb:67:28:67:38 | call to source | hash_extensions.rb:67:5:67:10 | values [element 1] | -| hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:5:67:10 | values [element 2] | | hash_extensions.rb:67:41:67:51 | call to source | hash_extensions.rb:67:5:67:10 | values [element 2] | | hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:73:10:73:10 | h [element] | -| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:73:10:73:10 | h [element] | -| hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:74:10:74:10 | h [element] | | hash_extensions.rb:68:5:68:5 | h [element] | hash_extensions.rb:74:10:74:10 | h [element] | | hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | -| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | | hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:29:68:33 | value | -| hash_extensions.rb:68:9:68:14 | values [element 0] | hash_extensions.rb:68:29:68:33 | value | -| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | | hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | | hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:29:68:33 | value | -| hash_extensions.rb:68:9:68:14 | values [element 1] | hash_extensions.rb:68:29:68:33 | value | -| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | | hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:9:71:7 | call to index_by [element] | | hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:29:68:33 | value | -| hash_extensions.rb:68:9:68:14 | values [element 2] | hash_extensions.rb:68:29:68:33 | value | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] | hash_extensions.rb:68:5:68:5 | h [element] | | hash_extensions.rb:68:9:71:7 | call to index_by [element] | hash_extensions.rb:68:5:68:5 | h [element] | | hash_extensions.rb:68:29:68:33 | value | hash_extensions.rb:69:14:69:18 | value | -| hash_extensions.rb:68:29:68:33 | value | hash_extensions.rb:69:14:69:18 | value | | hash_extensions.rb:73:10:73:10 | h [element] | hash_extensions.rb:73:10:73:16 | ...[...] | -| hash_extensions.rb:73:10:73:10 | h [element] | hash_extensions.rb:73:10:73:16 | ...[...] | -| hash_extensions.rb:74:10:74:10 | h [element] | hash_extensions.rb:74:10:74:16 | ...[...] | | hash_extensions.rb:74:10:74:10 | h [element] | hash_extensions.rb:74:10:74:16 | ...[...] | | hash_extensions.rb:80:5:80:10 | values [element 0] | hash_extensions.rb:81:9:81:14 | values [element 0] | -| hash_extensions.rb:80:5:80:10 | values [element 0] | hash_extensions.rb:81:9:81:14 | values [element 0] | -| hash_extensions.rb:80:5:80:10 | values [element 1] | hash_extensions.rb:81:9:81:14 | values [element 1] | | hash_extensions.rb:80:5:80:10 | values [element 1] | hash_extensions.rb:81:9:81:14 | values [element 1] | | hash_extensions.rb:80:5:80:10 | values [element 2] | hash_extensions.rb:81:9:81:14 | values [element 2] | -| hash_extensions.rb:80:5:80:10 | values [element 2] | hash_extensions.rb:81:9:81:14 | values [element 2] | -| hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:5:80:10 | values [element 0] | | hash_extensions.rb:80:15:80:25 | call to source | hash_extensions.rb:80:5:80:10 | values [element 0] | | hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:5:80:10 | values [element 1] | -| hash_extensions.rb:80:28:80:38 | call to source | hash_extensions.rb:80:5:80:10 | values [element 1] | | hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:5:80:10 | values [element 2] | -| hash_extensions.rb:80:41:80:51 | call to source | hash_extensions.rb:80:5:80:10 | values [element 2] | -| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:86:10:86:10 | h [element] | | hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:86:10:86:10 | h [element] | | hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:87:10:87:10 | h [element] | -| hash_extensions.rb:81:5:81:5 | h [element] | hash_extensions.rb:87:10:87:10 | h [element] | | hash_extensions.rb:81:9:81:14 | values [element 0] | hash_extensions.rb:81:31:81:33 | key | -| hash_extensions.rb:81:9:81:14 | values [element 0] | hash_extensions.rb:81:31:81:33 | key | -| hash_extensions.rb:81:9:81:14 | values [element 1] | hash_extensions.rb:81:31:81:33 | key | | hash_extensions.rb:81:9:81:14 | values [element 1] | hash_extensions.rb:81:31:81:33 | key | | hash_extensions.rb:81:9:81:14 | values [element 2] | hash_extensions.rb:81:31:81:33 | key | -| hash_extensions.rb:81:9:81:14 | values [element 2] | hash_extensions.rb:81:31:81:33 | key | | hash_extensions.rb:81:9:84:7 | call to index_with [element] | hash_extensions.rb:81:5:81:5 | h [element] | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] | hash_extensions.rb:81:5:81:5 | h [element] | -| hash_extensions.rb:81:31:81:33 | key | hash_extensions.rb:82:14:82:16 | key | | hash_extensions.rb:81:31:81:33 | key | hash_extensions.rb:82:14:82:16 | key | | hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:81:9:84:7 | call to index_with [element] | -| hash_extensions.rb:83:9:83:19 | call to source | hash_extensions.rb:81:9:84:7 | call to index_with [element] | -| hash_extensions.rb:86:10:86:10 | h [element] | hash_extensions.rb:86:10:86:16 | ...[...] | | hash_extensions.rb:86:10:86:10 | h [element] | hash_extensions.rb:86:10:86:16 | ...[...] | | hash_extensions.rb:87:10:87:10 | h [element] | hash_extensions.rb:87:10:87:16 | ...[...] | -| hash_extensions.rb:87:10:87:10 | h [element] | hash_extensions.rb:87:10:87:16 | ...[...] | -| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:91:10:91:10 | j [element] | | hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:91:10:91:10 | j [element] | | hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:92:10:92:10 | j [element] | -| hash_extensions.rb:89:5:89:5 | j [element] | hash_extensions.rb:92:10:92:10 | j [element] | | hash_extensions.rb:89:9:89:38 | call to index_with [element] | hash_extensions.rb:89:5:89:5 | j [element] | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] | hash_extensions.rb:89:5:89:5 | j [element] | -| hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:89:9:89:38 | call to index_with [element] | | hash_extensions.rb:89:27:89:37 | call to source | hash_extensions.rb:89:9:89:38 | call to index_with [element] | | hash_extensions.rb:91:10:91:10 | j [element] | hash_extensions.rb:91:10:91:16 | ...[...] | -| hash_extensions.rb:91:10:91:10 | j [element] | hash_extensions.rb:91:10:91:16 | ...[...] | | hash_extensions.rb:92:10:92:10 | j [element] | hash_extensions.rb:92:10:92:16 | ...[...] | -| hash_extensions.rb:92:10:92:10 | j [element] | hash_extensions.rb:92:10:92:16 | ...[...] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | | hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | -| hash_extensions.rb:98:21:98:31 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | -| hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | | hash_extensions.rb:98:40:98:54 | call to source | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | hash_extensions.rb:99:10:99:25 | call to pick | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | hash_extensions.rb:99:10:99:25 | call to pick | | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | hash_extensions.rb:100:10:100:27 | call to pick | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | hash_extensions.rb:100:10:100:27 | call to pick | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | hash_extensions.rb:101:10:101:35 | ...[...] | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | hash_extensions.rb:101:10:101:35 | ...[...] | | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | hash_extensions.rb:102:10:102:32 | call to pick [element 1] | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | hash_extensions.rb:102:10:102:32 | call to pick [element 1] | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | hash_extensions.rb:102:10:102:35 | ...[...] | | hash_extensions.rb:102:10:102:32 | call to pick [element 1] | hash_extensions.rb:102:10:102:35 | ...[...] | | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | hash_extensions.rb:103:10:103:32 | call to pick [element 0] | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | hash_extensions.rb:103:10:103:32 | call to pick [element 0] | | hash_extensions.rb:103:10:103:32 | call to pick [element 0] | hash_extensions.rb:103:10:103:35 | ...[...] | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | hash_extensions.rb:103:10:103:35 | ...[...] | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | hash_extensions.rb:104:10:104:32 | call to pick [element 1] | | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | hash_extensions.rb:104:10:104:32 | call to pick [element 1] | | hash_extensions.rb:104:10:104:32 | call to pick [element 1] | hash_extensions.rb:104:10:104:35 | ...[...] | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | hash_extensions.rb:104:10:104:35 | ...[...] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | | hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | -| hash_extensions.rb:110:21:110:31 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | | hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | -| hash_extensions.rb:110:40:110:54 | call to source | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | -| hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | | hash_extensions.rb:110:65:110:75 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | | hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | -| hash_extensions.rb:110:84:110:99 | call to source | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | hash_extensions.rb:111:10:111:28 | call to pluck [element] | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] | hash_extensions.rb:111:10:111:31 | ...[...] | | hash_extensions.rb:111:10:111:28 | call to pluck [element] | hash_extensions.rb:111:10:111:31 | ...[...] | | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | hash_extensions.rb:112:10:112:39 | ...[...] | -| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | hash_extensions.rb:112:10:112:39 | ...[...] | | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | hash_extensions.rb:113:10:113:39 | ...[...] | -| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | hash_extensions.rb:113:10:113:39 | ...[...] | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | hash_extensions.rb:114:10:114:39 | ...[...] | -| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | hash_extensions.rb:114:10:114:39 | ...[...] | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | -| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | hash_extensions.rb:115:10:115:39 | ...[...] | | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | hash_extensions.rb:115:10:115:39 | ...[...] | | hash_extensions.rb:122:5:122:10 | single [element 0] | hash_extensions.rb:125:10:125:15 | single [element 0] | -| hash_extensions.rb:122:5:122:10 | single [element 0] | hash_extensions.rb:125:10:125:15 | single [element 0] | | hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:5:122:10 | single [element 0] | -| hash_extensions.rb:122:15:122:25 | call to source | hash_extensions.rb:122:5:122:10 | single [element 0] | -| hash_extensions.rb:123:5:123:9 | multi [element 0] | hash_extensions.rb:126:10:126:14 | multi [element 0] | | hash_extensions.rb:123:5:123:9 | multi [element 0] | hash_extensions.rb:126:10:126:14 | multi [element 0] | | hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:5:123:9 | multi [element 0] | -| hash_extensions.rb:123:14:123:24 | call to source | hash_extensions.rb:123:5:123:9 | multi [element 0] | | hash_extensions.rb:125:10:125:15 | single [element 0] | hash_extensions.rb:125:10:125:20 | call to sole | -| hash_extensions.rb:125:10:125:15 | single [element 0] | hash_extensions.rb:125:10:125:20 | call to sole | -| hash_extensions.rb:126:10:126:14 | multi [element 0] | hash_extensions.rb:126:10:126:19 | call to sole | | hash_extensions.rb:126:10:126:14 | multi [element 0] | hash_extensions.rb:126:10:126:19 | call to sole | 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] | -| active_support.rb:181:9:181:23 | call to compact_blank [element] | semmle.label | call to compact_blank [element] | | active_support.rb:182:10:182:10 | y [element] | semmle.label | y [element] | -| active_support.rb:182:10:182:10 | y [element] | semmle.label | y [element] | -| active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:186:5:186:5 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:186:10:186:18 | call to source | semmle.label | call to source | -| active_support.rb:186:10:186:18 | call to source | semmle.label | call to source | -| active_support.rb:187:5:187:5 | y [element] | semmle.label | y [element] | | active_support.rb:187:5:187:5 | y [element] | semmle.label | y [element] | | active_support.rb:187:9:187:9 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:187:9:187:9 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:187:9:187:21 | call to excluding [element] | semmle.label | call to excluding [element] | -| active_support.rb:187:9:187:21 | call to excluding [element] | semmle.label | call to excluding [element] | -| active_support.rb:188:10:188:10 | y [element] | semmle.label | y [element] | | active_support.rb:188:10:188:10 | y [element] | semmle.label | y [element] | | active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:192:5:192:5 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:192:5:192:5 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:192:10:192:18 | call to source | semmle.label | call to source | -| active_support.rb:192:10:192:18 | call to source | semmle.label | call to source | -| active_support.rb:193:5:193:5 | y [element] | semmle.label | y [element] | | active_support.rb:193:5:193:5 | y [element] | semmle.label | y [element] | | active_support.rb:193:9:193:9 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:193:9:193:9 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:193:9:193:19 | call to without [element] | semmle.label | call to without [element] | -| active_support.rb:193:9:193:19 | call to without [element] | semmle.label | call to without [element] | -| active_support.rb:194:10:194:10 | y [element] | semmle.label | y [element] | | active_support.rb:194:10:194:10 | y [element] | semmle.label | y [element] | | active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:198:5:198:5 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:198:5:198:5 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:198:10:198:18 | call to source | semmle.label | call to source | -| active_support.rb:198:10:198:18 | call to source | semmle.label | call to source | -| active_support.rb:199:5:199:5 | y [element] | semmle.label | y [element] | | active_support.rb:199:5:199:5 | y [element] | semmle.label | y [element] | | active_support.rb:199:9:199:9 | x [element 0] | semmle.label | x [element 0] | -| active_support.rb:199:9:199:9 | x [element 0] | semmle.label | x [element 0] | | active_support.rb:199:9:199:37 | call to in_order_of [element] | semmle.label | call to in_order_of [element] | -| active_support.rb:199:9:199:37 | call to in_order_of [element] | semmle.label | call to in_order_of [element] | -| active_support.rb:200:10:200:10 | y [element] | semmle.label | y [element] | | active_support.rb:200:10:200:10 | y [element] | semmle.label | y [element] | | active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:204:5:204:5 | a [element 0] | semmle.label | a [element 0] | | active_support.rb:204:5:204:5 | a [element 0] | semmle.label | a [element 0] | | active_support.rb:204:10:204:18 | call to source | semmle.label | call to source | -| active_support.rb:204:10:204:18 | call to source | semmle.label | call to source | -| active_support.rb:205:5:205:5 | b [element 0] | semmle.label | b [element 0] | | active_support.rb:205:5:205:5 | b [element 0] | semmle.label | b [element 0] | | active_support.rb:205:5:205:5 | b [element] | semmle.label | b [element] | -| active_support.rb:205:5:205:5 | b [element] | semmle.label | b [element] | | active_support.rb:205:9:205:9 | a [element 0] | semmle.label | a [element 0] | -| active_support.rb:205:9:205:9 | a [element 0] | semmle.label | a [element 0] | -| active_support.rb:205:9:205:41 | call to including [element 0] | semmle.label | call to including [element 0] | | active_support.rb:205:9:205:41 | call to including [element 0] | semmle.label | call to including [element 0] | | active_support.rb:205:9:205:41 | call to including [element] | semmle.label | call to including [element] | -| active_support.rb:205:9:205:41 | call to including [element] | semmle.label | call to including [element] | | active_support.rb:205:21:205:29 | call to source | semmle.label | call to source | -| active_support.rb:205:21:205:29 | call to source | semmle.label | call to source | -| active_support.rb:205:32:205:40 | call to source | semmle.label | call to source | | active_support.rb:205:32:205:40 | call to source | semmle.label | call to source | | active_support.rb:206:10:206:10 | a [element 0] | semmle.label | a [element 0] | -| active_support.rb:206:10:206:10 | a [element 0] | semmle.label | a [element 0] | | active_support.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:208:10:208:10 | b [element 0] | semmle.label | b [element 0] | | active_support.rb:208:10:208:10 | b [element 0] | semmle.label | b [element 0] | | active_support.rb:208:10:208:10 | b [element] | semmle.label | b [element] | -| active_support.rb:208:10:208:10 | b [element] | semmle.label | b [element] | -| active_support.rb:208:10:208:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:208:10:208:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:209:10:209:10 | b [element] | semmle.label | b [element] | -| active_support.rb:209:10:209:10 | b [element] | semmle.label | b [element] | -| active_support.rb:209:10:209:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:209:10:209:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:210:10:210:10 | b [element] | semmle.label | b [element] | -| active_support.rb:210:10:210:10 | b [element] | semmle.label | b [element] | | active_support.rb:210:10:210:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:210:10:210:13 | ...[...] | semmle.label | ...[...] | -| active_support.rb:211:10:211:10 | b [element] | semmle.label | b [element] | | active_support.rb:211:10:211:10 | b [element] | semmle.label | b [element] | | active_support.rb:211:10:211: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] | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] | semmle.label | call to stringify_keys [element] | | hash_extensions.rb:4:10:4:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:4:10:4:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:4:10:4:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:4:10:4:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:10:5:10:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:10:5:10:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:10:14:10:24 | call to source | semmle.label | call to source | | hash_extensions.rb:10:14:10:24 | call to source | semmle.label | call to source | | hash_extensions.rb:11:5:11:5 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:11:5:11:5 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:11:9:11:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:11:9:11:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:11:9:11:20 | call to to_options [element] | semmle.label | call to to_options [element] | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] | semmle.label | call to to_options [element] | | hash_extensions.rb:12:10:12:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:12:10:12:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:18:5:18:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:18:5:18:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:18:14:18:24 | call to source | semmle.label | call to source | | hash_extensions.rb:18:14:18:24 | call to source | semmle.label | call to source | | hash_extensions.rb:19:5:19:5 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:19:5:19:5 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:19:9:19:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:19:9:19:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | semmle.label | call to symbolize_keys [element] | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] | semmle.label | call to symbolize_keys [element] | | hash_extensions.rb:20:10:20:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:20:10:20:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:26:5:26:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:26:5:26:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:26:14:26:24 | call to source | semmle.label | call to source | | hash_extensions.rb:26:14:26:24 | call to source | semmle.label | call to source | | hash_extensions.rb:27:5:27:5 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:27:5:27:5 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:27:9:27:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:27:9:27:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | semmle.label | call to deep_stringify_keys [element] | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] | semmle.label | call to deep_stringify_keys [element] | | hash_extensions.rb:28:10:28:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:28:10:28:10 | x [element] | semmle.label | x [element] | -| hash_extensions.rb:28:10:28:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:28:10:28:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:34:5:34:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:34:5:34:5 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:34:14:34:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:34:14:34:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:35:5:35:5 | x [element] | semmle.label | x [element] | | hash_extensions.rb:35:5:35:5 | x [element] | semmle.label | x [element] | | hash_extensions.rb:35:9:35:9 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:35:9:35:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | semmle.label | call to deep_symbolize_keys [element] | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] | semmle.label | call to deep_symbolize_keys [element] | -| hash_extensions.rb:36:10:36:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:36:10:36:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:42:5:42:5 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:42:5:42:5 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:42:14:42:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:42:14:42:24 | call to source | semmle.label | call to source | -| hash_extensions.rb:43:5:43:5 | x [element] | semmle.label | x [element] | | hash_extensions.rb:43:5:43:5 | x [element] | semmle.label | x [element] | | hash_extensions.rb:43:9:43:9 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:43:9:43:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | semmle.label | call to with_indifferent_access [element] | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] | semmle.label | call to with_indifferent_access [element] | -| hash_extensions.rb:44:10:44:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:44:10:44:10 | x [element] | semmle.label | x [element] | | hash_extensions.rb:44:10:44:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:44:10:44:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:50:5:50:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:50:5:50:5 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:50:5:50:5 | h [element :b] | semmle.label | h [element :b] | | hash_extensions.rb:50:5:50:5 | h [element :b] | semmle.label | h [element :b] | | hash_extensions.rb:50:5:50:5 | h [element :d] | semmle.label | h [element :d] | -| hash_extensions.rb:50:5:50:5 | h [element :d] | semmle.label | h [element :d] | | hash_extensions.rb:50:14:50:23 | call to taint | semmle.label | call to taint | -| hash_extensions.rb:50:14:50:23 | call to taint | semmle.label | call to taint | -| hash_extensions.rb:50:29:50:38 | call to taint | semmle.label | call to taint | | hash_extensions.rb:50:29:50:38 | call to taint | semmle.label | call to taint | | hash_extensions.rb:50:52:50:61 | call to taint | semmle.label | call to taint | -| hash_extensions.rb:50:52:50:61 | call to taint | semmle.label | call to taint | -| hash_extensions.rb:51:5:51:5 | x [element :a] | semmle.label | x [element :a] | | hash_extensions.rb:51:5:51:5 | x [element :a] | semmle.label | x [element :a] | | hash_extensions.rb:51:5:51:5 | x [element :b] | semmle.label | x [element :b] | -| hash_extensions.rb:51:5:51:5 | x [element :b] | semmle.label | x [element :b] | -| hash_extensions.rb:51:9:51:9 | [post] h [element :d] | semmle.label | [post] h [element :d] | | hash_extensions.rb:51:9:51:9 | [post] h [element :d] | semmle.label | [post] h [element :d] | | hash_extensions.rb:51:9:51:9 | h [element :a] | semmle.label | h [element :a] | -| hash_extensions.rb:51:9:51:9 | h [element :a] | semmle.label | h [element :a] | | hash_extensions.rb:51:9:51:9 | h [element :b] | semmle.label | h [element :b] | -| hash_extensions.rb:51:9:51:9 | h [element :b] | semmle.label | h [element :b] | -| hash_extensions.rb:51:9:51:9 | h [element :d] | semmle.label | h [element :d] | | hash_extensions.rb:51:9:51:9 | h [element :d] | semmle.label | h [element :d] | | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | semmle.label | call to extract! [element :a] | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] | semmle.label | call to extract! [element :a] | | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | semmle.label | call to extract! [element :b] | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] | semmle.label | call to extract! [element :b] | -| hash_extensions.rb:56:10:56:10 | h [element :d] | semmle.label | h [element :d] | | hash_extensions.rb:56:10:56:10 | h [element :d] | semmle.label | h [element :d] | | hash_extensions.rb:56:10:56:14 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:56:10:56:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:58:10:58:10 | x [element :a] | semmle.label | x [element :a] | -| hash_extensions.rb:58:10:58:10 | x [element :a] | semmle.label | x [element :a] | -| hash_extensions.rb:58:10:58:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:58:10:58:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:59:10:59:10 | x [element :b] | semmle.label | x [element :b] | -| hash_extensions.rb:59:10:59:10 | x [element :b] | semmle.label | x [element :b] | -| hash_extensions.rb:59:10:59:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:59:10:59:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:67:5:67:10 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:67:5:67:10 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:67:5:67:10 | values [element 1] | semmle.label | values [element 1] | | hash_extensions.rb:67:5:67:10 | values [element 1] | semmle.label | values [element 1] | | hash_extensions.rb:67:5:67:10 | values [element 2] | semmle.label | values [element 2] | -| hash_extensions.rb:67:5:67:10 | values [element 2] | semmle.label | values [element 2] | | hash_extensions.rb:67:15:67:25 | call to source | semmle.label | call to source | -| hash_extensions.rb:67:15:67:25 | call to source | semmle.label | call to source | -| hash_extensions.rb:67:28:67:38 | call to source | semmle.label | call to source | | hash_extensions.rb:67:28:67:38 | call to source | semmle.label | call to source | | hash_extensions.rb:67:41:67:51 | call to source | semmle.label | call to source | -| hash_extensions.rb:67:41:67:51 | call to source | semmle.label | call to source | -| hash_extensions.rb:68:5:68:5 | h [element] | semmle.label | h [element] | | hash_extensions.rb:68:5:68:5 | h [element] | semmle.label | h [element] | | hash_extensions.rb:68:9:68:14 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:68:9:68:14 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:68:9:68:14 | values [element 1] | semmle.label | values [element 1] | | hash_extensions.rb:68:9:68:14 | values [element 1] | semmle.label | values [element 1] | | hash_extensions.rb:68:9:68:14 | values [element 2] | semmle.label | values [element 2] | -| hash_extensions.rb:68:9:68:14 | values [element 2] | semmle.label | values [element 2] | | hash_extensions.rb:68:9:71:7 | call to index_by [element] | semmle.label | call to index_by [element] | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] | semmle.label | call to index_by [element] | -| hash_extensions.rb:68:29:68:33 | value | semmle.label | value | | hash_extensions.rb:68:29:68:33 | value | semmle.label | value | | hash_extensions.rb:69:14:69:18 | value | semmle.label | value | -| hash_extensions.rb:69:14:69:18 | value | semmle.label | value | -| hash_extensions.rb:73:10:73:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:73:10:73:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:73:10:73:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:73:10:73:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:74:10:74:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:74:10:74:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:74:10:74:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:74:10:74:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:80:5:80:10 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:80:5:80:10 | values [element 0] | semmle.label | values [element 0] | -| hash_extensions.rb:80:5:80:10 | values [element 1] | semmle.label | values [element 1] | | hash_extensions.rb:80:5:80:10 | values [element 1] | semmle.label | values [element 1] | | hash_extensions.rb:80:5:80:10 | values [element 2] | semmle.label | values [element 2] | -| hash_extensions.rb:80:5:80:10 | values [element 2] | semmle.label | values [element 2] | | hash_extensions.rb:80:15:80:25 | call to source | semmle.label | call to source | -| hash_extensions.rb:80:15:80:25 | call to source | semmle.label | call to source | -| hash_extensions.rb:80:28:80:38 | call to source | semmle.label | call to source | | hash_extensions.rb:80:28:80:38 | call to source | semmle.label | call to source | | hash_extensions.rb:80:41:80:51 | call to source | semmle.label | call to source | -| hash_extensions.rb:80:41:80:51 | call to source | semmle.label | call to source | | hash_extensions.rb:81:5:81:5 | h [element] | semmle.label | h [element] | -| hash_extensions.rb:81:5:81:5 | h [element] | semmle.label | h [element] | -| hash_extensions.rb:81:9:81:14 | values [element 0] | semmle.label | values [element 0] | | hash_extensions.rb:81:9:81:14 | values [element 0] | semmle.label | values [element 0] | | hash_extensions.rb:81:9:81:14 | values [element 1] | semmle.label | values [element 1] | -| hash_extensions.rb:81:9:81:14 | values [element 1] | semmle.label | values [element 1] | -| hash_extensions.rb:81:9:81:14 | values [element 2] | semmle.label | values [element 2] | | hash_extensions.rb:81:9:81:14 | values [element 2] | semmle.label | values [element 2] | | hash_extensions.rb:81:9:84:7 | call to index_with [element] | semmle.label | call to index_with [element] | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] | semmle.label | call to index_with [element] | -| hash_extensions.rb:81:31:81:33 | key | semmle.label | key | | hash_extensions.rb:81:31:81:33 | key | semmle.label | key | | hash_extensions.rb:82:14:82:16 | key | semmle.label | key | -| hash_extensions.rb:82:14:82:16 | key | semmle.label | key | | hash_extensions.rb:83:9:83:19 | call to source | semmle.label | call to source | -| hash_extensions.rb:83:9:83:19 | call to source | semmle.label | call to source | -| hash_extensions.rb:86:10:86:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:86:10:86:10 | h [element] | semmle.label | h [element] | | hash_extensions.rb:86:10:86:16 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:86:10:86:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:87:10:87:10 | h [element] | semmle.label | h [element] | -| hash_extensions.rb:87:10:87:10 | h [element] | semmle.label | h [element] | -| hash_extensions.rb:87:10:87:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:87:10:87:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:89:5:89:5 | j [element] | semmle.label | j [element] | -| hash_extensions.rb:89:5:89:5 | j [element] | semmle.label | j [element] | | hash_extensions.rb:89:9:89:38 | call to index_with [element] | semmle.label | call to index_with [element] | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] | semmle.label | call to index_with [element] | -| hash_extensions.rb:89:27:89:37 | call to source | semmle.label | call to source | | hash_extensions.rb:89:27:89:37 | call to source | semmle.label | call to source | | hash_extensions.rb:91:10:91:10 | j [element] | semmle.label | j [element] | -| hash_extensions.rb:91:10:91:10 | j [element] | semmle.label | j [element] | -| hash_extensions.rb:91:10:91:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:91:10:91:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:92:10:92:10 | j [element] | semmle.label | j [element] | -| hash_extensions.rb:92:10:92:10 | j [element] | semmle.label | j [element] | -| hash_extensions.rb:92:10:92:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:92:10:92:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:98:21:98:31 | call to source | semmle.label | call to source | | hash_extensions.rb:98:21:98:31 | call to source | semmle.label | call to source | | hash_extensions.rb:98:40:98:54 | call to source | semmle.label | call to source | -| hash_extensions.rb:98:40:98:54 | call to source | semmle.label | call to source | | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:99:10:99:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:99:10:99:25 | call to pick | semmle.label | call to pick | | hash_extensions.rb:99:10:99:25 | call to pick | semmle.label | call to pick | | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:100:10:100:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | | hash_extensions.rb:100:10:100:27 | call to pick | semmle.label | call to pick | -| hash_extensions.rb:100:10:100:27 | call to pick | semmle.label | call to pick | -| hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:101:10:101:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | -| hash_extensions.rb:101:10:101:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | -| hash_extensions.rb:101:10:101:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:101:10:101:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:102:10:102:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:102:10:102:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | | hash_extensions.rb:102:10:102:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | | hash_extensions.rb:102:10:102:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:102:10:102:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:103:10:103:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:103:10:103:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | | hash_extensions.rb:103:10:103:32 | call to pick [element 0] | semmle.label | call to pick [element 0] | | hash_extensions.rb:103:10:103:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:103:10:103:35 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:104:10:104:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | -| hash_extensions.rb:104:10:104:32 | call to pick [element 1] | semmle.label | call to pick [element 1] | -| hash_extensions.rb:104:10:104:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:104:10:104:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:110:21:110:31 | call to source | semmle.label | call to source | | hash_extensions.rb:110:21:110:31 | call to source | semmle.label | call to source | | hash_extensions.rb:110:40:110:54 | call to source | semmle.label | call to source | -| hash_extensions.rb:110:40:110:54 | call to source | semmle.label | call to source | -| hash_extensions.rb:110:65:110:75 | call to source | semmle.label | call to source | | hash_extensions.rb:110:65:110:75 | call to source | semmle.label | call to source | | hash_extensions.rb:110:84:110:99 | call to source | semmle.label | call to source | -| hash_extensions.rb:110:84:110:99 | call to source | semmle.label | call to source | | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:111:10:111:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | -| hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | | hash_extensions.rb:111:10:111:28 | call to pluck [element] | semmle.label | call to pluck [element] | -| hash_extensions.rb:111:10:111:28 | call to pluck [element] | semmle.label | call to pluck [element] | | hash_extensions.rb:111:10:111:31 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:111:10:111:31 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | -| hash_extensions.rb:112:10:112:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | | hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | -| hash_extensions.rb:112:10:112:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | -| hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:112:10:112:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:112:10:112:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:112:10:112:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:113:10:113:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | | hash_extensions.rb:113:10:113:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | | hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | -| hash_extensions.rb:113:10:113:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:113:10:113:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:113:10:113:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] | semmle.label | values [element 0, element :name] | | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | -| hash_extensions.rb:114:10:114:15 | values [element 1, element :name] | semmle.label | values [element 1, element :name] | | hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | -| hash_extensions.rb:114:10:114:33 | call to pluck [element, element 0] | semmle.label | call to pluck [element, element 0] | -| hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:114:10:114:36 | ...[...] [element 0] | semmle.label | ...[...] [element 0] | | hash_extensions.rb:114:10:114:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:114:10:114:39 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:115:10:115:15 | values [element 0, element :id] | semmle.label | values [element 0, element :id] | -| hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] | semmle.label | values [element 1, element :id] | | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | -| hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] | semmle.label | call to pluck [element, element 1] | -| hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | | hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | -| hash_extensions.rb:122:5:122:10 | single [element 0] | semmle.label | single [element 0] | | hash_extensions.rb:122:5:122:10 | single [element 0] | semmle.label | single [element 0] | | hash_extensions.rb:122:15:122:25 | call to source | semmle.label | call to source | -| hash_extensions.rb:122:15:122:25 | call to source | semmle.label | call to source | | hash_extensions.rb:123:5:123:9 | multi [element 0] | semmle.label | multi [element 0] | -| hash_extensions.rb:123:5:123:9 | multi [element 0] | semmle.label | multi [element 0] | -| hash_extensions.rb:123:14:123:24 | call to source | semmle.label | call to source | | hash_extensions.rb:123:14:123:24 | call to source | semmle.label | call to source | | hash_extensions.rb:125:10:125:15 | single [element 0] | semmle.label | single [element 0] | -| hash_extensions.rb:125:10:125:15 | single [element 0] | semmle.label | single [element 0] | | hash_extensions.rb:125:10:125:20 | call to sole | semmle.label | call to sole | -| hash_extensions.rb:125:10:125:20 | call to sole | semmle.label | call to sole | -| hash_extensions.rb:126:10:126:14 | multi [element 0] | semmle.label | multi [element 0] | | hash_extensions.rb:126:10:126:14 | multi [element 0] | semmle.label | multi [element 0] | | hash_extensions.rb:126:10:126:19 | call to sole | semmle.label | call to sole | -| hash_extensions.rb:126:10:126:19 | call to sole | semmle.label | call to sole | subpaths #select | active_support.rb:182:10:182:13 | ...[...] | active_support.rb:180:10:180:17 | call to source | active_support.rb:182:10:182:13 | ...[...] | $@ | active_support.rb:180:10:180:17 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.ql b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.ql index 7c19d2e3904a7..5cb6cd3208fa2 100644 --- a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.ql +++ b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.ql @@ -6,7 +6,7 @@ import codeql.ruby.AST import TestUtilities.InlineFlowTest import codeql.ruby.Frameworks import DefaultFlowTest -import PathGraph +import ValueFlow::PathGraph from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) diff --git a/ruby/ql/test/library-tests/frameworks/arel/Arel.expected b/ruby/ql/test/library-tests/frameworks/arel/Arel.expected index 7dce82af7b54b..1a8eab7e84fa9 100644 --- a/ruby/ql/test/library-tests/frameworks/arel/Arel.expected +++ b/ruby/ql/test/library-tests/frameworks/arel/Arel.expected @@ -1,3 +1,13 @@ testFailures +edges +| arel.rb:2:3:2:3 | x | arel.rb:3:17:3:17 | x | +| arel.rb:2:7:2:14 | call to source | arel.rb:2:3:2:3 | x | +| arel.rb:3:17:3:17 | x | arel.rb:3:8:3:18 | call to sql | +nodes +| arel.rb:2:3:2:3 | x | semmle.label | x | +| arel.rb:2:7:2:14 | call to source | semmle.label | call to source | +| arel.rb:3:8:3:18 | call to sql | semmle.label | call to sql | +| arel.rb:3:17:3:17 | x | semmle.label | x | +subpaths #select | arel.rb:3:8:3:18 | call to sql | arel.rb:2:7:2:14 | call to source | arel.rb:3:8:3:18 | call to sql | $@ | arel.rb:2:7:2:14 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/frameworks/arel/Arel.ql b/ruby/ql/test/library-tests/frameworks/arel/Arel.ql index e1cc2782ceb09..f992ef694e82c 100644 --- a/ruby/ql/test/library-tests/frameworks/arel/Arel.ql +++ b/ruby/ql/test/library-tests/frameworks/arel/Arel.ql @@ -6,6 +6,7 @@ import codeql.ruby.frameworks.Arel import codeql.ruby.AST import TestUtilities.InlineFlowTest import DefaultFlowTest +import TaintFlow::PathGraph from TaintFlow::PathNode source, TaintFlow::PathNode sink where TaintFlow::flowPath(source, sink) diff --git a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected index 16685bf082db9..1a3665a31c1cd 100644 --- a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected +++ b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.expected @@ -6,19 +6,12 @@ edges | app.rb:75:12:75:24 | ...[...] | app.rb:75:5:75:8 | [post] self [@foo] | | app.rb:76:32:76:35 | @foo | views/index.erb:2:10:2:12 | call to foo | | app.rb:76:32:76:35 | self [@foo] | app.rb:76:32:76:35 | @foo | -| app.rb:95:10:95:14 | self [@user] | app.rb:95:10:95:14 | @user | -| app.rb:103:5:103:9 | [post] self [@user] | app.rb:95:10:95:14 | self [@user] | -| app.rb:103:13:103:22 | call to source | app.rb:103:5:103:9 | [post] self [@user] | nodes | app.rb:75:5:75:8 | [post] self [@foo] | semmle.label | [post] self [@foo] | | app.rb:75:12:75:17 | call to params | semmle.label | call to params | | app.rb:75:12:75:24 | ...[...] | semmle.label | ...[...] | | app.rb:76:32:76:35 | @foo | semmle.label | @foo | | app.rb:76:32:76:35 | self [@foo] | semmle.label | self [@foo] | -| app.rb:95:10:95:14 | @user | semmle.label | @user | -| app.rb:95:10:95:14 | self [@user] | semmle.label | self [@user] | -| app.rb:103:5:103:9 | [post] self [@user] | semmle.label | [post] self [@user] | -| app.rb:103:13:103:22 | call to source | semmle.label | call to source | | views/index.erb:2:10:2:12 | call to foo | semmle.label | call to foo | subpaths #select diff --git a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.ql b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.ql index 413511eac08a8..a6761b9fccb57 100644 --- a/ruby/ql/test/library-tests/frameworks/sinatra/Flow.ql +++ b/ruby/ql/test/library-tests/frameworks/sinatra/Flow.ql @@ -4,7 +4,7 @@ import ruby import TestUtilities.InlineFlowTest -import PathGraph +import TaintFlow::PathGraph import codeql.ruby.frameworks.Sinatra import codeql.ruby.Concepts diff --git a/swift/BUILD.bazel b/swift/BUILD.bazel index 83dff3f8033e9..57b828ef35004 100644 --- a/swift/BUILD.bazel +++ b/swift/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_pkg//:mappings.bzl", "pkg_attributes", "pkg_filegroup", "pkg_files", "strip_prefix") +load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix") load("@rules_pkg//:install.bzl", "pkg_install") load("//:defs.bzl", "codeql_platform") load("//misc/bazel:pkg_runfiles.bzl", "pkg_runfiles") @@ -57,8 +57,8 @@ pkg_filegroup( ) pkg_runfiles( - name = "xcode-autobuilder", - srcs = ["//swift/xcode-autobuilder"], + name = "swift-autobuilder", + srcs = ["//swift/swift-autobuilder"], prefix = "tools/" + codeql_platform, ) @@ -93,7 +93,7 @@ pkg_filegroup( ], }) + select({ "@platforms//os:macos": [ - ":xcode-autobuilder", + ":swift-autobuilder", ], "//conditions:default": [ ":diagnostics", @@ -130,7 +130,7 @@ generate_cmake( "//swift/logging/tests/assertion-diagnostics:assert-false", ] + select({ "@platforms//os:linux": ["//swift/tools/diagnostics:autobuilder-incompatible-os"], - "@platforms//os:macos": ["//swift/xcode-autobuilder"], + "@platforms//os:macos": ["//swift/swift-autobuilder"], }), visibility = ["//visibility:public"], ) diff --git a/swift/extractor/translators/ExprTranslator.cpp b/swift/extractor/translators/ExprTranslator.cpp index 22c0c7bf79777..3274c49675e6b 100644 --- a/swift/extractor/translators/ExprTranslator.cpp +++ b/swift/extractor/translators/ExprTranslator.cpp @@ -460,7 +460,17 @@ codeql::UnresolvedMemberExpr ExprTranslator::translateUnresolvedMemberExpr( codeql::SequenceExpr ExprTranslator::translateSequenceExpr(const swift::SequenceExpr& expr) { auto entry = createExprEntry(expr); - entry.elements = dispatcher.fetchRepeatedLabels(expr.getElements()); + // SequenceExpr represents a flat tree of expressions with elements at odd indices being the + // parents of the elements with even indices, so we only extract the "parent" elements here. In + // case there is a single child, we extract it as a parent. See + // https://github.com/github/codeql/pull/14119 and commit message for more details. + if (expr.getNumElements() == 1) { + entry.elements = dispatcher.fetchRepeatedLabels(expr.getElements()); + } else { + for (int i = 1; i < expr.getNumElements(); i += 2) { + entry.elements.emplace_back(dispatcher.fetchLabel(expr.getElement(i))); + } + } return entry; } diff --git a/swift/ql/consistency-queries/UnresolvedAstNodes.ql b/swift/ql/consistency-queries/UnresolvedAstNodes.ql new file mode 100644 index 0000000000000..d2369ab94366e --- /dev/null +++ b/swift/ql/consistency-queries/UnresolvedAstNodes.ql @@ -0,0 +1,5 @@ +import swift + +from AstNode n +where n.getAPrimaryQlClass().matches("Unresolved%") +select n diff --git a/swift/ql/lib/change-notes/2023-08-11-dictionary-flow.md b/swift/ql/lib/change-notes/2023-08-11-dictionary-flow.md new file mode 100644 index 0000000000000..6496777f9e5ee --- /dev/null +++ b/swift/ql/lib/change-notes/2023-08-11-dictionary-flow.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added flow steps through `Dictionary` keys and values. diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll index a84abfa2d7c5a..4d4f76d533d1c 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll @@ -9,6 +9,7 @@ private import codeql.swift.dataflow.FlowSummary as FlowSummary private import codeql.swift.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl private import codeql.swift.frameworks.StandardLibrary.PointerTypes private import codeql.swift.frameworks.StandardLibrary.Array +private import codeql.swift.frameworks.StandardLibrary.Dictionary /** Gets the callable in which this node occurs. */ DataFlowCallable nodeGetEnclosingCallable(Node n) { result = n.(NodeImpl).getEnclosingCallable() } @@ -114,6 +115,9 @@ private module Cached { any(ApplyExpr apply).getQualifier(), any(TupleElementExpr te).getSubExpr(), any(SubscriptExpr se).getBase() ]) + } or + TDictionarySubscriptNode(SubscriptExpr e) { + e.getBase().getType().getCanonicalType() instanceof CanonicalDictionaryType } private predicate localSsaFlowStepUseUse(Ssa::Definition def, Node nodeFrom, Node nodeTo) { @@ -296,6 +300,28 @@ import Cached /** Holds if `n` should be hidden from path explanations. */ predicate nodeIsHidden(Node n) { n instanceof FlowSummaryNode } +/** + * The intermediate node for a dictionary subscript operation `dict[key]`. In a write, this is used + * as the destination of the `storeStep`s that add `TupleContent`s and the source of the storeStep + * that adds `CollectionContent`. In a read, this is the destination of the `readStep` that pops + * `CollectionContent` and the source of the `readStep` that pops `TupleContent[0]` + */ +private class DictionarySubscriptNode extends NodeImpl, TDictionarySubscriptNode { + SubscriptExpr expr; + + DictionarySubscriptNode() { this = TDictionarySubscriptNode(expr) } + + override DataFlowCallable getEnclosingCallable() { + result.asSourceCallable() = expr.getEnclosingCallable() + } + + override string toStringImpl() { result = "DictionarySubscriptNode" } + + override Location getLocationImpl() { result = expr.getLocation() } + + SubscriptExpr getExpr() { result = expr } +} + private module ParameterNodes { abstract class ParameterNodeImpl extends NodeImpl { predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { none() } @@ -735,6 +761,32 @@ predicate storeStep(Node node1, ContentSet c, Node node2) { c instanceof OptionalSomeContentSet ) or + // assignment to a dictionary value via subscript operator, with intermediate step + // `dict[key] = value` + exists(AssignExpr assign, SubscriptExpr subscript | + subscript = assign.getDest() and + ( + subscript.getArgument(0).getExpr() = node1.asExpr() and + node2.(DictionarySubscriptNode).getExpr() = subscript and + c.isSingleton(any(Content::TupleContent tc | tc.getIndex() = 0)) + or + assign.getSource() = node1.asExpr() and + node2.(DictionarySubscriptNode).getExpr() = subscript and + c.isSingleton(any(Content::TupleContent tc | tc.getIndex() = 1)) + or + node1.(DictionarySubscriptNode).getExpr() = subscript and + node2.(PostUpdateNode).getPreUpdateNode().asExpr() = subscript.getBase() and + c.isSingleton(any(Content::CollectionContent cc)) + ) + ) + or + // creation of a dictionary `[key: value, ...]` + exists(DictionaryExpr dict | + node1.asExpr() = dict.getAnElement() and + node2.asExpr() = dict and + c.isSingleton(any(Content::CollectionContent cc)) + ) + or FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(FlowSummaryNode).getSummaryNode(), c, node2.(FlowSummaryNode).getSummaryNode()) } @@ -826,6 +878,17 @@ predicate readStep(Node node1, ContentSet c, Node node2) { ) ) or + // read of a dictionary value via subscript operator + exists(SubscriptExpr subscript | + subscript.getBase() = node1.asExpr() and + node2.(DictionarySubscriptNode).getExpr() = subscript and + c.isSingleton(any(Content::CollectionContent cc)) + or + subscript = node2.asExpr() and + node1.(DictionarySubscriptNode).getExpr() = subscript and + c.isSingleton(any(Content::TupleContent tc | tc.getIndex() = 1)) + ) + or FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c, node2.(FlowSummaryNode).getSummaryNode()) } @@ -836,7 +899,12 @@ predicate readStep(Node node1, ContentSet c, Node node2) { * in `x.f = newValue`. */ predicate clearsContent(Node n, ContentSet c) { - n = any(PostUpdateNode pun | storeStep(_, c, pun)).getPreUpdateNode() + n = any(PostUpdateNode pun | storeStep(_, c, pun)).getPreUpdateNode() and + ( + c.isSingleton(any(Content::FieldContent fc)) or + c.isSingleton(any(Content::TupleContent tc)) or + c.isSingleton(any(Content::EnumContent ec)) + ) } /** diff --git a/swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Array.qll b/swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Array.qll index 9acdead86c783..9d1fa9469bbbe 100644 --- a/swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Array.qll +++ b/swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Array.qll @@ -9,7 +9,7 @@ private import codeql.swift.dataflow.ExternalFlow * An instance of the `Array` type. */ class ArrayType extends Type { - ArrayType() { this.getName().matches("Array<%") or this.getName().matches("[%]") } + ArrayType() { this.getCanonicalType().getName().matches("Array<%") } } /** diff --git a/swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Dictionary.qll b/swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Dictionary.qll new file mode 100644 index 0000000000000..6ad2ba09e996a --- /dev/null +++ b/swift/ql/lib/codeql/swift/frameworks/StandardLibrary/Dictionary.qll @@ -0,0 +1,27 @@ +/** + * Provides models for the Swift `Dictionary` class. + */ + +import swift +private import codeql.swift.dataflow.ExternalFlow + +/** + * An instance of the `Dictionary` type. + */ +class CanonicalDictionaryType extends BoundGenericType { + CanonicalDictionaryType() { this.getName().matches("Dictionary<%") } +} + +/** + * A model for `Dictionary` and related class members that permit data flow. + */ +private class DictionarySummaries extends SummaryModelCsv { + override predicate row(string row) { + row = + [ + ";Dictionary;true;updateValue(_:forKey:);;;Argument[0];Argument[-1].CollectionElement.TupleElement[1];value", + ";Dictionary;true;updateValue(_:forKey:);;;Argument[1];Argument[-1].CollectionElement.TupleElement[0];value", + ";Dictionary;true;updateValue(_:forKey:);;;Argument[-1].CollectionElement.TupleElement[1];ReturnValue.OptionalSome;value" + ] + } +} diff --git a/swift/ql/src/diagnostics/internal/UnresolvedAstNodes.ql b/swift/ql/src/diagnostics/internal/UnresolvedAstNodes.ql new file mode 100644 index 0000000000000..97c14eb4ca761 --- /dev/null +++ b/swift/ql/src/diagnostics/internal/UnresolvedAstNodes.ql @@ -0,0 +1,11 @@ +/** + * @name Number of unresolved AST nodes + * @description Count all unresolved AST nodes. + * @kind metric + * @id swift/diagnostics/unresolved-ast-nodes + * @tags summary + */ + +import swift + +select count(AstNode n | n.getAPrimaryQlClass().matches("Unresolved%") | n) diff --git a/swift/ql/test/extractor-tests/errors/CONSISTENCY/UnresolvedAstNodes.expected b/swift/ql/test/extractor-tests/errors/CONSISTENCY/UnresolvedAstNodes.expected new file mode 100644 index 0000000000000..c88a81e5fc795 --- /dev/null +++ b/swift/ql/test/extractor-tests/errors/CONSISTENCY/UnresolvedAstNodes.expected @@ -0,0 +1,2 @@ +| file://:0:0:0:0 | ... .combine(_:) | +| unresolved.swift:5:1:5:14 | UnresolvedSpecializeExpr | diff --git a/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected b/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected index 29a61ed56f670..2b7940566e25c 100644 --- a/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected +++ b/swift/ql/test/library-tests/dataflow/dataflow/DataFlow.expected @@ -5,10 +5,12 @@ edges | file://:0:0:0:0 | self [v2, some:0] | file://:0:0:0:0 | .v2 [some:0] | | file://:0:0:0:0 | self [v2] | file://:0:0:0:0 | .v2 | | file://:0:0:0:0 | self [v3] | file://:0:0:0:0 | .v3 | +| file://:0:0:0:0 | self [v] | file://:0:0:0:0 | .v | | file://:0:0:0:0 | self [x, some:0] | file://:0:0:0:0 | .x [some:0] | | file://:0:0:0:0 | self [x] | file://:0:0:0:0 | .x | | file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [v2] | | file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [v3] | +| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [v] | | file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [x] | | file://:0:0:0:0 | value [some:0] | file://:0:0:0:0 | [post] self [v2, some:0] | | file://:0:0:0:0 | value [some:0] | file://:0:0:0:0 | [post] self [x, some:0] | @@ -438,9 +440,77 @@ edges | test.swift:766:29:766:29 | KeyPathComponent [x] | test.swift:766:13:766:29 | exit #keyPath(...) | | test.swift:767:15:767:15 | s2 [s, some:0, x] | test.swift:766:13:766:29 | enter #keyPath(...) [s, some:0, x] | | test.swift:767:15:767:15 | s2 [s, some:0, x] | test.swift:767:15:767:28 | \\...[...] | +| test.swift:774:5:774:5 | [post] dict1 [Collection element, Tuple element at index 1] | test.swift:776:15:776:15 | dict1 [Collection element, Tuple element at index 1] | +| test.swift:774:5:774:12 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:774:5:774:5 | [post] dict1 [Collection element, Tuple element at index 1] | +| test.swift:774:16:774:23 | call to source() | test.swift:774:5:774:12 | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:776:15:776:15 | dict1 [Collection element, Tuple element at index 1] | test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:776:15:776:22 | ...[...] | +| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:787:15:787:15 | dict3 [Collection element, Tuple element at index 1] | +| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:789:5:789:5 | dict3 [Collection element, Tuple element at index 1] | +| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] | +| test.swift:786:18:786:28 | (...) [Tuple element at index 1] | test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | +| test.swift:786:21:786:28 | call to source() | test.swift:786:18:786:28 | (...) [Tuple element at index 1] | +| test.swift:787:15:787:15 | dict3 [Collection element, Tuple element at index 1] | test.swift:787:15:787:22 | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:787:15:787:22 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:787:15:787:22 | ...[...] | +| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] | test.swift:791:15:791:15 | dict3 [Collection element, Tuple element at index 0] | +| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] | test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] | +| test.swift:789:5:789:5 | dict3 [Collection element, Tuple element at index 1] | test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 0] | test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] | +| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] | +| test.swift:789:11:789:18 | call to source() | test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 0] | +| test.swift:791:15:791:15 | dict3 [Collection element, Tuple element at index 0] | test.swift:791:15:791:35 | call to randomElement() [some:0, Tuple element at index 0] | +| test.swift:791:15:791:35 | call to randomElement() [some:0, Tuple element at index 0] | test.swift:791:15:791:36 | ...! [Tuple element at index 0] | +| test.swift:791:15:791:36 | ...! [Tuple element at index 0] | test.swift:791:15:791:38 | .0 | +| test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] | test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] | +| test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] | test.swift:792:15:792:36 | ...! [Tuple element at index 1] | +| test.swift:792:15:792:36 | ...! [Tuple element at index 1] | test.swift:792:15:792:38 | .1 | +| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:800:15:800:15 | dict4 [Collection element, Tuple element at index 1] | +| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:801:15:801:15 | dict4 [Collection element, Tuple element at index 1] | +| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] | +| test.swift:799:18:799:27 | (...) [Tuple element at index 1] | test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | +| test.swift:799:20:799:27 | call to source() | test.swift:799:18:799:27 | (...) [Tuple element at index 1] | +| test.swift:800:15:800:15 | [post] dict4 [Collection element, Tuple element at index 0] | test.swift:802:15:802:15 | dict4 [Collection element, Tuple element at index 0] | +| test.swift:800:15:800:15 | dict4 [Collection element, Tuple element at index 1] | test.swift:800:15:800:52 | call to updateValue(_:forKey:) [some:0] | +| test.swift:800:15:800:52 | call to updateValue(_:forKey:) [some:0] | test.swift:800:15:800:53 | ...! | +| test.swift:800:44:800:51 | call to source() | test.swift:800:15:800:15 | [post] dict4 [Collection element, Tuple element at index 0] | +| test.swift:801:15:801:15 | [post] dict4 [Collection element, Tuple element at index 1] | test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] | +| test.swift:801:15:801:15 | dict4 [Collection element, Tuple element at index 1] | test.swift:801:15:801:52 | call to updateValue(_:forKey:) [some:0] | +| test.swift:801:15:801:52 | call to updateValue(_:forKey:) [some:0] | test.swift:801:15:801:53 | ...! | +| test.swift:801:33:801:40 | call to source() | test.swift:801:15:801:15 | [post] dict4 [Collection element, Tuple element at index 1] | +| test.swift:802:15:802:15 | dict4 [Collection element, Tuple element at index 0] | test.swift:802:15:802:35 | call to randomElement() [some:0, Tuple element at index 0] | +| test.swift:802:15:802:35 | call to randomElement() [some:0, Tuple element at index 0] | test.swift:802:15:802:36 | ...! [Tuple element at index 0] | +| test.swift:802:15:802:36 | ...! [Tuple element at index 0] | test.swift:802:15:802:38 | .0 | +| test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] | test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] | +| test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] | test.swift:803:15:803:36 | ...! [Tuple element at index 1] | +| test.swift:803:15:803:36 | ...! [Tuple element at index 1] | test.swift:803:15:803:38 | .1 | +| test.swift:809:8:809:13 | v | test.swift:810:14:810:14 | v | +| test.swift:810:5:810:5 | [post] self [v] | test.swift:809:3:811:3 | self[return] [v] | +| test.swift:810:14:810:14 | v | test.swift:810:5:810:5 | [post] self [v] | +| test.swift:813:8:813:8 | self [v] | test.swift:813:31:813:31 | self [v] | +| test.swift:813:31:813:31 | self [v] | test.swift:813:31:813:31 | .v | +| test.swift:813:31:813:31 | self [v] | test.swift:815:7:815:7 | self [v] | +| test.swift:815:7:815:7 | self [v] | file://:0:0:0:0 | self [v] | +| test.swift:815:7:815:7 | value | file://:0:0:0:0 | value | +| test.swift:819:14:819:25 | call to S3.init(_:) [v] | test.swift:822:15:822:15 | s1 [v] | +| test.swift:819:14:819:25 | call to S3.init(_:) [v] | test.swift:824:15:824:15 | s1 [v] | +| test.swift:819:17:819:24 | call to source() | test.swift:809:8:809:13 | v | +| test.swift:819:17:819:24 | call to source() | test.swift:819:14:819:25 | call to S3.init(_:) [v] | +| test.swift:822:15:822:15 | s1 [v] | test.swift:815:7:815:7 | self [v] | +| test.swift:822:15:822:15 | s1 [v] | test.swift:822:15:822:18 | .v | +| test.swift:824:15:824:15 | s1 [v] | test.swift:813:8:813:8 | self [v] | +| test.swift:824:15:824:15 | s1 [v] | test.swift:824:15:824:23 | call to getv() | +| test.swift:828:5:828:5 | [post] s2 [v] | test.swift:831:15:831:15 | s2 [v] | +| test.swift:828:5:828:5 | [post] s2 [v] | test.swift:833:15:833:15 | s2 [v] | +| test.swift:828:12:828:19 | call to source() | test.swift:815:7:815:7 | value | +| test.swift:828:12:828:19 | call to source() | test.swift:828:5:828:5 | [post] s2 [v] | +| test.swift:831:15:831:15 | s2 [v] | test.swift:815:7:815:7 | self [v] | +| test.swift:831:15:831:15 | s2 [v] | test.swift:831:15:831:18 | .v | +| test.swift:833:15:833:15 | s2 [v] | test.swift:813:8:813:8 | self [v] | +| test.swift:833:15:833:15 | s2 [v] | test.swift:833:15:833:23 | call to getv() | nodes | file://:0:0:0:0 | .a [x] | semmle.label | .a [x] | | file://:0:0:0:0 | .str | semmle.label | .str | +| file://:0:0:0:0 | .v | semmle.label | .v | | file://:0:0:0:0 | .v2 | semmle.label | .v2 | | file://:0:0:0:0 | .v2 [some:0] | semmle.label | .v2 [some:0] | | file://:0:0:0:0 | .v3 | semmle.label | .v3 | @@ -450,6 +520,7 @@ nodes | file://:0:0:0:0 | [post] self [v2, some:0] | semmle.label | [post] self [v2, some:0] | | file://:0:0:0:0 | [post] self [v2] | semmle.label | [post] self [v2] | | file://:0:0:0:0 | [post] self [v3] | semmle.label | [post] self [v3] | +| file://:0:0:0:0 | [post] self [v] | semmle.label | [post] self [v] | | file://:0:0:0:0 | [post] self [x, some:0] | semmle.label | [post] self [x, some:0] | | file://:0:0:0:0 | [post] self [x] | semmle.label | [post] self [x] | | file://:0:0:0:0 | self [a, x] | semmle.label | self [a, x] | @@ -457,11 +528,13 @@ nodes | file://:0:0:0:0 | self [v2, some:0] | semmle.label | self [v2, some:0] | | file://:0:0:0:0 | self [v2] | semmle.label | self [v2] | | file://:0:0:0:0 | self [v3] | semmle.label | self [v3] | +| file://:0:0:0:0 | self [v] | semmle.label | self [v] | | file://:0:0:0:0 | self [x, some:0] | semmle.label | self [x, some:0] | | file://:0:0:0:0 | self [x] | semmle.label | self [x] | | file://:0:0:0:0 | value | semmle.label | value | | file://:0:0:0:0 | value | semmle.label | value | | file://:0:0:0:0 | value | semmle.label | value | +| file://:0:0:0:0 | value | semmle.label | value | | file://:0:0:0:0 | value [some:0] | semmle.label | value [some:0] | | file://:0:0:0:0 | value [some:0] | semmle.label | value [some:0] | | test.swift:6:19:6:26 | call to source() | semmle.label | call to source() | @@ -915,6 +988,74 @@ nodes | test.swift:766:29:766:29 | KeyPathComponent [x] | semmle.label | KeyPathComponent [x] | | test.swift:767:15:767:15 | s2 [s, some:0, x] | semmle.label | s2 [s, some:0, x] | | test.swift:767:15:767:28 | \\...[...] | semmle.label | \\...[...] | +| test.swift:774:5:774:5 | [post] dict1 [Collection element, Tuple element at index 1] | semmle.label | [post] dict1 [Collection element, Tuple element at index 1] | +| test.swift:774:5:774:12 | DictionarySubscriptNode [Tuple element at index 1] | semmle.label | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:774:16:774:23 | call to source() | semmle.label | call to source() | +| test.swift:776:15:776:15 | dict1 [Collection element, Tuple element at index 1] | semmle.label | dict1 [Collection element, Tuple element at index 1] | +| test.swift:776:15:776:22 | ...[...] | semmle.label | ...[...] | +| test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] | semmle.label | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | semmle.label | [...] [Collection element, Tuple element at index 1] | +| test.swift:786:18:786:28 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] | +| test.swift:786:21:786:28 | call to source() | semmle.label | call to source() | +| test.swift:787:15:787:15 | dict3 [Collection element, Tuple element at index 1] | semmle.label | dict3 [Collection element, Tuple element at index 1] | +| test.swift:787:15:787:22 | ...[...] | semmle.label | ...[...] | +| test.swift:787:15:787:22 | DictionarySubscriptNode [Tuple element at index 1] | semmle.label | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] | semmle.label | [post] dict3 [Collection element, Tuple element at index 0] | +| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] | semmle.label | [post] dict3 [Collection element, Tuple element at index 1] | +| test.swift:789:5:789:5 | dict3 [Collection element, Tuple element at index 1] | semmle.label | dict3 [Collection element, Tuple element at index 1] | +| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 0] | semmle.label | DictionarySubscriptNode [Tuple element at index 0] | +| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 1] | semmle.label | DictionarySubscriptNode [Tuple element at index 1] | +| test.swift:789:11:789:18 | call to source() | semmle.label | call to source() | +| test.swift:791:15:791:15 | dict3 [Collection element, Tuple element at index 0] | semmle.label | dict3 [Collection element, Tuple element at index 0] | +| test.swift:791:15:791:35 | call to randomElement() [some:0, Tuple element at index 0] | semmle.label | call to randomElement() [some:0, Tuple element at index 0] | +| test.swift:791:15:791:36 | ...! [Tuple element at index 0] | semmle.label | ...! [Tuple element at index 0] | +| test.swift:791:15:791:38 | .0 | semmle.label | .0 | +| test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] | semmle.label | dict3 [Collection element, Tuple element at index 1] | +| test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] | semmle.label | call to randomElement() [some:0, Tuple element at index 1] | +| test.swift:792:15:792:36 | ...! [Tuple element at index 1] | semmle.label | ...! [Tuple element at index 1] | +| test.swift:792:15:792:38 | .1 | semmle.label | .1 | +| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | semmle.label | [...] [Collection element, Tuple element at index 1] | +| test.swift:799:18:799:27 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] | +| test.swift:799:20:799:27 | call to source() | semmle.label | call to source() | +| test.swift:800:15:800:15 | [post] dict4 [Collection element, Tuple element at index 0] | semmle.label | [post] dict4 [Collection element, Tuple element at index 0] | +| test.swift:800:15:800:15 | dict4 [Collection element, Tuple element at index 1] | semmle.label | dict4 [Collection element, Tuple element at index 1] | +| test.swift:800:15:800:52 | call to updateValue(_:forKey:) [some:0] | semmle.label | call to updateValue(_:forKey:) [some:0] | +| test.swift:800:15:800:53 | ...! | semmle.label | ...! | +| test.swift:800:44:800:51 | call to source() | semmle.label | call to source() | +| test.swift:801:15:801:15 | [post] dict4 [Collection element, Tuple element at index 1] | semmle.label | [post] dict4 [Collection element, Tuple element at index 1] | +| test.swift:801:15:801:15 | dict4 [Collection element, Tuple element at index 1] | semmle.label | dict4 [Collection element, Tuple element at index 1] | +| test.swift:801:15:801:52 | call to updateValue(_:forKey:) [some:0] | semmle.label | call to updateValue(_:forKey:) [some:0] | +| test.swift:801:15:801:53 | ...! | semmle.label | ...! | +| test.swift:801:33:801:40 | call to source() | semmle.label | call to source() | +| test.swift:802:15:802:15 | dict4 [Collection element, Tuple element at index 0] | semmle.label | dict4 [Collection element, Tuple element at index 0] | +| test.swift:802:15:802:35 | call to randomElement() [some:0, Tuple element at index 0] | semmle.label | call to randomElement() [some:0, Tuple element at index 0] | +| test.swift:802:15:802:36 | ...! [Tuple element at index 0] | semmle.label | ...! [Tuple element at index 0] | +| test.swift:802:15:802:38 | .0 | semmle.label | .0 | +| test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] | semmle.label | dict4 [Collection element, Tuple element at index 1] | +| test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] | semmle.label | call to randomElement() [some:0, Tuple element at index 1] | +| test.swift:803:15:803:36 | ...! [Tuple element at index 1] | semmle.label | ...! [Tuple element at index 1] | +| test.swift:803:15:803:38 | .1 | semmle.label | .1 | +| test.swift:809:3:811:3 | self[return] [v] | semmle.label | self[return] [v] | +| test.swift:809:8:809:13 | v | semmle.label | v | +| test.swift:810:5:810:5 | [post] self [v] | semmle.label | [post] self [v] | +| test.swift:810:14:810:14 | v | semmle.label | v | +| test.swift:813:8:813:8 | self [v] | semmle.label | self [v] | +| test.swift:813:31:813:31 | .v | semmle.label | .v | +| test.swift:813:31:813:31 | self [v] | semmle.label | self [v] | +| test.swift:815:7:815:7 | self [v] | semmle.label | self [v] | +| test.swift:815:7:815:7 | value | semmle.label | value | +| test.swift:819:14:819:25 | call to S3.init(_:) [v] | semmle.label | call to S3.init(_:) [v] | +| test.swift:819:17:819:24 | call to source() | semmle.label | call to source() | +| test.swift:822:15:822:15 | s1 [v] | semmle.label | s1 [v] | +| test.swift:822:15:822:18 | .v | semmle.label | .v | +| test.swift:824:15:824:15 | s1 [v] | semmle.label | s1 [v] | +| test.swift:824:15:824:23 | call to getv() | semmle.label | call to getv() | +| test.swift:828:5:828:5 | [post] s2 [v] | semmle.label | [post] s2 [v] | +| test.swift:828:12:828:19 | call to source() | semmle.label | call to source() | +| test.swift:831:15:831:15 | s2 [v] | semmle.label | s2 [v] | +| test.swift:831:15:831:18 | .v | semmle.label | .v | +| test.swift:833:15:833:15 | s2 [v] | semmle.label | s2 [v] | +| test.swift:833:15:833:23 | call to getv() | semmle.label | call to getv() | subpaths | test.swift:75:22:75:22 | x | test.swift:65:16:65:28 | arg1 | test.swift:65:1:70:1 | arg2[return] | test.swift:75:32:75:32 | [post] y | | test.swift:114:19:114:19 | arg | test.swift:109:9:109:14 | arg | test.swift:110:12:110:12 | arg | test.swift:114:12:114:22 | call to ... | @@ -969,6 +1110,13 @@ subpaths | test.swift:764:18:764:25 | call to source() | test.swift:617:8:617:11 | x | test.swift:617:3:619:3 | self[return] [x] | test.swift:764:13:764:26 | call to S.init(x:) [x] | | test.swift:765:29:765:29 | s [some:0, x] | test.swift:655:8:655:12 | s [some:0, x] | test.swift:655:3:657:3 | self[return] [s, some:0, x] | test.swift:765:14:765:30 | call to S2_Optional.init(s:) [s, some:0, x] | | test.swift:767:15:767:15 | s2 [s, some:0, x] | test.swift:766:13:766:29 | enter #keyPath(...) [s, some:0, x] | test.swift:766:13:766:29 | exit #keyPath(...) | test.swift:767:15:767:28 | \\...[...] | +| test.swift:813:31:813:31 | self [v] | test.swift:815:7:815:7 | self [v] | file://:0:0:0:0 | .v | test.swift:813:31:813:31 | .v | +| test.swift:819:17:819:24 | call to source() | test.swift:809:8:809:13 | v | test.swift:809:3:811:3 | self[return] [v] | test.swift:819:14:819:25 | call to S3.init(_:) [v] | +| test.swift:822:15:822:15 | s1 [v] | test.swift:815:7:815:7 | self [v] | file://:0:0:0:0 | .v | test.swift:822:15:822:18 | .v | +| test.swift:824:15:824:15 | s1 [v] | test.swift:813:8:813:8 | self [v] | test.swift:813:31:813:31 | .v | test.swift:824:15:824:23 | call to getv() | +| test.swift:828:12:828:19 | call to source() | test.swift:815:7:815:7 | value | file://:0:0:0:0 | [post] self [v] | test.swift:828:5:828:5 | [post] s2 [v] | +| test.swift:831:15:831:15 | s2 [v] | test.swift:815:7:815:7 | self [v] | file://:0:0:0:0 | .v | test.swift:831:15:831:18 | .v | +| test.swift:833:15:833:15 | s2 [v] | test.swift:813:8:813:8 | self [v] | test.swift:813:31:813:31 | .v | test.swift:833:15:833:23 | call to getv() | #select | test.swift:7:15:7:15 | t1 | test.swift:6:19:6:26 | call to source() | test.swift:7:15:7:15 | t1 | result | | test.swift:9:15:9:15 | t1 | test.swift:6:19:6:26 | call to source() | test.swift:9:15:9:15 | t1 | result | @@ -1070,3 +1218,16 @@ subpaths | test.swift:756:15:756:21 | ...! | test.swift:746:14:746:21 | call to source() | test.swift:756:15:756:21 | ...! | result | | test.swift:757:15:757:19 | .v3 | test.swift:747:14:747:21 | call to source() | test.swift:757:15:757:19 | .v3 | result | | test.swift:767:15:767:28 | \\...[...] | test.swift:764:18:764:25 | call to source() | test.swift:767:15:767:28 | \\...[...] | result | +| test.swift:776:15:776:22 | ...[...] | test.swift:774:16:774:23 | call to source() | test.swift:776:15:776:22 | ...[...] | result | +| test.swift:787:15:787:22 | ...[...] | test.swift:786:21:786:28 | call to source() | test.swift:787:15:787:22 | ...[...] | result | +| test.swift:791:15:791:38 | .0 | test.swift:789:11:789:18 | call to source() | test.swift:791:15:791:38 | .0 | result | +| test.swift:792:15:792:38 | .1 | test.swift:786:21:786:28 | call to source() | test.swift:792:15:792:38 | .1 | result | +| test.swift:800:15:800:53 | ...! | test.swift:799:20:799:27 | call to source() | test.swift:800:15:800:53 | ...! | result | +| test.swift:801:15:801:53 | ...! | test.swift:799:20:799:27 | call to source() | test.swift:801:15:801:53 | ...! | result | +| test.swift:802:15:802:38 | .0 | test.swift:800:44:800:51 | call to source() | test.swift:802:15:802:38 | .0 | result | +| test.swift:803:15:803:38 | .1 | test.swift:799:20:799:27 | call to source() | test.swift:803:15:803:38 | .1 | result | +| test.swift:803:15:803:38 | .1 | test.swift:801:33:801:40 | call to source() | test.swift:803:15:803:38 | .1 | result | +| test.swift:822:15:822:18 | .v | test.swift:819:17:819:24 | call to source() | test.swift:822:15:822:18 | .v | result | +| test.swift:824:15:824:23 | call to getv() | test.swift:819:17:819:24 | call to source() | test.swift:824:15:824:23 | call to getv() | result | +| test.swift:831:15:831:18 | .v | test.swift:828:12:828:19 | call to source() | test.swift:831:15:831:18 | .v | result | +| test.swift:833:15:833:23 | call to getv() | test.swift:828:12:828:19 | call to source() | test.swift:833:15:833:23 | call to getv() | result | diff --git a/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected b/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected index 0f16b590c268e..cd895f686d035 100644 --- a/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected +++ b/swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected @@ -924,3 +924,98 @@ | test.swift:766:9:766:9 | f | test.swift:766:9:766:9 | SSA def(f) | | test.swift:766:13:766:29 | #keyPath(...) | test.swift:766:9:766:9 | f | | test.swift:766:13:766:29 | enter #keyPath(...) | test.swift:766:26:766:26 | KeyPathComponent | +| test.swift:771:9:771:9 | SSA def(dict1) | test.swift:772:15:772:15 | dict1 | +| test.swift:771:9:771:9 | dict1 | test.swift:771:9:771:9 | SSA def(dict1) | +| test.swift:771:17:771:31 | [...] | test.swift:771:9:771:9 | dict1 | +| test.swift:772:15:772:15 | &... | test.swift:774:5:774:5 | dict1 | +| test.swift:772:15:772:15 | [post] dict1 | test.swift:772:15:772:15 | &... | +| test.swift:772:15:772:15 | dict1 | test.swift:772:15:772:15 | &... | +| test.swift:774:5:774:5 | &... | test.swift:776:15:776:15 | dict1 | +| test.swift:774:5:774:5 | [post] dict1 | test.swift:774:5:774:5 | &... | +| test.swift:774:5:774:5 | dict1 | test.swift:774:5:774:5 | &... | +| test.swift:776:15:776:15 | [post] dict1 | test.swift:776:15:776:15 | &... | +| test.swift:776:15:776:15 | dict1 | test.swift:776:15:776:15 | &... | +| test.swift:778:9:778:9 | SSA def(dict2) | test.swift:779:15:779:15 | dict2 | +| test.swift:778:9:778:9 | dict2 | test.swift:778:9:778:9 | SSA def(dict2) | +| test.swift:778:17:778:29 | [...] | test.swift:778:9:778:9 | dict2 | +| test.swift:779:15:779:15 | &... | test.swift:781:25:781:25 | dict2 | +| test.swift:779:15:779:15 | [post] dict2 | test.swift:779:15:779:15 | &... | +| test.swift:779:15:779:15 | dict2 | test.swift:779:15:779:15 | &... | +| test.swift:781:10:781:10 | SSA def(key) | test.swift:782:19:782:19 | key | +| test.swift:781:10:781:10 | key | test.swift:781:10:781:10 | SSA def(key) | +| test.swift:781:15:781:15 | SSA def(value) | test.swift:783:19:783:19 | value | +| test.swift:781:15:781:15 | value | test.swift:781:15:781:15 | SSA def(value) | +| test.swift:786:9:786:9 | SSA def(dict3) | test.swift:787:15:787:15 | dict3 | +| test.swift:786:9:786:9 | dict3 | test.swift:786:9:786:9 | SSA def(dict3) | +| test.swift:786:17:786:29 | [...] | test.swift:786:9:786:9 | dict3 | +| test.swift:787:15:787:15 | &... | test.swift:789:5:789:5 | dict3 | +| test.swift:787:15:787:15 | [post] dict3 | test.swift:787:15:787:15 | &... | +| test.swift:787:15:787:15 | dict3 | test.swift:787:15:787:15 | &... | +| test.swift:789:5:789:5 | &... | test.swift:791:15:791:15 | dict3 | +| test.swift:789:5:789:5 | [post] dict3 | test.swift:789:5:789:5 | &... | +| test.swift:789:5:789:5 | dict3 | test.swift:789:5:789:5 | &... | +| test.swift:791:15:791:15 | [post] dict3 | test.swift:792:15:792:15 | dict3 | +| test.swift:791:15:791:15 | dict3 | test.swift:792:15:792:15 | dict3 | +| test.swift:791:15:791:35 | call to randomElement() | test.swift:791:15:791:36 | ...! | +| test.swift:792:15:792:15 | [post] dict3 | test.swift:794:25:794:25 | dict3 | +| test.swift:792:15:792:15 | dict3 | test.swift:794:25:794:25 | dict3 | +| test.swift:792:15:792:35 | call to randomElement() | test.swift:792:15:792:36 | ...! | +| test.swift:794:10:794:10 | SSA def(key) | test.swift:795:19:795:19 | key | +| test.swift:794:10:794:10 | key | test.swift:794:10:794:10 | SSA def(key) | +| test.swift:794:15:794:15 | SSA def(value) | test.swift:796:19:796:19 | value | +| test.swift:794:15:794:15 | value | test.swift:794:15:794:15 | SSA def(value) | +| test.swift:799:9:799:9 | SSA def(dict4) | test.swift:800:15:800:15 | dict4 | +| test.swift:799:9:799:9 | dict4 | test.swift:799:9:799:9 | SSA def(dict4) | +| test.swift:799:17:799:28 | [...] | test.swift:799:9:799:9 | dict4 | +| test.swift:800:15:800:15 | &... | test.swift:801:15:801:15 | dict4 | +| test.swift:800:15:800:15 | [post] dict4 | test.swift:800:15:800:15 | &... | +| test.swift:800:15:800:15 | dict4 | test.swift:800:15:800:15 | &... | +| test.swift:800:15:800:52 | call to updateValue(_:forKey:) | test.swift:800:15:800:53 | ...! | +| test.swift:801:15:801:15 | &... | test.swift:802:15:802:15 | dict4 | +| test.swift:801:15:801:15 | [post] dict4 | test.swift:801:15:801:15 | &... | +| test.swift:801:15:801:15 | dict4 | test.swift:801:15:801:15 | &... | +| test.swift:801:15:801:52 | call to updateValue(_:forKey:) | test.swift:801:15:801:53 | ...! | +| test.swift:802:15:802:15 | [post] dict4 | test.swift:803:15:803:15 | dict4 | +| test.swift:802:15:802:15 | dict4 | test.swift:803:15:803:15 | dict4 | +| test.swift:802:15:802:35 | call to randomElement() | test.swift:802:15:802:36 | ...! | +| test.swift:803:15:803:15 | [post] dict4 | test.swift:804:15:804:15 | dict4 | +| test.swift:803:15:803:15 | dict4 | test.swift:804:15:804:15 | dict4 | +| test.swift:803:15:803:35 | call to randomElement() | test.swift:803:15:803:36 | ...! | +| test.swift:804:15:804:15 | [post] dict4 | test.swift:805:15:805:15 | dict4 | +| test.swift:804:15:804:15 | dict4 | test.swift:805:15:805:15 | dict4 | +| test.swift:809:3:809:3 | SSA def(self) | test.swift:810:5:810:5 | self | +| test.swift:809:3:809:3 | self | test.swift:809:3:809:3 | SSA def(self) | +| test.swift:809:8:809:13 | SSA def(v) | test.swift:810:14:810:14 | v | +| test.swift:809:8:809:13 | v | test.swift:809:8:809:13 | SSA def(v) | +| test.swift:810:5:810:5 | [post] self | test.swift:809:3:811:3 | self[return] | +| test.swift:810:5:810:5 | self | test.swift:809:3:811:3 | self[return] | +| test.swift:813:8:813:8 | SSA def(self) | test.swift:813:31:813:31 | self | +| test.swift:813:8:813:8 | self | test.swift:813:8:813:8 | SSA def(self) | +| test.swift:813:31:813:31 | [post] self | test.swift:813:3:813:33 | self[return] | +| test.swift:813:31:813:31 | self | test.swift:813:3:813:33 | self[return] | +| test.swift:815:7:815:7 | self | test.swift:815:7:815:7 | SSA def(self) | +| test.swift:815:7:815:7 | self | test.swift:815:7:815:7 | SSA def(self) | +| test.swift:815:7:815:7 | self | test.swift:815:7:815:7 | SSA def(self) | +| test.swift:815:7:815:7 | value | test.swift:815:7:815:7 | SSA def(value) | +| test.swift:819:9:819:9 | SSA def(s1) | test.swift:822:15:822:15 | s1 | +| test.swift:819:9:819:9 | s1 | test.swift:819:9:819:9 | SSA def(s1) | +| test.swift:819:14:819:25 | call to S3.init(_:) | test.swift:819:9:819:9 | s1 | +| test.swift:820:9:820:9 | SSA def(s2) | test.swift:823:15:823:15 | s2 | +| test.swift:820:9:820:9 | s2 | test.swift:820:9:820:9 | SSA def(s2) | +| test.swift:820:14:820:18 | call to S3.init(_:) | test.swift:820:9:820:9 | s2 | +| test.swift:822:15:822:15 | [post] s1 | test.swift:824:15:824:15 | s1 | +| test.swift:822:15:822:15 | s1 | test.swift:824:15:824:15 | s1 | +| test.swift:823:15:823:15 | [post] s2 | test.swift:825:15:825:15 | s2 | +| test.swift:823:15:823:15 | s2 | test.swift:825:15:825:15 | s2 | +| test.swift:824:15:824:15 | [post] s1 | test.swift:827:5:827:5 | s1 | +| test.swift:824:15:824:15 | s1 | test.swift:827:5:827:5 | s1 | +| test.swift:825:15:825:15 | [post] s2 | test.swift:828:5:828:5 | s2 | +| test.swift:825:15:825:15 | s2 | test.swift:828:5:828:5 | s2 | +| test.swift:827:5:827:5 | [post] s1 | test.swift:830:15:830:15 | s1 | +| test.swift:827:5:827:5 | s1 | test.swift:830:15:830:15 | s1 | +| test.swift:828:5:828:5 | [post] s2 | test.swift:831:15:831:15 | s2 | +| test.swift:828:5:828:5 | s2 | test.swift:831:15:831:15 | s2 | +| test.swift:830:15:830:15 | [post] s1 | test.swift:832:15:832:15 | s1 | +| test.swift:830:15:830:15 | s1 | test.swift:832:15:832:15 | s1 | +| test.swift:831:15:831:15 | [post] s2 | test.swift:833:15:833:15 | s2 | +| test.swift:831:15:831:15 | s2 | test.swift:833:15:833:15 | s2 | diff --git a/swift/ql/test/library-tests/dataflow/dataflow/test.swift b/swift/ql/test/library-tests/dataflow/dataflow/test.swift index 5634719e9f965..6fa69f1ffcc26 100644 --- a/swift/ql/test/library-tests/dataflow/dataflow/test.swift +++ b/swift/ql/test/library-tests/dataflow/dataflow/test.swift @@ -766,3 +766,69 @@ func testOptionalKeyPathForce() { let f = \S2_Optional.s!.x sink(arg: s2[keyPath: f]) // $ flow=764 } + +func testDictionary() { + var dict1 = [1:2, 3:4, 5:6] + sink(arg: dict1[1]) + + dict1[1] = source() + + sink(arg: dict1[1]) // $ flow=774 + + var dict2 = [source(): 1] + sink(arg: dict2[1]) + + for (key, value) in dict2 { + sink(arg: key) // $ MISSING: flow=778 + sink(arg: value) + } + + var dict3 = [1: source()] + sink(arg: dict3[1]) // $ flow=786 + + dict3[source()] = 2 + + sink(arg: dict3.randomElement()!.0) // $ flow=789 + sink(arg: dict3.randomElement()!.1) // $ flow=786 + + for (key, value) in dict3 { + sink(arg: key) // $ MISSING: flow=789 + sink(arg: value) // $ MISSING: flow=786 + } + + var dict4 = [1:source()] + sink(arg: dict4.updateValue(1, forKey: source())!) // $ flow=799 + sink(arg: dict4.updateValue(source(), forKey: 2)!) // $ SPURIOUS: flow=799 + sink(arg: dict4.randomElement()!.0) // $ flow=800 + sink(arg: dict4.randomElement()!.1) // $ flow=799 flow=801 + sink(arg: dict4.keys.randomElement()) // $ MISSING: flow=800 + sink(arg: dict4.values.randomElement()) // $ MISSING: flow=799 flow=801 +} + +struct S3 { + init(_ v: Int) { + self.v = v + } + + func getv() -> Int { return v } + + var v: Int +} + +func testStruct() { + var s1 = S3(source()) + var s2 = S3(0) + + sink(arg: s1.v) // $ flow=819 + sink(arg: s2.v) + sink(arg: s1.getv()) // $ flow=819 + sink(arg: s2.getv()) + + s1.v = 0 + s2.v = source() + + sink(arg: s1.v) + sink(arg: s2.v) // $ flow=828 + sink(arg: s1.getv()) + sink(arg: s2.getv()) // $ flow=828 +} diff --git a/swift/ql/test/library-tests/dataflow/taint/libraries/int.swift b/swift/ql/test/library-tests/dataflow/taint/libraries/int.swift index f6d2dd40f3564..c4cd65dade5fc 100644 --- a/swift/ql/test/library-tests/dataflow/taint/libraries/int.swift +++ b/swift/ql/test/library-tests/dataflow/taint/libraries/int.swift @@ -161,7 +161,7 @@ func taintCollections(array: inout Array, contiguousArray: inout Contiguous dictionary[0] = source2() sink(arg: dictionary) - sink(arg: dictionary[0]!) // $ MISSING: tainted=162 + sink(arg: dictionary[0]!) // $ tainted=162 dictionary.withContiguousStorageIfAvailable({ buffer in sink(arg: buffer) diff --git a/swift/xcode-autobuilder/BUILD.bazel b/swift/swift-autobuilder/BUILD.bazel similarity index 92% rename from swift/xcode-autobuilder/BUILD.bazel rename to swift/swift-autobuilder/BUILD.bazel index 13d6e9818ff2f..951b0c243f2fc 100644 --- a/swift/xcode-autobuilder/BUILD.bazel +++ b/swift/swift-autobuilder/BUILD.bazel @@ -1,7 +1,7 @@ load("//swift:rules.bzl", "swift_cc_binary") swift_cc_binary( - name = "xcode-autobuilder", + name = "swift-autobuilder", srcs = glob([ "*.cpp", "*.h", diff --git a/swift/xcode-autobuilder/XcodeBuildRunner.cpp b/swift/swift-autobuilder/BuildRunner.cpp similarity index 97% rename from swift/xcode-autobuilder/XcodeBuildRunner.cpp rename to swift/swift-autobuilder/BuildRunner.cpp index 831d7e1f94ef4..cf0521bf789e3 100644 --- a/swift/xcode-autobuilder/XcodeBuildRunner.cpp +++ b/swift/swift-autobuilder/BuildRunner.cpp @@ -1,4 +1,4 @@ -#include "swift/xcode-autobuilder/XcodeBuildRunner.h" +#include "swift/swift-autobuilder/BuildRunner.h" #include #include @@ -6,7 +6,7 @@ #include "absl/strings/str_join.h" #include "swift/logging/SwiftLogging.h" -#include "swift/xcode-autobuilder/CustomizingBuildLink.h" +#include "swift/swift-autobuilder/CustomizingBuildLink.h" constexpr codeql::SwiftDiagnostic buildCommandFailed{ .id = "build-command-failed", diff --git a/swift/xcode-autobuilder/XcodeBuildRunner.h b/swift/swift-autobuilder/BuildRunner.h similarity index 70% rename from swift/xcode-autobuilder/XcodeBuildRunner.h rename to swift/swift-autobuilder/BuildRunner.h index ab86a00c76721..404e74d4319f3 100644 --- a/swift/xcode-autobuilder/XcodeBuildRunner.h +++ b/swift/swift-autobuilder/BuildRunner.h @@ -1,7 +1,7 @@ #pragma once -#include "swift/xcode-autobuilder/XcodeTarget.h" -#include "swift/xcode-autobuilder/XcodeProjectParser.h" +#include "swift/swift-autobuilder/XcodeTarget.h" +#include "swift/swift-autobuilder/ProjectParser.h" #include void installDependencies(const ProjectStructure& target, bool dryRun); diff --git a/swift/xcode-autobuilder/CFHelpers.cpp b/swift/swift-autobuilder/CFHelpers.cpp similarity index 95% rename from swift/xcode-autobuilder/CFHelpers.cpp rename to swift/swift-autobuilder/CFHelpers.cpp index 7ca19c7b2b2d5..aba37e982dcb0 100644 --- a/swift/xcode-autobuilder/CFHelpers.cpp +++ b/swift/swift-autobuilder/CFHelpers.cpp @@ -1,4 +1,4 @@ -#include "swift/xcode-autobuilder/CFHelpers.h" +#include "swift/swift-autobuilder/CFHelpers.h" #include diff --git a/swift/xcode-autobuilder/CFHelpers.h b/swift/swift-autobuilder/CFHelpers.h similarity index 100% rename from swift/xcode-autobuilder/CFHelpers.h rename to swift/swift-autobuilder/CFHelpers.h diff --git a/swift/xcode-autobuilder/CustomizingBuildLink.h b/swift/swift-autobuilder/CustomizingBuildLink.h similarity index 100% rename from swift/xcode-autobuilder/CustomizingBuildLink.h rename to swift/swift-autobuilder/CustomizingBuildLink.h diff --git a/swift/xcode-autobuilder/XcodeProjectParser.cpp b/swift/swift-autobuilder/ProjectParser.cpp similarity index 98% rename from swift/xcode-autobuilder/XcodeProjectParser.cpp rename to swift/swift-autobuilder/ProjectParser.cpp index 072bcaeeee273..fce29e5b70b72 100644 --- a/swift/xcode-autobuilder/XcodeProjectParser.cpp +++ b/swift/swift-autobuilder/ProjectParser.cpp @@ -1,4 +1,4 @@ -#include "swift/xcode-autobuilder/XcodeProjectParser.h" +#include "swift/swift-autobuilder/ProjectParser.h" #include #include @@ -8,8 +8,8 @@ #include #include -#include "swift/xcode-autobuilder/XcodeWorkspaceParser.h" -#include "swift/xcode-autobuilder/CFHelpers.h" +#include "swift/swift-autobuilder/XcodeWorkspaceParser.h" +#include "swift/swift-autobuilder/CFHelpers.h" namespace fs = std::filesystem; diff --git a/swift/xcode-autobuilder/XcodeProjectParser.h b/swift/swift-autobuilder/ProjectParser.h similarity index 90% rename from swift/xcode-autobuilder/XcodeProjectParser.h rename to swift/swift-autobuilder/ProjectParser.h index 56958f2b97e2c..d7e9cdb5eb9b2 100644 --- a/swift/xcode-autobuilder/XcodeProjectParser.h +++ b/swift/swift-autobuilder/ProjectParser.h @@ -1,6 +1,6 @@ #pragma once -#include "swift/xcode-autobuilder/XcodeTarget.h" +#include "swift/swift-autobuilder/XcodeTarget.h" #include #include #include diff --git a/swift/xcode-autobuilder/XcodeTarget.h b/swift/swift-autobuilder/XcodeTarget.h similarity index 100% rename from swift/xcode-autobuilder/XcodeTarget.h rename to swift/swift-autobuilder/XcodeTarget.h diff --git a/swift/xcode-autobuilder/XcodeWorkspaceParser.cpp b/swift/swift-autobuilder/XcodeWorkspaceParser.cpp similarity index 96% rename from swift/xcode-autobuilder/XcodeWorkspaceParser.cpp rename to swift/swift-autobuilder/XcodeWorkspaceParser.cpp index c315ba3831b4b..8fd9fee7a2e06 100644 --- a/swift/xcode-autobuilder/XcodeWorkspaceParser.cpp +++ b/swift/swift-autobuilder/XcodeWorkspaceParser.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "swift/xcode-autobuilder/XcodeWorkspaceParser.h" +#include "swift/swift-autobuilder/XcodeWorkspaceParser.h" /* Extracts FileRef locations from an XML of the following form: diff --git a/swift/xcode-autobuilder/XcodeWorkspaceParser.h b/swift/swift-autobuilder/XcodeWorkspaceParser.h similarity index 100% rename from swift/xcode-autobuilder/XcodeWorkspaceParser.h rename to swift/swift-autobuilder/XcodeWorkspaceParser.h diff --git a/swift/xcode-autobuilder/xcode-autobuilder.cpp b/swift/swift-autobuilder/swift-autobuilder.cpp similarity index 92% rename from swift/xcode-autobuilder/xcode-autobuilder.cpp rename to swift/swift-autobuilder/swift-autobuilder.cpp index fd73d30b0ad92..cbf7f217c75a7 100644 --- a/swift/xcode-autobuilder/xcode-autobuilder.cpp +++ b/swift/swift-autobuilder/swift-autobuilder.cpp @@ -1,11 +1,11 @@ #include #include #include -#include "swift/xcode-autobuilder/XcodeTarget.h" -#include "swift/xcode-autobuilder/XcodeBuildRunner.h" -#include "swift/xcode-autobuilder/XcodeProjectParser.h" +#include "swift/swift-autobuilder/XcodeTarget.h" +#include "swift/swift-autobuilder/BuildRunner.h" +#include "swift/swift-autobuilder/ProjectParser.h" #include "swift/logging/SwiftLogging.h" -#include "swift/xcode-autobuilder/CustomizingBuildLink.h" +#include "swift/swift-autobuilder/CustomizingBuildLink.h" static constexpr std::string_view uiTest = "com.apple.product-type.bundle.ui-testing"; static constexpr std::string_view unitTest = "com.apple.product-type.bundle.unit-test"; @@ -79,8 +79,9 @@ static bool autobuild(const CLIArgs& args) { "contain no Swift source files, or are tests."); return false; } else if (!structure.xcodeEncountered && swiftPackages.empty()) { - DIAGNOSE_ERROR(noProjectFound, - "`autobuild` detected neither an Xcode project or workspace, nor a Swift package"); + DIAGNOSE_ERROR( + noProjectFound, + "`autobuild` detected neither an Xcode project or workspace, nor a Swift package"); return false; } else if (!xcodeTargets.empty()) { LOG_INFO("Building Xcode target: {}", xcodeTargets.front()); diff --git a/swift/xcode-autobuilder/tests/.gitignore b/swift/swift-autobuilder/tests/.gitignore similarity index 100% rename from swift/xcode-autobuilder/tests/.gitignore rename to swift/swift-autobuilder/tests/.gitignore diff --git a/swift/xcode-autobuilder/tests/BUILD.bazel b/swift/swift-autobuilder/tests/BUILD.bazel similarity index 83% rename from swift/xcode-autobuilder/tests/BUILD.bazel rename to swift/swift-autobuilder/tests/BUILD.bazel index 3013dd47a10b1..f9a2b8eb17817 100644 --- a/swift/xcode-autobuilder/tests/BUILD.bazel +++ b/swift/swift-autobuilder/tests/BUILD.bazel @@ -4,11 +4,11 @@ size = "small", srcs = ["autobuild_tester.py"], args = [ - "$(location //swift/xcode-autobuilder)", + "$(location //swift/swift-autobuilder)", "$(location %s)" % test_dir, ], data = [ - "//swift/xcode-autobuilder", + "//swift/swift-autobuilder", test_dir, ] + glob([test_dir + "/**/*"]), main = "autobuild_tester.py", diff --git a/swift/xcode-autobuilder/tests/autobuild_tester.py b/swift/swift-autobuilder/tests/autobuild_tester.py similarity index 100% rename from swift/xcode-autobuilder/tests/autobuild_tester.py rename to swift/swift-autobuilder/tests/autobuild_tester.py diff --git a/swift/xcode-autobuilder/tests/hello-autobuilder/commands.expected b/swift/swift-autobuilder/tests/hello-autobuilder/commands.expected similarity index 100% rename from swift/xcode-autobuilder/tests/hello-autobuilder/commands.expected rename to swift/swift-autobuilder/tests/hello-autobuilder/commands.expected diff --git a/swift/xcode-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.pbxproj b/swift/swift-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.pbxproj similarity index 100% rename from swift/xcode-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.pbxproj rename to swift/swift-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.pbxproj diff --git a/swift/xcode-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/swift/swift-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from swift/xcode-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to swift/swift-autobuilder/tests/hello-autobuilder/hello-autobuilder.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/swift/xcode-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.pbxproj b/swift/swift-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.pbxproj similarity index 100% rename from swift/xcode-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.pbxproj rename to swift/swift-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.pbxproj diff --git a/swift/xcode-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/swift/swift-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from swift/xcode-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to swift/swift-autobuilder/tests/hello-targets-with-tests-suffix/Foo.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/swift/xcode-autobuilder/tests/hello-targets-with-tests-suffix/commands.expected b/swift/swift-autobuilder/tests/hello-targets-with-tests-suffix/commands.expected similarity index 100% rename from swift/xcode-autobuilder/tests/hello-targets-with-tests-suffix/commands.expected rename to swift/swift-autobuilder/tests/hello-targets-with-tests-suffix/commands.expected diff --git a/swift/xcode-autobuilder/tests/hello-tests/commands.expected b/swift/swift-autobuilder/tests/hello-tests/commands.expected similarity index 100% rename from swift/xcode-autobuilder/tests/hello-tests/commands.expected rename to swift/swift-autobuilder/tests/hello-tests/commands.expected diff --git a/swift/xcode-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.pbxproj b/swift/swift-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.pbxproj similarity index 100% rename from swift/xcode-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.pbxproj rename to swift/swift-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.pbxproj diff --git a/swift/xcode-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/swift/swift-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from swift/xcode-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to swift/swift-autobuilder/tests/hello-tests/hello-tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/swift/xcode-autobuilder/tests/hello-workspace/Hello.xcworkspace/contents.xcworkspacedata b/swift/swift-autobuilder/tests/hello-workspace/Hello.xcworkspace/contents.xcworkspacedata similarity index 100% rename from swift/xcode-autobuilder/tests/hello-workspace/Hello.xcworkspace/contents.xcworkspacedata rename to swift/swift-autobuilder/tests/hello-workspace/Hello.xcworkspace/contents.xcworkspacedata diff --git a/swift/xcode-autobuilder/tests/hello-workspace/commands.expected b/swift/swift-autobuilder/tests/hello-workspace/commands.expected similarity index 100% rename from swift/xcode-autobuilder/tests/hello-workspace/commands.expected rename to swift/swift-autobuilder/tests/hello-workspace/commands.expected diff --git a/swift/xcode-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.pbxproj b/swift/swift-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.pbxproj similarity index 100% rename from swift/xcode-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.pbxproj rename to swift/swift-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.pbxproj diff --git a/swift/xcode-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/swift/swift-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from swift/xcode-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to swift/swift-autobuilder/tests/hello-workspace/hello-workspace.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/swift/tools/autobuild.sh b/swift/tools/autobuild.sh index bd7ded9e4869f..89bf3c12435ba 100755 --- a/swift/tools/autobuild.sh +++ b/swift/tools/autobuild.sh @@ -3,7 +3,7 @@ if [[ "$OSTYPE" == "darwin"* ]]; then export CODEQL_SWIFT_CARTHAGE_EXEC=`which carthage` export CODEQL_SWIFT_POD_EXEC=`which pod` - exec "${CODEQL_EXTRACTOR_SWIFT_ROOT}/tools/${CODEQL_PLATFORM}/xcode-autobuilder" + exec "${CODEQL_EXTRACTOR_SWIFT_ROOT}/tools/${CODEQL_PLATFORM}/swift-autobuilder" else exec "${CODEQL_EXTRACTOR_SWIFT_ROOT}/tools/${CODEQL_PLATFORM}/autobuilder-incompatible-os" fi
  • OWASP: Insertion of Sensitive Information into Log File.